diff -Nru juce-6.1.5~ds0/BREAKING-CHANGES.txt juce-7.0.0~ds0/BREAKING-CHANGES.txt --- juce-6.1.5~ds0/BREAKING-CHANGES.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/BREAKING-CHANGES.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,6 +1,268 @@ JUCE breaking changes ===================== +Version 7.0.0 +============= + +Change +------ +AudioProcessor::getHostTimeNs() and AudioProcessor::setHostTimeNanos() have +been removed. + +Possible Issues +--------------- +Code that used these functions will no longer compile. + +Workaround +---------- +Set and get the system time corresponding to the current audio callback using +the new functions AudioPlayHead::PositionInfo::getHostTimeNs() and +AudioPlayHead::PositionInfo::setHostTimeNs(). + +Rationale +--------- +This change consolidates callback-related timing information into the +PositionInfo type, improving the consistency of the AudioProcessor and +AudioPlayHead APIs. + + +Change +------ +AudioPlayHead::getCurrentPosition() has been deprecated and replaced with +AudioPlayHead::getPosition(). + +Possible Issues +--------------- +Hosts that implemented custom playhead types may no longer compile. Plugins +that used host-provided timing information may trigger deprecation warnings +when building. + +Workaround +---------- +Classes that derive from AudioPlayHead must now override getPosition() instead +of getCurrentPosition(). Code that used to use the playhead's +CurrentPositionInfo must switch to using the new PositionInfo type. + +Rationale +--------- +Not all hosts and plugin formats are capable of providing the full complement +of timing information contained in the old CurrentPositionInfo class. +Previously, in the case that some information could not be provided, fallback +values would be used instead, but it was not possible for clients to distinguish +between "real" values set explicitly by the host, and "fallback" values set by +a plugin wrapper. The new PositionInfo type keeps track of which members have +been explicitly set, so clients can implement their own fallback behaviour. +The new PositionInfo type also includes a new "barCount" member, which is +currently only used by the LV2 host and client. + + +Change +------ +The optional JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS preprocessor +flag will now use a new Metal layer renderer when running on macOS 10.14 or +later. The minimum requirements for building macOS and iOS software are now +macOS 10.13.6 and Xcode 10.1. + +Possible Issues +--------------- +Previously enabling JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS had no +negative effect on performance. Now it may slow rendering down. + +Workaround +---------- +Disable JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS. + +Rationale +--------- +JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS has been ineffective when +running on macOS 10.13 or later. Enabling this flag, and hence using the new +Metal layer renderer when running on macOS 10.14, restores the previous +behaviour and fixes problems where Core Graphics will render much larger +regions than necessary. However, the new renderer will may be slower than the +recently introduced default of asynchronous Core Graphics rendering, depending +on the regions that Core Graphcis is redrawing. Whether +JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS improves or degrades +performance is specific to an application. + + +Change +------ +The optional JUCE_COREGRAPHICS_DRAW_ASYNC preprocessor flag has been removed +and asynchronous Core Graphics rendering is now the default. The helper +function setComponentAsyncLayerBackedViewDisabled has also been removed. + +Possible Issues +--------------- +Components that were previously using setComponentAsyncLayerBackedViewDisabled +to conditionally opt out of asynchronous Core Graphics rendering will no longer +be able to do so. + +Workaround +---------- +To opt out of asynchronous Core Graphics rendering the +windowRequiresSynchronousCoreGraphicsRendering ComponentPeer style flag can be +used when adding a component to the desktop. + +Rationale +--------- +Asynchronous Core Graphics rendering provides a substantial performance +benefit. Asynchronous rendering is a property of a Peer, rather than a +Component, so a Peer style flag to conditionally opt out of asynchronous +rendering is more appropriate. + + +Change +------ +Constructors of AudioParameterBool, AudioParameterChoice, AudioParameterFloat, +AudioParameterInt, and AudioProcessorParameterWithID have been deprecated and +replaced with new constructors taking an 'Attributes' argument. + +Possible Issues +--------------- +The compiler may issue a deprecation warning upon encountering usages of the +old constructors. + +Workaround +---------- +Update code to pass an 'Attributes' instance instead. Example usages of the new +constructors are given in the constructor documentation, and in the plugin +example projects. + +Rationale +--------- +Parameter types have many different properties. Setting a non-default property +using the old constructors required explicitly setting other normally-defaulted +properties, which was redundant. The new Attributes types allow non-default +properties to be set in isolation. + + +Version 6.1.6 +============= + +Change +------ +Unhandled mouse wheel and magnify events will now be passed to the closest +enclosing enabled ancestor component. + +Possible Issues +--------------- +Components that previously blocked mouse wheel events when in a disabled state +may no longer block the events as expected. + +Workaround +---------- +If a component should explicitly prevent events from propagating when disabled, +it should override mouseWheelMove() and mouseMagnify() to do nothing when the +component is disabled. + +Rationale +--------- +Previously, unhandled wheel events would be passed to the parent component, +but only if the parent was enabled. This meant that scrolling on a component +nested inside a disabled component would have no effect by default. This +behaviour was not intuitive. + + +Change +------ +The invalidPressure, invalidOrientation, invalidRotation, invalidTiltX and +invalidTiltY members of MouseInputSource have been deprecated. + +Possible Issues +--------------- +Deprecation warnings will be seen when compiling code which uses these members +and eventually builds will fail when they are later removed from the API. + +Workaround +---------- +Use the equivalent defaultPressure, defaultOrientation, defaultRotation, +defaultTiltX and defaultTiltY members of MouseInputSource. + +Rationale +--------- +The deprecated members represent valid values and the isPressureValid() etc. +functions return true when using them. This could be a source of confusion and +may be inviting programming errors. The new names are in line with the ongoing +practice of using these values to provide a neutral default in the absence of +actual OS provided values. + + +Change +------ +Plugin wrappers will no longer call processBlockBypassed() if the wrapped +AudioProcessor returns a parameter from getBypassParameter(). + +Possible Issues +--------------- +Plugins that used to depend on processBlockBypassed() being called may no +longer correctly enter a bypassed state. + +Workaround +---------- +AudioProcessors that implement getBypassParameter() must check the current +value of the bypass parameter on each call to processBlock(), and bypass +processing as appropriate. When switching between bypassed and non-bypassed +states, the plugin must use some sort of ramping or smoothing to avoid +discontinuities in the output. If the plugin introduces latency when not +bypassed, the plugin must delay its output when in bypassed mode so that the +overall latency does not change when enabling/disabling bypass. + +Rationale +--------- +The documentation for AudioProcessor::getBypassParameter() says +> if this method returns a non-null value, you should never call + processBlockBypassed but use the returned parameter to control the bypass + state instead. +Some plugin wrappers were not following this rule. After this change, the +behaviour of all plugin wrappers is consistent with the documented behaviour. + + +Change +------ +The ComponentPeer::getFrameSize() function has been deprecated on Linux. + +Possible Issues +--------------- +Deprecation warnings will be seen when compiling code which uses this function +and eventually builds will fail when it is later removed from the API. + +Workaround +---------- +Use the ComponentPeer::getFrameSizeIfPresent() function. The new function returns +an OptionalBorderSize object. Use operator bool() to determine if the border size +is valid, then access the value using operator*() only if it is. + +Rationale +--------- +The XWindow system cannot return a valid border size immediately after window +creation. ComponentPeer::getFrameSize() returns a default constructed +BorderSize instance in such cases that corresponds to a frame size of +zero. That however can be a valid value, and needs to be treated differently +from the situation when the frame size is not yet available. + + +Change +------ +The return type of XWindowSystem::getBorderSize() was changed to +ComponentPeer::OptionalBorderSize. + +Possible Issues +--------------- +User code that uses XWindowSystem::getBorderSize() will fail to build. + +Workaround +---------- +Use operator bool() to determine the validity of the new return value and +access the contained value using operator*(). + +Rationale +--------- +The XWindow system cannot immediately report the correct border size after +window creation. The underlying X11 calls will signal whether querying the +border size was successful, but there was no way to forward this information +through XWindowSystem::getBorderSize() until this change. + + Version 6.1.5 ============= diff -Nru juce-6.1.5~ds0/ChangeList.txt juce-7.0.0~ds0/ChangeList.txt --- juce-6.1.5~ds0/ChangeList.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/ChangeList.txt 2022-06-21 07:56:28.000000000 +0000 @@ -3,6 +3,23 @@ This file just lists the more notable headline features. For more detailed info about changes and bugfixes please see the git log and BREAKING-CHANGES.txt. +Version 7.0.0 + - Added Audio Random Access (ARA) SDK support + - Added support for authoring and hosting LV2 plug-ins + - Added a default renderer for macOS and iOS + - Added new macOS and iOS rendering options + - Added hardware synchronised drawing on Windows, macOS and iOS + - Updated the Android billing and file access APIs + - Revamped AudioPlayHead functionality + - Improved accessibility support + +Version 6.1.6 + - Improved the handling of AU multichannel layouts + - Added JUCE_NODISCARD to builder-patten functions + - Added recursion options to DirectoryIterator + - Unified the loading of OpenGL 3.2 core profiles + - Improved macOS full-screen behaviour with non-native titlebars + Version 6.1.5 - Improved the accessibility framework - Added handling of non-Latin virtual key codes on macOS diff -Nru juce-6.1.5~ds0/CMakeLists.txt juce-7.0.0~ds0/CMakeLists.txt --- juce-6.1.5~ds0/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -23,7 +23,7 @@ cmake_minimum_required(VERSION 3.15) -project(JUCE VERSION 6.1.5 LANGUAGES C CXX) +project(JUCE VERSION 7.0.0 LANGUAGES C CXX) include(CMakeDependentOption) @@ -62,7 +62,7 @@ set_directory_properties(PROPERTIES JUCE_COMPANY_NAME "JUCE" - JUCE_COMPANY_WEBSITE "juce.com" + JUCE_COMPANY_WEBSITE "https://juce.com" JUCE_COMPANY_EMAIL "info@juce.com" JUCE_COMPANY_COPYRIGHT "Copyright (c) 2020 - Raw Material Software Limited") @@ -76,10 +76,11 @@ add_subdirectory(extras/Build) -# If you want to build the JUCE examples with VST2/AAX support, you'll need to make the VST2/AAX -# headers visible to the juce_audio_processors module. You can either set the paths on the command -# line, (e.g. -DJUCE_GLOBAL_AAX_SDK_PATH=/path/to/sdk) if you're just building the JUCE examples, or -# you can call the `juce_set_*_sdk_path` functions in your own CMakeLists after importing JUCE. +# If you want to build the JUCE examples with VST2/AAX/ARA support, you'll need to make the +# VST2/AAX/ARA headers visible to the juce_audio_processors module. You can either set the paths on +# the command line, (e.g. -DJUCE_GLOBAL_AAX_SDK_PATH=/path/to/sdk) if you're just building the JUCE +# examples, or you can call the `juce_set_*_sdk_path` functions in your own CMakeLists after +# importing JUCE. if(JUCE_GLOBAL_AAX_SDK_PATH) juce_set_aax_sdk_path("${JUCE_GLOBAL_AAX_SDK_PATH}") @@ -89,6 +90,13 @@ juce_set_vst2_sdk_path("${JUCE_GLOBAL_VST2_SDK_PATH}") endif() +# The ARA_SDK path should point to the "Umbrella installer" ARA_SDK directory. +# The directory can be obtained by recursively cloning https://github.com/Celemony/ARA_SDK and +# checking out the tag releases/2.1.0. +if(JUCE_GLOBAL_ARA_SDK_PATH) + juce_set_ara_sdk_path("${JUCE_GLOBAL_ARA_SDK_PATH}") +endif() + # We don't build anything other than the juceaide by default, because we want to keep configuration # speedy and the number of targets low. If you want to add targets for the extra projects and # example PIPs (there's a lot of them!), specify -DJUCE_BUILD_EXAMPLES=ON and/or @@ -141,16 +149,21 @@ install(FILES "${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake" "${JUCE_BINARY_DIR}/JUCEConfig.cmake" - "${JUCE_CMAKE_UTILS_DIR}/JUCEHelperTargets.cmake" "${JUCE_CMAKE_UTILS_DIR}/JUCECheckAtomic.cmake" + "${JUCE_CMAKE_UTILS_DIR}/JUCEHelperTargets.cmake" "${JUCE_CMAKE_UTILS_DIR}/JUCEModuleSupport.cmake" "${JUCE_CMAKE_UTILS_DIR}/JUCEUtils.cmake" + "${JUCE_CMAKE_UTILS_DIR}/JuceLV2Defines.h.in" "${JUCE_CMAKE_UTILS_DIR}/LaunchScreen.storyboard" "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in" + "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessorWithARA.cpp.in" "${JUCE_CMAKE_UTILS_DIR}/PIPComponent.cpp.in" "${JUCE_CMAKE_UTILS_DIR}/PIPConsole.cpp.in" "${JUCE_CMAKE_UTILS_DIR}/RecentFilesMenuTemplate.nib" "${JUCE_CMAKE_UTILS_DIR}/UnityPluginGUIScript.cs.in" + "${JUCE_CMAKE_UTILS_DIR}/checkBundleSigning.cmake" "${JUCE_CMAKE_UTILS_DIR}/copyDir.cmake" "${JUCE_CMAKE_UTILS_DIR}/juce_runtime_arch_detection.cpp" DESTINATION "${JUCE_INSTALL_DESTINATION}") + +install(EXPORT LV2_HELPER NAMESPACE juce:: DESTINATION "${JUCE_INSTALL_DESTINATION}") diff -Nru juce-6.1.5~ds0/debian/changelog juce-7.0.0~ds0/debian/changelog --- juce-6.1.5~ds0/debian/changelog 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/changelog 2022-06-28 06:25:52.000000000 +0000 @@ -1,5 +1,29 @@ -juce (6.1.5~ds0-1) unstable; urgency=medium +juce (7.0.0~ds0-1) unstable; urgency=medium + + * New upstream version 7.0.0~ds0 + (Closes: #1012954) + + Refresh patches + + Drop patches applied upstream + * Upstream now natively supports LV2 + + Drop additional LV2-files, now that JUCE supports LV2 natively + + Build and install the juce_lv2_helper + * Don't try to install non-existant paths + * Update d/copyright + + Drop unused AGPL text + + Regenerate d/copyright_hints + * Bump standards version to 4.6.1 + + -- IOhannes m zmölnig (Debian/GNU) Tue, 28 Jun 2022 08:25:52 +0200 + +juce (6.1.6~ds0-1) unstable; urgency=medium + * New upstream version 6.1.6~ds0 + + Refresh patches + * Regenerate d/copyright_hints + + -- IOhannes m zmölnig (Debian/GNU) Fri, 18 Mar 2022 18:31:11 +0100 + +juce (6.1.5~ds0-1) unstable; urgency=medium * New upstream version 6.1.5~ds0 + Refresh patches * Update dates in d/copyright diff -Nru juce-6.1.5~ds0/debian/control juce-7.0.0~ds0/debian/control --- juce-6.1.5~ds0/debian/control 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/control 2022-06-28 06:25:52.000000000 +0000 @@ -23,7 +23,7 @@ Build-Depends-Indep: doxygen, graphviz, -Standards-Version: 4.6.0 +Standards-Version: 4.6.1 Rules-Requires-Root: no Homepage: https://www.juce.com Vcs-Git: https://salsa.debian.org/multimedia-team/juce.git diff -Nru juce-6.1.5~ds0/debian/copyright juce-7.0.0~ds0/debian/copyright --- juce-6.1.5~ds0/debian/copyright 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/copyright 2022-06-28 06:25:52.000000000 +0000 @@ -41,6 +41,19 @@ Copyright: 2018-2021, Steinberg Media Technologies GmbH License: BSD-3-clause +Files: modules/juce_audio_processors/format_types/LV2_SDK/*/* +Copyright: 2007-2021, David Robillard +License: ISC + +Files: modules/juce_audio_processors/format_types/LV2_SDK/lv2/* +Copyright: 2006-2022, Steve Harris, David Robillard +License: ISC + +Files: modules/juce_audio_processors/format_types/pslextensions/* +Copyright: n/a +License: public-domain + Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. + Files: ex*/*/Builds/Android/gradle/wrapper/* extras/Projucer/Source/BinaryData/gradle/* @@ -61,23 +74,6 @@ 2019, Olivier Humbert License: GPL-2+ or GPL-3 -Files: debian/extra/juce_audio_plugin_client/* debian/extra/lv2-ttl-generator/lv2_ttl_generator.c -Copyright: Filipe Coelho -License: GPL-2+ or AGPL-3 - -Files: debian/extra/juce_audio_plugin_client/LV2/includes/lv2_external_ui.h -Copyright: NONE -License: public-domain -License-Grant: - This work is in public domain. - . - This file is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - . - If you have questions, contact Filipe Coelho (aka falkTX) - or ask in #lad channel, FreeNode IRC network. - License: GPL-3 This program is free software: you can redistribute it and/or modify @@ -133,672 +129,6 @@ misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. -License: AGPL-3 - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - . - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies of this - license document, but changing it is not allowed. - . - Preamble - . - The GNU Affero General Public License is a free, copyleft license for - software and other kinds of works, specifically designed to ensure - cooperation with the community in the case of network server software. - . - The licenses for most software and other practical works are designed - to take away your freedom to share and change the works. By contrast, - our General Public Licenses are intended to guarantee your freedom to - share and change all versions of a program--to make sure it remains - free software for all its users. - . - When we speak of free software, we are referring to freedom, not price. - Our General Public Licenses are designed to make sure that you have the - freedom to distribute copies of free software (and charge for them if - you wish), that you receive source code or can get it if you want it, - that you can change the software or use pieces of it in new free - programs, and that you know you can do these things. - . - Developers that use our General Public Licenses protect your rights - with two steps: (1) assert copyright on the software, and (2) offer you - this License which gives you legal permission to copy, distribute - and/or modify the software. - . - A secondary benefit of defending all users' freedom is that - improvements made in alternate versions of the program, if they receive - widespread use, become available for other developers to incorporate. - Many developers of free software are heartened and encouraged by the - resulting cooperation. However, in the case of software used on - network servers, this result may fail to come about. The GNU General - Public License permits making a modified version and letting the public - access it on a server without ever releasing its source code to the - public. - . - The GNU Affero General Public License is designed specifically to - ensure that, in such cases, the modified source code becomes available - to the community. It requires the operator of a network server to - provide the source code of the modified version running there to the - users of that server. Therefore, public use of a modified version, on - a publicly accessible server, gives the public access to the source - code of the modified version. - . - An older license, called the Affero General Public License and - published by Affero, was designed to accomplish similar goals. This is - a different license, not a version of the Affero GPL, but Affero has - released a new version of the Affero GPL which permits relicensing - under this license. - . - The precise terms and conditions for copying, distribution and - modification follow. - . - TERMS AND CONDITIONS - . - 0. Definitions. - . - "This License" refers to version 3 of the GNU Affero General Public - License. - . - "Copyright" also means copyright-like laws that apply to other kinds of - works, such as semiconductor masks. - . - "The Program" refers to any copyrightable work licensed under this - License. Each licensee is addressed as "you". "Licensees" and - "recipients" may be individuals or organizations. - . - To "modify" a work means to copy from or adapt all or part of the work - in a fashion requiring copyright permission, other than the making of - an exact copy. The resulting work is called a "modified version" of - the earlier work or a work "based on" the earlier work. - . - A "covered work" means either the unmodified Program or a work based on - the Program. - . - To "propagate" a work means to do anything with it that, without - permission, would make you directly or secondarily liable for - infringement under applicable copyright law, except executing it on a - computer or modifying a private copy. Propagation includes copying, - distribution (with or without modification), making available to the - public, and in some countries other activities as well. - . - To "convey" a work means any kind of propagation that enables other - parties to make or receive copies. Mere interaction with a user - through a computer network, with no transfer of a copy, is not - conveying. - . - An interactive user interface displays "Appropriate Legal Notices" to - the extent that it includes a convenient and prominently visible - feature that (1) displays an appropriate copyright notice, and (2) - tells the user that there is no warranty for the work (except to the - extent that warranties are provided), that licensees may convey the - work under this License, and how to view a copy of this License. If the - interface presents a list of user commands or options, such as a menu, - a prominent item in the list meets this criterion. - . - 1. Source Code. - . - The "source code" for a work means the preferred form of the work for - making modifications to it. "Object code" means any non-source form of - a work. - . - A "Standard Interface" means an interface that either is an official - standard defined by a recognized standards body, or, in the case of - interfaces specified for a particular programming language, one that is - widely used among developers working in that language. - . - The "System Libraries" of an executable work include anything, other - than the work as a whole, that (a) is included in the normal form of - packaging a Major Component, but which is not part of that Major - Component, and (b) serves only to enable use of the work with that - Major Component, or to implement a Standard Interface for which an - implementation is available to the public in source code form. A "Major - Component", in this context, means a major essential component (kernel, - window system, and so on) of the specific operating system (if any) on - which the executable work runs, or a compiler used to produce the work, - or an object code interpreter used to run it. - . - The "Corresponding Source" for a work in object code form means all the - source code needed to generate, install, and (for an executable work) - run the object code and to modify the work, including scripts to - control those activities. However, it does not include the work's - System Libraries, or general-purpose tools or generally available free - programs which are used unmodified in performing those activities but - which are not part of the work. For example, Corresponding Source - includes interface definition files associated with source files for - the work, and the source code for shared libraries and dynamically - linked subprograms that the work is specifically designed to require, - such as by intimate data communication or control flow between those - subprograms and other parts of the work. - . - The Corresponding Source need not include anything that users can - regenerate automatically from other parts of the Corresponding Source. - . - The Corresponding Source for a work in source code form is that same - work. - . - 2. Basic Permissions. - . - All rights granted under this License are granted for the term of - copyright on the Program, and are irrevocable provided the stated - conditions are met. This License explicitly affirms your unlimited - permission to run the unmodified Program. The output from running a - covered work is covered by this License only if the output, given its - content, constitutes a covered work. This License acknowledges your - rights of fair use or other equivalent, as provided by copyright law. - . - You may make, run and propagate covered works that you do not convey, - without conditions so long as your license otherwise remains in force. - You may convey covered works to others for the sole purpose of having - them make modifications exclusively for you, or provide you with - facilities for running those works, provided that you comply with the - terms of this License in conveying all material for which you do not - control copyright. Those thus making or running the covered works for - you must do so exclusively on your behalf, under your direction and - control, on terms that prohibit them from making any copies of your - copyrighted material outside their relationship with you. - . - Conveying under any other circumstances is permitted solely under the - conditions stated below. Sublicensing is not allowed; section 10 makes - it unnecessary. - . - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - . - No covered work shall be deemed part of an effective technological - measure under any applicable law fulfilling obligations under article - 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar - laws prohibiting or restricting circumvention of such measures. - . - When you convey a covered work, you waive any legal power to forbid - circumvention of technological measures to the extent such - circumvention is effected by exercising rights under this License with - respect to the covered work, and you disclaim any intention to limit - operation or modification of the work as a means of enforcing, against - the work's users, your or third parties' legal rights to forbid - circumvention of technological measures. - . - 4. Conveying Verbatim Copies. - . - You may convey verbatim copies of the Program's source code as you - receive it, in any medium, provided that you conspicuously and - appropriately publish on each copy an appropriate copyright notice; - keep intact all notices stating that this License and any - non-permissive terms added in accord with section 7 apply to the code; - keep intact all notices of the absence of any warranty; and give all - recipients a copy of this License along with the Program. - . - You may charge any price or no price for each copy that you convey, and - you may offer support or warranty protection for a fee. - . - 5. Conveying Modified Source Versions. - . - You may convey a work based on the Program, or the modifications to - produce it from the Program, in the form of source code under the terms - of section 4, provided that you also meet all of these conditions: - . - a) The work must carry prominent notices stating that you modified it, - and giving a relevant date. - . - b) The work must carry prominent notices stating that it is released - under this License and any conditions added under section 7. This - requirement modifies the requirement in section 4 to "keep intact all - notices". - . - c) You must license the entire work, as a whole, under this License to - anyone who comes into possession of a copy. This License will - therefore apply, along with any applicable section 7 additional terms, - to the whole of the work, and all its parts, regardless of how they are - packaged. This License gives no permission to license the work in any - other way, but it does not invalidate such permission if you have - separately received it. - . - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your work - need not make them do so. - . - A compilation of a covered work with other separate and independent - works, which are not by their nature extensions of the covered work, - and which are not combined with it such as to form a larger program, in - or on a volume of a storage or distribution medium, is called an - "aggregate" if the compilation and its resulting copyright are not used - to limit the access or legal rights of the compilation's users beyond - what the individual works permit. Inclusion of a covered work in an - aggregate does not cause this License to apply to the other parts of - the aggregate. - . - 6. Conveying Non-Source Forms. - . - You may convey a covered work in object code form under the terms of - sections 4 and 5, provided that you also convey the machine-readable - Corresponding Source under the terms of this License, in one of these - ways: - . - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium customarily - used for software interchange. - . - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a written - offer, valid for at least three years and valid for as long as you - offer spare parts or customer support for that product model, to give - anyone who possesses the object code either (1) a copy of the - Corresponding Source for all the software in the product that is - covered by this License, on a durable physical medium customarily used - for software interchange, for a price no more than your reasonable cost - of physically performing this conveying of source, or (2) access to - copy the Corresponding Source from a network server at no charge. - . - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This alternative is - allowed only occasionally and noncommercially, and only if you received - the object code with such an offer, in accord with subsection 6b. - . - d) Convey the object code by offering access from a designated place - (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to copy - the object code is a network server, the Corresponding Source may be on - a different server (operated by you or a third party) that supports - equivalent copying facilities, provided you maintain clear directions - next to the object code saying where to find the Corresponding Source. - Regardless of what server hosts the Corresponding Source, you remain - obligated to ensure that it is available for as long as needed to - satisfy these requirements. - . - e) Convey the object code using peer-to-peer transmission, provided you - inform other peers where the object code and Corresponding Source of - the work are being offered to the general public at no charge under - subsection 6d. - . - A separable portion of the object code, whose source code is excluded - from the Corresponding Source as a System Library, need not be included - in conveying the object code work. - . - A "User Product" is either (1) a "consumer product", which means any - tangible personal property which is normally used for personal, family, - or household purposes, or (2) anything designed or sold for - incorporation into a dwelling. In determining whether a product is a - consumer product, doubtful cases shall be resolved in favor of - coverage. For a particular product received by a particular user, - "normally used" refers to a typical or common use of that class of - product, regardless of the status of the particular user or of the way - in which the particular user actually uses, or expects or is expected - to use, the product. A product is a consumer product regardless of - whether the product has substantial commercial, industrial or - non-consumer uses, unless such uses represent the only significant mode - of use of the product. - . - "Installation Information" for a User Product means any methods, - procedures, authorization keys, or other information required to - install and execute modified versions of a covered work in that User - Product from a modified version of its Corresponding Source. The - information must suffice to ensure that the continued functioning of - the modified object code is in no case prevented or interfered with - solely because modification has been made. - . - If you convey an object code work under this section in, or with, or - specifically for use in, a User Product, and the conveying occurs as - part of a transaction in which the right of possession and use of the - User Product is transferred to the recipient in perpetuity or for a - fixed term (regardless of how the transaction is characterized), the - Corresponding Source conveyed under this section must be accompanied by - the Installation Information. But this requirement does not apply if - neither you nor any third party retains the ability to install modified - object code on the User Product (for example, the work has been - installed in ROM). - . - The requirement to provide Installation Information does not include a - requirement to continue to provide support service, warranty, or - updates for a work that has been modified or installed by the - recipient, or for the User Product in which it has been modified or - installed. Access to a network may be denied when the modification - itself materially and adversely affects the operation of the network or - violates the rules and protocols for communication across the network. - . - Corresponding Source conveyed, and Installation Information provided, - in accord with this section must be in a format that is publicly - documented (and with an implementation available to the public in - source code form), and must require no special password or key for - unpacking, reading or copying. - . - 7. Additional Terms. - . - "Additional permissions" are terms that supplement the terms of this - License by making exceptions from one or more of its conditions. - Additional permissions that are applicable to the entire Program shall - be treated as though they were included in this License, to the extent - that they are valid under applicable law. If additional permissions - apply only to part of the Program, that part may be used separately - under those permissions, but the entire Program remains governed by - this License without regard to the additional permissions. - . - When you convey a copy of a covered work, you may at your option remove - any additional permissions from that copy, or from any part of it. - (Additional permissions may be written to require their own removal in - certain cases when you modify the work.) You may place additional - permissions on material, added by you to a covered work, for which you - have or can give appropriate copyright permission. - . - Notwithstanding any other provision of this License, for material you - add to a covered work, you may (if authorized by the copyright holders - of that material) supplement the terms of this License with terms: - . - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - . - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - . - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - . - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - . - e) Declining to grant rights under trademark law for use of some trade - names, trademarks, or service marks; or - . - f) Requiring indemnification of licensors and authors of that material - by anyone who conveys the material (or modified versions of it) with - contractual assumptions of liability to the recipient, for any - liability that these contractual assumptions directly impose on those - licensors and authors. - . - All other non-permissive additional terms are considered "further - restrictions" within the meaning of section 10. If the Program as you - received it, or any part of it, contains a notice stating that it is - governed by this License along with a term that is a further - restriction, you may remove that term. If a license document contains - a further restriction but permits relicensing or conveying under this - License, you may add to a covered work material governed by the terms - of that license document, provided that the further restriction does - not survive such relicensing or conveying. - . - If you add terms to a covered work in accord with this section, you - must place, in the relevant source files, a statement of the additional - terms that apply to those files, or a notice indicating where to find - the applicable terms. - . - Additional terms, permissive or non-permissive, may be stated in the - form of a separately written license, or stated as exceptions; the - above requirements apply either way. - . - 8. Termination. - . - You may not propagate or modify a covered work except as expressly - provided under this License. Any attempt otherwise to propagate or - modify it is void, and will automatically terminate your rights under - this License (including any patent licenses granted under the third - paragraph of section 11). - . - However, if you cease all violation of this License, then your license - from a particular copyright holder is reinstated (a) provisionally, - unless and until the copyright holder explicitly and finally terminates - your license, and (b) permanently, if the copyright holder fails to - notify you of the violation by some reasonable means prior to 60 days - after the cessation. - . - Moreover, your license from a particular copyright holder is reinstated - permanently if the copyright holder notifies you of the violation by - some reasonable means, this is the first time you have received notice - of violation of this License (for any work) from that copyright holder, - and you cure the violation prior to 30 days after your receipt of the - notice. - . - Termination of your rights under this section does not terminate the - licenses of parties who have received copies or rights from you under - this License. If your rights have been terminated and not permanently - reinstated, you do not qualify to receive new licenses for the same - material under section 10. - . - 9. Acceptance Not Required for Having Copies. - . - You are not required to accept this License in order to receive or run - a copy of the Program. Ancillary propagation of a covered work - occurring solely as a consequence of using peer-to-peer transmission to - receive a copy likewise does not require acceptance. However, nothing - other than this License grants you permission to propagate or modify - any covered work. These actions infringe copyright if you do not - accept this License. Therefore, by modifying or propagating a covered - work, you indicate your acceptance of this License to do so. - . - 10. Automatic Licensing of Downstream Recipients. - . - Each time you convey a covered work, the recipient automatically - receives a license from the original licensors, to run, modify and - propagate that work, subject to this License. You are not responsible - for enforcing compliance by third parties with this License. - . - An "entity transaction" is a transaction transferring control of an - organization, or substantially all assets of one, or subdividing an - organization, or merging organizations. If propagation of a covered - work results from an entity transaction, each party to that transaction - who receives a copy of the work also receives whatever licenses to the - work the party's predecessor in interest had or could give under the - previous paragraph, plus a right to possession of the Corresponding - Source of the work from the predecessor in interest, if the predecessor - has it or can get it with reasonable efforts. - . - You may not impose any further restrictions on the exercise of the - rights granted or affirmed under this License. For example, you may - not impose a license fee, royalty, or other charge for exercise of - rights granted under this License, and you may not initiate litigation - (including a cross-claim or counterclaim in a lawsuit) alleging that - any patent claim is infringed by making, using, selling, offering for - sale, or importing the Program or any portion of it. - . - 11. Patents. - . - A "contributor" is a copyright holder who authorizes use under this - License of the Program or a work on which the Program is based. The - work thus licensed is called the contributor's "contributor version". - . - A contributor's "essential patent claims" are all patent claims owned - or controlled by the contributor, whether already acquired or hereafter - acquired, that would be infringed by some manner, permitted by this - License, of making, using, or selling its contributor version, but do - not include claims that would be infringed only as a consequence of - further modification of the contributor version. For purposes of this - definition, "control" includes the right to grant patent sublicenses in - a manner consistent with the requirements of this License. - . - Each contributor grants you a non-exclusive, worldwide, royalty-free - patent license under the contributor's essential patent claims, to - make, use, sell, offer for sale, import and otherwise run, modify and - propagate the contents of its contributor version. - . - In the following three paragraphs, a "patent license" is any express - agreement or commitment, however denominated, not to enforce a patent - (such as an express permission to practice a patent or covenant not to - sue for patent infringement). To "grant" such a patent license to a - party means to make such an agreement or commitment not to enforce a - patent against the party. - . - If you convey a covered work, knowingly relying on a patent license, - and the Corresponding Source of the work is not available for anyone to - copy, free of charge and under the terms of this License, through a - publicly available network server or other readily accessible means, - then you must either (1) cause the Corresponding Source to be so - available, or (2) arrange to deprive yourself of the benefit of the - patent license for this particular work, or (3) arrange, in a manner - consistent with the requirements of this License, to extend the patent - license to downstream recipients. "Knowingly relying" means you have - actual knowledge that, but for the patent license, your conveying the - covered work in a country, or your recipient's use of the covered work - in a country, would infringe one or more identifiable patents in that - country that you have reason to believe are valid. - . - If, pursuant to or in connection with a single transaction or - arrangement, you convey, or propagate by procuring conveyance of, a - covered work, and grant a patent license to some of the parties - receiving the covered work authorizing them to use, propagate, modify - or convey a specific copy of the covered work, then the patent license - you grant is automatically extended to all recipients of the covered - work and works based on it. - . - A patent license is "discriminatory" if it does not include within the - scope of its coverage, prohibits the exercise of, or is conditioned on - the non-exercise of one or more of the rights that are specifically - granted under this License. You may not convey a covered work if you - are a party to an arrangement with a third party that is in the - business of distributing software, under which you make payment to the - third party based on the extent of your activity of conveying the work, - and under which the third party grants, to any of the parties who would - receive the covered work from you, a discriminatory patent license (a) - in connection with copies of the covered work conveyed by you (or - copies made from those copies), or (b) primarily for and in connection - with specific products or compilations that contain the covered work, - unless you entered into that arrangement, or that patent license was - granted, prior to 28 March 2007. - . - Nothing in this License shall be construed as excluding or limiting any - implied license or other defenses to infringement that may otherwise be - available to you under applicable patent law. - . - 12. No Surrender of Others' Freedom. - . - If conditions are imposed on you (whether by court order, agreement or - otherwise) that contradict the conditions of this License, they do not - excuse you from the conditions of this License. If you cannot convey a - covered work so as to satisfy simultaneously your obligations under - this License and any other pertinent obligations, then as a consequence - you may not convey it at all. For example, if you agree to terms that - obligate you to collect a royalty for further conveying from those to - whom you convey the Program, the only way you could satisfy both those - terms and this License would be to refrain entirely from conveying the - Program. - . - 13. Remote Network Interaction; Use with the GNU General Public - License. - . - Notwithstanding any other provision of this License, if you modify the - Program, your modified version must prominently offer all users - interacting with it remotely through a computer network (if your - version supports such interaction) an opportunity to receive the - Corresponding Source of your version by providing access to the - Corresponding Source from a network server at no charge, through some - standard or customary means of facilitating copying of software. This - Corresponding Source shall include the Corresponding Source for any - work covered by version 3 of the GNU General Public License that is - incorporated pursuant to the following paragraph. - . - Notwithstanding any other provision of this License, you have - permission to link or combine any covered work with a work licensed - under version 3 of the GNU General Public License into a single - combined work, and to convey the resulting work. The terms of this - License will continue to apply to the part which is the covered work, - but the work with which it is combined will remain governed by version - 3 of the GNU General Public License. - . - 14. Revised Versions of this License. - . - The Free Software Foundation may publish revised and/or new versions of - the GNU Affero General Public License from time to time. Such new - versions will be similar in spirit to the present version, but may - differ in detail to address new problems or concerns. - . - Each version is given a distinguishing version number. If the Program - specifies that a certain numbered version of the GNU Affero General - Public License "or any later version" applies to it, you have the - option of following the terms and conditions either of that numbered - version or of any later version published by the Free Software - Foundation. If the Program does not specify a version number of the - GNU Affero General Public License, you may choose any version ever - published by the Free Software Foundation. - . - If the Program specifies that a proxy can decide which future versions - of the GNU Affero General Public License can be used, that proxy's - public statement of acceptance of a version permanently authorizes you - to choose that version for the Program. - . - Later license versions may give you additional or different - permissions. However, no additional obligations are imposed on any - author or copyright holder as a result of your choosing to follow a - later version. - . - 15. Disclaimer of Warranty. - . - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY - APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT - HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT - WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE - OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU - ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - . - 16. Limitation of Liability. - . - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING - WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR - CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, - INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES - ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT - NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES - SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO - OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY - HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - . - 17. Interpretation of Sections 15 and 16. - . - If the disclaimer of warranty and limitation of liability provided - above cannot be given local legal effect according to their terms, - reviewing courts shall apply local law that most closely approximates - an absolute waiver of all civil liability in connection with the - Program, unless a warranty or assumption of liability accompanies a - copy of the Program in return for a fee. - . - END OF TERMS AND CONDITIONS - . - How to Apply These Terms to Your New Programs - . - If you develop a new program, and you want it to be of the greatest - possible use to the public, the best way to achieve this is to make it - free software which everyone can redistribute and change under these - terms. - . - To do so, attach the following notices to the program. It is safest to - attach them to the start of each source file to most effectively state - the exclusion of warranty; and each file should have at least the - "copyright" line and a pointer to where the full notice is found. - . - - Copyright (C) - . - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - . - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Affero General Public License for more details. - . - You should have received a copy of the GNU Affero General Public - License along with this program. If not, see - . - . - Also add information on how to contact you by electronic and paper - mail. - . - If your software can interact with users remotely through a computer - network, you should also make sure that it provides a way for users to - get its source. For example, if your program is a web application, its - interface could display a "Source" link that leads users to an archive - of the code. There are many ways you could offer source, and different - solutions will be better for different programs; see section 13 for the - specific requirements. - . - You should also get your employer (if you work as a programmer) or - school, if any, to sign a "copyright disclaimer" for the program, if - necessary. For more information on this, and how to apply and follow - the GNU AGPL, see . - License: ISC Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff -Nru juce-6.1.5~ds0/debian/copyright_hints juce-7.0.0~ds0/debian/copyright_hints --- juce-6.1.5~ds0/debian/copyright_hints 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/copyright_hints 2022-06-28 06:25:52.000000000 +0000 @@ -29,6 +29,8 @@ ./extras/AudioPerformanceTest/Source/MainComponent.h ./extras/AudioPluginHost/CMakeLists.txt ./extras/AudioPluginHost/Source/HostStartup.cpp + ./extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp + ./extras/AudioPluginHost/Source/Plugins/ARAPlugin.h ./extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.cpp ./extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.h ./extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp @@ -43,9 +45,12 @@ ./extras/BinaryBuilder/CMakeLists.txt ./extras/BinaryBuilder/Source/Main.cpp ./extras/Build/CMake/JUCECheckAtomic.cmake + ./extras/Build/CMake/JUCEHelperTargets.cmake ./extras/Build/CMake/JUCEModuleSupport.cmake ./extras/Build/CMake/JUCEUtils.cmake + ./extras/Build/CMake/checkBundleSigning.cmake ./extras/Build/CMake/copyDir.cmake + ./extras/Build/CMake/juce_runtime_arch_detection.cpp ./extras/Build/CMakeLists.txt ./extras/Build/juce_build_tools/juce_build_tools.cpp ./extras/Build/juce_build_tools/juce_build_tools.h @@ -229,7 +234,6 @@ ./extras/Projucer/Source/Project/jucer_Project.cpp ./extras/Projucer/Source/Project/jucer_Project.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 @@ -287,10 +291,6 @@ ./modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h ./modules/juce_analytics/juce_analytics.cpp ./modules/juce_analytics/juce_analytics.h - ./modules/juce_audio_basics/utilities/juce_GenericInterpolator.h - ./modules/juce_audio_basics/utilities/juce_Interpolators.cpp - ./modules/juce_audio_basics/utilities/juce_Interpolators.h - ./modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp ./modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp ./modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h ./modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp @@ -307,6 +307,8 @@ ./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_ARAAudioReaders.cpp + ./modules/juce_audio_formats/format/juce_ARAAudioReaders.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 @@ -329,13 +331,11 @@ ./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/ARA/juce_ARA_Wrapper.cpp + ./modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h + ./modules/juce_audio_plugin_client/CMakeLists.txt + ./modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp + ./modules/juce_audio_plugin_client/LV2/juce_LV2_Client.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 @@ -346,23 +346,19 @@ ./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_ARA.cpp ./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_LV2.cpp + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.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_CreatePluginFilter.h ./modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h @@ -374,16 +370,32 @@ ./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/LV2_SDK/generate_lv2_bundle_sources.py + ./modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h + ./modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h + ./modules/juce_audio_processors/format_types/juce_ARACommon.cpp + ./modules/juce_audio_processors/format_types/juce_ARACommon.h + ./modules/juce_audio_processors/format_types/juce_ARAHosting.cpp + ./modules/juce_audio_processors/format_types/juce_ARAHosting.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_LV2Common.h + ./modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp + ./modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h + ./modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp + ./modules/juce_audio_processors/format_types/juce_LV2Resources.h + ./modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp ./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_VST3PluginFormat_test.cpp ./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 @@ -391,6 +403,8 @@ ./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/juce_audio_processors_ara.cpp + ./modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp ./modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp ./modules/juce_audio_processors/processors/juce_AudioPluginInstance.h ./modules/juce_audio_processors/processors/juce_AudioProcessor.cpp @@ -415,6 +429,17 @@ ./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/ARA/juce_ARADocumentController.cpp + ./modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h + ./modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp + ./modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp + ./modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h + ./modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp + ./modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h + ./modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp + ./modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h + ./modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp + ./modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.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 @@ -428,6 +453,9 @@ ./modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp ./modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h ./modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h + ./modules/juce_audio_processors/utilities/juce_FlagCache.h + ./modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp + ./modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h ./modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp ./modules/juce_audio_processors/utilities/juce_ParameterAttachments.h ./modules/juce_audio_processors/utilities/juce_PluginHostType.cpp @@ -478,7 +506,8 @@ ./modules/juce_box2d/juce_box2d.h ./modules/juce_box2d/utils/juce_Box2DRenderer.cpp ./modules/juce_box2d/utils/juce_Box2DRenderer.h - ./modules/juce_core/memory/juce_Reservoir.h + ./modules/juce_core/files/juce_common_MimeTypes.cpp + ./modules/juce_core/files/juce_common_MimeTypes.h ./modules/juce_cryptography/encryption/juce_BlowFish.cpp ./modules/juce_cryptography/encryption/juce_BlowFish.h ./modules/juce_cryptography/encryption/juce_Primes.cpp @@ -880,10 +909,12 @@ ./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_PointerState.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/accessibility/juce_AccessibilityTextHelpers.h + ./modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp ./modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp ./modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm ./modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm @@ -917,13 +948,13 @@ ./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_Windowing.cpp + ./modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h ./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 @@ -1073,8 +1104,8 @@ ./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_NSViewFrameWatcher.h ./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 @@ -1176,6 +1207,7 @@ ./modules/juce_video/playback/juce_VideoComponent.cpp ./modules/juce_video/playback/juce_VideoComponent.h Copyright: 2020, Raw Material Software Limited + 2022, Raw Material Software Limited License: GPL-3 FIXME @@ -1226,9 +1258,6 @@ ./examples/DemoRunner/Builds/Android/settings.gradle ./examples/DemoRunner/Builds/LinuxMakefile/Makefile ./examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj - ./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 @@ -1254,6 +1283,8 @@ ./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_processors_ara.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_utils.cpp ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_utils.mm ./examples/DemoRunner/JuceLibraryCode/include_juce_box2d.cpp @@ -1315,6 +1346,8 @@ ./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_processors_ara.cpp + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_utils.cpp ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_utils.mm ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_core.cpp @@ -1350,10 +1383,6 @@ ./extras/AudioPluginHost/Builds/LinuxMakefile/Makefile ./extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj ./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 @@ -1383,6 +1412,8 @@ ./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_processors_ara.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_utils.cpp ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_utils.mm ./extras/AudioPluginHost/JuceLibraryCode/include_juce_core.cpp @@ -1414,13 +1445,13 @@ ./extras/BinaryBuilder/JuceLibraryCode/ReadMe.txt ./extras/BinaryBuilder/JuceLibraryCode/include_juce_core.cpp ./extras/BinaryBuilder/JuceLibraryCode/include_juce_core.mm - ./extras/Build/CMake/JUCEHelperTargets.cmake + ./extras/Build/CMake/JuceLV2Defines.h.in ./extras/Build/CMake/LaunchScreen.storyboard ./extras/Build/CMake/PIPAudioProcessor.cpp.in + ./extras/Build/CMake/PIPAudioProcessorWithARA.cpp.in ./extras/Build/CMake/PIPComponent.cpp.in ./extras/Build/CMake/PIPConsole.cpp.in ./extras/Build/CMake/UnityPluginGUIScript.cs.in - ./extras/Build/CMake/juce_runtime_arch_detection.cpp ./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 @@ -1455,6 +1486,8 @@ ./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_processors_ara.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_utils.cpp ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_utils.mm ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_core.cpp @@ -1479,10 +1512,6 @@ ./extras/Projucer/Builds/LinuxMakefile/Makefile ./extras/Projucer/Builds/MacOSX/Info-App.plist ./extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj - ./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 @@ -1517,7 +1546,6 @@ ./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 @@ -1539,6 +1567,10 @@ ./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_AudioPluginARADocumentControllerTemplate.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.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 @@ -1589,6 +1621,8 @@ ./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_processors_ara.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_utils.cpp ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_utils.mm ./extras/UnitTestRunner/JuceLibraryCode/include_juce_core.cpp @@ -1628,6 +1662,8 @@ ./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_processors_ara.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_utils.cpp ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_utils.mm ./extras/WindowsDLL/JuceLibraryCode/include_juce_core.cpp @@ -1651,9 +1687,82 @@ ./extras/WindowsDLL/WindowsDLL.jucer ./modules/juce_audio_devices/native/oboe/CMakeLists.txt ./modules/juce_audio_devices/native/oboe/README.md - ./modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def - ./modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinResources.rsr - ./modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r + ./modules/juce_audio_processors/format_types/LV2_SDK/README.md + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/people.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/manifest.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.meta.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.ttl + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/.clang-tidy ./modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md ./modules/juce_audio_processors/format_types/VST3_SDK/README.md ./modules/juce_audio_processors/format_types/VST3_SDK/base/README.md @@ -1769,12 +1878,13 @@ ./examples/GUI/WebBrowserDemo.h ./examples/GUI/WidgetsDemo.h ./examples/GUI/WindowsDemo.h + ./examples/Plugins/ARAPluginDemo.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/HostPluginDemo.h ./examples/Plugins/MidiLoggerPluginDemo.h ./examples/Plugins/MultiOutSynthPluginDemo.h ./examples/Plugins/NoiseGatePluginDemo.h @@ -1841,11 +1951,11 @@ ./modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h ./modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp ./modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h - ./modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp ./modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp ./modules/juce_audio_basics/midi/ump/juce_UMPUtils.h ./modules/juce_audio_basics/midi/ump/juce_UMPView.cpp ./modules/juce_audio_basics/midi/ump/juce_UMPView.h + ./modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp ./modules/juce_audio_basics/midi/ump/juce_UMPacket.h ./modules/juce_audio_basics/midi/ump/juce_UMPackets.h ./modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp @@ -1867,6 +1977,7 @@ ./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/native/juce_mac_CoreAudioTimeConversions.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 @@ -1890,18 +2001,23 @@ ./modules/juce_audio_basics/utilities/juce_ADSR.h ./modules/juce_audio_basics/utilities/juce_ADSR_test.cpp ./modules/juce_audio_basics/utilities/juce_Decibels.h + ./modules/juce_audio_basics/utilities/juce_GenericInterpolator.h ./modules/juce_audio_basics/utilities/juce_IIRFilter.cpp ./modules/juce_audio_basics/utilities/juce_IIRFilter.h + ./modules/juce_audio_basics/utilities/juce_Interpolators.cpp + ./modules/juce_audio_basics/utilities/juce_Interpolators.h ./modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp ./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_basics/utilities/juce_WindowedSincInterpolator.cpp ./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_SampleRateHelpers.cpp ./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 @@ -1911,7 +2027,6 @@ ./modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp ./modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h ./modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h - ./modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp ./modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h ./modules/juce_audio_devices/native/java/app/com/rmsl/juce/JuceMidiSupport.java ./modules/juce_audio_devices/native/juce_android_Audio.cpp @@ -1947,9 +2062,12 @@ ./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.cpp ./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_Optional.h + ./modules/juce_core/containers/juce_Optional_test.cpp ./modules/juce_core/containers/juce_OwnedArray.cpp ./modules/juce_core/containers/juce_OwnedArray.h ./modules/juce_core/containers/juce_PropertySet.cpp @@ -1963,6 +2081,7 @@ ./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_AndroidDocument.h ./modules/juce_core/files/juce_DirectoryIterator.cpp ./modules/juce_core/files/juce_DirectoryIterator.h ./modules/juce_core/files/juce_File.cpp @@ -2016,6 +2135,7 @@ ./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_Reservoir.h ./modules/juce_core/memory/juce_ScopedPointer.h ./modules/juce_core/memory/juce_SharedResourcePointer.h ./modules/juce_core/memory/juce_Singleton.h @@ -2036,6 +2156,7 @@ ./modules/juce_core/native/javacore/app/com/rmsl/juce/JuceApp.java ./modules/juce_core/native/javacore/init/com/rmsl/juce/Java.java ./modules/juce_core/native/juce_BasicNativeHeaders.h + ./modules/juce_core/native/juce_android_AndroidDocument.cpp ./modules/juce_core/native/juce_android_Files.cpp ./modules/juce_core/native/juce_android_JNIHelpers.cpp ./modules/juce_core/native/juce_android_JNIHelpers.h @@ -2207,6 +2328,7 @@ ./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_EventLoopInternal.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 @@ -2219,6 +2341,7 @@ ./modules/juce_events/timers/juce_Timer.cpp ./modules/juce_events/timers/juce_Timer.h Copyright: 2020, Raw Material Software Limited + 2022, Raw Material Software Limited License: ISC FIXME @@ -2585,6 +2708,130 @@ License: Apache-2.0 FIXME +Files: ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/COPYING + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/COPYING + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h + ./modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/COPYING + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c + ./modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h + ./modules/juce_audio_processors/format_types/LV2_SDK/sratom/COPYING + ./modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h + ./modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c +Copyright: 2007-2016, David Robillard + 2007-2017, David Robillard + 2007-2019, David Robillard + 2007-2020, David Robillard + 2007-2021, David Robillard + 2008-2015, David Robillard + 2008-2016, David Robillard + 2008-2019, David Robillard + 2011, David Robillard + 2011-2013, David Robillard + 2011-2015, David Robillard + 2011-2016, David Robillard + 2011-2020, David Robillard + 2011-2021, David Robillard + 2012-2015, David Robillard + 2012-2016, David Robillard + 2012-2018, David Robillard + 2012-2019, David Robillard + 2012-2020, David Robillard + 2012-2021, David Robillard + 2016, David Robillard + 2016-2020, David Robillard + 2018, David Robillard + 2019, David Robillard + 2019-2020, David Robillard + 2021, David Robillard +License: UNKNOWN + 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 @@ -2642,6 +2889,18 @@ License: Zlib FIXME +Files: ./modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h + ./modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h + ./modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h + ./modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h + ./modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h + ./modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h + ./modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h + ./modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h +Copyright: NONE +License: public-domain + 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 @@ -2661,8 +2920,7 @@ License: ISC FIXME -Files: ./examples/DemoRunner/Builds/VisualStudio2015/resources.rc - ./examples/DemoRunner/Builds/VisualStudio2017/resources.rc +Files: ./examples/DemoRunner/Builds/VisualStudio2017/resources.rc ./examples/DemoRunner/Builds/VisualStudio2019/resources.rc ./examples/DemoRunner/Builds/VisualStudio2022/resources.rc Copyright: 2020, Raw Material Software Limited0" @@ -2675,6 +2933,15 @@ License: GPL-3 FIXME +Files: ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h +Copyright: 2006-2007, Lars Luthman + 2006-2011, Lars Luthman + 2008-2016, David Robillard + 2009-2016, David Robillard +License: UNKNOWN + FIXME + Files: ./extras/Projucer/Source/BinaryData/Templates/jucer_ComponentTemplate.cpp ./extras/Projucer/Source/BinaryData/Templates/jucer_ComponentTemplate.h Copyright: 2020, Raw Material Software Limited. @@ -2687,6 +2954,14 @@ License: UNKNOWN FIXME +Files: ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING + ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h +Copyright: 2000-2002, Richard W.E. Furse, + 2006-2012, Steve Harris, David Robillard. + 2007-2012, Steve Harris, David Robillard. +License: UNKNOWN + FIXME + Files: ./modules/juce_audio_plugin_client/AUResources.r Copyright: 2014, Apple Inc. License: AML @@ -2702,11 +2977,28 @@ License: Khronos FIXME +Files: ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h +Copyright: 2008-2016, David Robillard + 2011, Gabriel M. Beddingfield +License: UNKNOWN + FIXME + +Files: ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h +Copyright: 2010, Leonard Ritter + 2010-2016, David Robillard +License: UNKNOWN + FIXME + Files: ./examples/DemoRunner/DemoRunner.jucer Copyright: 2020, Raw Material Software Limited" License: UNKNOWN FIXME +Files: ./modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h +Copyright: 2008-2011, Stefano D'Angelo +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 diff -Nru juce-6.1.5~ds0/debian/extra/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp juce-7.0.0~ds0/debian/extra/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp --- juce-6.1.5~ds0/debian/extra/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/extra/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2017 - ROLI Ltd. - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 5 End-User License - Agreement and JUCE 5 Privacy Policy (both updated and effective as of the - 27th April 2017). - - End User License Agreement: www.juce.com/juce-5-licence - Privacy Policy: www.juce.com/juce-5-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include "LV2/juce_LV2_Wrapper.cpp" diff -Nru juce-6.1.5~ds0/debian/extra/juce_audio_plugin_client/LV2/includes/lv2_external_ui.h juce-7.0.0~ds0/debian/extra/juce_audio_plugin_client/LV2/includes/lv2_external_ui.h --- juce-6.1.5~ds0/debian/extra/juce_audio_plugin_client/LV2/includes/lv2_external_ui.h 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/extra/juce_audio_plugin_client/LV2/includes/lv2_external_ui.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -/* - LV2 External UI extension - This work is in public domain. - - This file is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - If you have questions, contact Filipe Coelho (aka falkTX) - or ask in #lad channel, FreeNode IRC network. -*/ - -/** - @file lv2_external_ui.h - C header for the LV2 External UI extension . -*/ - -#ifndef LV2_EXTERNAL_UI_H -#define LV2_EXTERNAL_UI_H - -#include "ui.h" - -#define LV2_EXTERNAL_UI_URI "http://kxstudio.sf.net/ns/lv2ext/external-ui" -#define LV2_EXTERNAL_UI_PREFIX LV2_EXTERNAL_UI_URI "#" - -#define LV2_EXTERNAL_UI__Host LV2_EXTERNAL_UI_PREFIX "Host" -#define LV2_EXTERNAL_UI__Widget LV2_EXTERNAL_UI_PREFIX "Widget" - -/** This extension used to be defined by a lv2plug.in URI */ -#define LV2_EXTERNAL_UI_DEPRECATED_URI "http://lv2plug.in/ns/extensions/ui#external" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * When LV2_EXTERNAL_UI__Widget UI is instantiated, the returned - * LV2UI_Widget handle must be cast to pointer to LV2_External_UI_Widget. - * UI is created in invisible state. - */ -typedef struct _LV2_External_UI_Widget { - /** - * Host calls this function regulary. UI library implementing the - * callback may do IPC or redraw the UI. - * - * @param _this_ the UI context - */ - void (*run)(struct _LV2_External_UI_Widget * _this_); - - /** - * Host calls this function to make the plugin UI visible. - * - * @param _this_ the UI context - */ - void (*show)(struct _LV2_External_UI_Widget * _this_); - - /** - * Host calls this function to make the plugin UI invisible again. - * - * @param _this_ the UI context - */ - void (*hide)(struct _LV2_External_UI_Widget * _this_); - -} LV2_External_UI_Widget; - -#define LV2_EXTERNAL_UI_RUN(ptr) (ptr)->run(ptr) -#define LV2_EXTERNAL_UI_SHOW(ptr) (ptr)->show(ptr) -#define LV2_EXTERNAL_UI_HIDE(ptr) (ptr)->hide(ptr) - -/** - * On UI instantiation, host must supply LV2_EXTERNAL_UI__Host feature. - * LV2_Feature::data must be pointer to LV2_External_UI_Host. - */ -typedef struct _LV2_External_UI_Host { - /** - * Callback that plugin UI will call when UI (GUI window) is closed by user. - * This callback will be called during execution of LV2_External_UI_Widget::run() - * (i.e. not from background thread). - * - * After this callback is called, UI is defunct. Host must call LV2UI_Descriptor::cleanup(). - * If host wants to make the UI visible again, the UI must be reinstantiated. - * - * @note When using the depreated URI LV2_EXTERNAL_UI_DEPRECATED_URI, - * some hosts will not call LV2UI_Descriptor::cleanup() as they should, - * and may call show() again without re-initialization. - * - * @param controller Host context associated with plugin UI, as - * supplied to LV2UI_Descriptor::instantiate(). - */ - void (*ui_closed)(LV2UI_Controller controller); - - /** - * Optional (may be NULL) "user friendly" identifier which the UI - * may display to allow a user to easily associate this particular - * UI instance with the correct plugin instance as it is represented - * by the host (e.g. "track 1" or "channel 4"). - * - * If supplied by host, the string will be referenced only during - * LV2UI_Descriptor::instantiate() - */ - const char * plugin_human_id; - -} LV2_External_UI_Host; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV2_EXTERNAL_UI_H */ diff -Nru juce-6.1.5~ds0/debian/extra/juce_audio_plugin_client/LV2/includes/lv2_programs.h juce-7.0.0~ds0/debian/extra/juce_audio_plugin_client/LV2/includes/lv2_programs.h --- juce-6.1.5~ds0/debian/extra/juce_audio_plugin_client/LV2/includes/lv2_programs.h 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/extra/juce_audio_plugin_client/LV2/includes/lv2_programs.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,174 +0,0 @@ -/* - LV2 Programs Extension - Copyright 2012 Filipe Coelho - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -/** - @file lv2_programs.h - C header for the LV2 programs extension . -*/ - -#ifndef LV2_PROGRAMS_H -#define LV2_PROGRAMS_H - -#include "lv2.h" -#include "ui.h" - -#define LV2_PROGRAMS_URI "http://kxstudio.sf.net/ns/lv2ext/programs" -#define LV2_PROGRAMS_PREFIX LV2_PROGRAMS_URI "#" - -#define LV2_PROGRAMS__Host LV2_PROGRAMS_PREFIX "Host" -#define LV2_PROGRAMS__Interface LV2_PROGRAMS_PREFIX "Interface" -#define LV2_PROGRAMS__UIInterface LV2_PROGRAMS_PREFIX "UIInterface" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void* LV2_Programs_Handle; - -typedef struct _LV2_Program_Descriptor { - - /** Bank number for this program. Note that this extension does not - support MIDI-style separation of bank LSB and MSB values. There is - no restriction on the set of available banks: the numbers do not - need to be contiguous, there does not need to be a bank 0, etc. */ - uint32_t bank; - - /** Program number (unique within its bank) for this program. There is - no restriction on the set of available programs: the numbers do not - need to be contiguous, there does not need to be a program 0, etc. */ - uint32_t program; - - /** Name of the program. */ - const char * name; - -} LV2_Program_Descriptor; - -/** - Programs extension, plugin data. - - When the plugin's extension_data is called with argument LV2_PROGRAMS__Interface, - the plugin MUST return an LV2_Programs_Instance structure, which remains valid - for the lifetime of the plugin. -*/ -typedef struct _LV2_Programs_Interface { - /** - * get_program() - * - * This member is a function pointer that provides a description - * of a program (named preset sound) available on this plugin. - * - * The index argument is an index into the plugin's list of - * programs, not a program number as represented by the Program - * field of the LV2_Program_Descriptor. (This distinction is - * needed to support plugins that use non-contiguous program or - * bank numbers.) - * - * This function returns a LV2_Program_Descriptor pointer that is - * guaranteed to be valid only until the next call to get_program - * or deactivate, on the same plugin instance. This function must - * return NULL if passed an index argument out of range, so that - * the host can use it to query the number of programs as well as - * their properties. - */ - const LV2_Program_Descriptor *(*get_program)(LV2_Handle handle, - uint32_t index); - - /** - * select_program() - * - * This member is a function pointer that selects a new program - * for this plugin. The program change should take effect - * immediately at the start of the next run() call. (This - * means that a host providing the capability of changing programs - * between any two notes on a track must vary the block size so as - * to place the program change at the right place. A host that - * wanted to avoid this would probably just instantiate a plugin - * for each program.) - * - * Plugins should ignore a select_program() call with an invalid - * bank or program. - * - * A plugin is not required to select any particular default - * program on activate(): it's the host's duty to set a program - * explicitly. - * - * A plugin is permitted to re-write the values of its input - * control ports when select_program is called. The host should - * re-read the input control port values and update its own - * records appropriately. (This is the only circumstance in which - * a LV2 plugin is allowed to modify its own control-input ports.) - */ - void (*select_program)(LV2_Handle handle, - uint32_t bank, - uint32_t program); - -} LV2_Programs_Interface; - -/** - Programs extension, UI data. - - When the UI's extension_data is called with argument LV2_PROGRAMS__UIInterface, - the UI MUST return an LV2_Programs_UI_Interface structure, which remains valid - for the lifetime of the UI. -*/ -typedef struct _LV2_Programs_UI_Interface { - /** - * select_program() - * - * This is exactly the same as select_program in LV2_Programs_Instance, - * but this struct relates to the UI instead of the plugin. - * - * When called, UIs should update their state to match the selected program. - */ - void (*select_program)(LV2UI_Handle handle, - uint32_t bank, - uint32_t program); - -} LV2_Programs_UI_Interface; - -/** - Feature data for LV2_PROGRAMS__Host. -*/ -typedef struct _LV2_Programs_Host { - /** - * Opaque host data. - */ - LV2_Programs_Handle handle; - - /** - * program_changed() - * - * Tell the host to reload a plugin's program. - * Parameter handle MUST be the 'handle' member of this struct. - * Parameter index is program index to change. - * When index is -1, host should reload all the programs. - * - * The plugin MUST NEVER call this function on a RT context or during run(). - * - * NOTE: This call is to inform the host about a program's bank, program or name change. - * It DOES NOT change the current selected program. - */ - void (*program_changed)(LV2_Programs_Handle handle, - int32_t index); - -} LV2_Programs_Host; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LV2_PROGRAMS_H */ diff -Nru juce-6.1.5~ds0/debian/extra/juce_audio_plugin_client/LV2/juce_LV2_Wrapper.cpp juce-7.0.0~ds0/debian/extra/juce_audio_plugin_client/LV2/juce_LV2_Wrapper.cpp --- juce-6.1.5~ds0/debian/extra/juce_audio_plugin_client/LV2/juce_LV2_Wrapper.cpp 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/extra/juce_audio_plugin_client/LV2/juce_LV2_Wrapper.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,2170 +0,0 @@ -/* - ============================================================================== - - Juce LV2 Wrapper - - ============================================================================== -*/ - -#include -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_LV2 - -/** Plugin requires processing with a fixed/constant block size */ -#ifndef JucePlugin_WantsLV2FixedBlockSize - #define JucePlugin_WantsLV2FixedBlockSize 0 -#endif - -/** Enable latency port */ -#ifndef JucePlugin_WantsLV2Latency - #define JucePlugin_WantsLV2Latency 1 -#endif - -/** Use non-parameter states */ -#ifndef JucePlugin_WantsLV2State - #define JucePlugin_WantsLV2State 1 -#endif - -/** States are strings, needs custom get/setStateInformationString */ -#ifndef JucePlugin_WantsLV2StateString - #define JucePlugin_WantsLV2StateString 0 -#endif - -/** Export presets */ -#ifndef JucePlugin_WantsLV2Presets - #define JucePlugin_WantsLV2Presets 1 -#endif - -/** Request time position */ -#ifndef JucePlugin_WantsLV2TimePos - #define JucePlugin_WantsLV2TimePos 1 -#endif - -/** Using string states require enabling states first */ -#if JucePlugin_WantsLV2StateString && ! JucePlugin_WantsLV2State - #undef JucePlugin_WantsLV2State - #define JucePlugin_WantsLV2State 1 -#endif - -#if JUCE_LINUX && ! JUCE_AUDIOPROCESSOR_NO_GUI - #include - #undef KeyPress -#endif - -#include -#include - -// LV2 includes.. -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "includes/lv2_external_ui.h" -#include "includes/lv2_programs.h" - -#include "../utility/juce_IncludeModuleHeaders.h" - -#define JUCE_LV2_STATE_STRING_URI "urn:juce:stateString" -#define JUCE_LV2_STATE_BINARY_URI "urn:juce:stateBinary" - -//============================================================================== -// Various helper functions for creating the ttl files - -#if JUCE_MAC - #define PLUGIN_EXT ".dylib" -#elif JUCE_LINUX - #define PLUGIN_EXT ".so" -#elif JUCE_WINDOWS - #define PLUGIN_EXT ".dll" -#endif - -using namespace juce; - -/** Returns plugin type, defined in AppConfig.h or JucePluginCharacteristics.h */ -const String getPluginType() -{ - String pluginType; -#ifdef JucePlugin_LV2Category - pluginType = "lv2:" JucePlugin_LV2Category; - pluginType += ", "; -#elif JucePlugin_IsSynth - pluginType = "lv2:InstrumentPlugin, "; -#endif - pluginType += "lv2:Plugin"; - return pluginType; -} - -/** Returns plugin URI */ -static const String& getPluginURI() -{ - // JucePlugin_LV2URI might be defined as a function (eg. allowing dynamic URIs based on filename) - static const String pluginURI(JucePlugin_LV2URI); - return pluginURI; -} - -static Array usedSymbols; - -/** Converts a parameter name to an LV2 compatible symbol. */ -const String nameToSymbol (const String& name, const uint32 portIndex) -{ - String symbol, trimmedName = name.trimStart().trimEnd().toLowerCase(); - - if (trimmedName.isEmpty()) - { - symbol += "lv2_port_"; - symbol += String(portIndex+1); - } - else - { - for (int i=0; i < trimmedName.length(); ++i) - { - const juce_wchar c = trimmedName[i]; - if (i == 0 && std::isdigit(c)) - symbol += "_"; - else if (std::isalpha(c) || std::isdigit(c)) - symbol += c; - else - symbol += "_"; - } - } - - // Do not allow identical symbols - if (usedSymbols.contains(symbol)) - { - int offset = 2; - String offsetStr = "_2"; - symbol += offsetStr; - - while (usedSymbols.contains(symbol)) - { - offset += 1; - String newOffsetStr = "_" + String(offset); - symbol = symbol.replace(offsetStr, newOffsetStr); - offsetStr = newOffsetStr; - } - } - usedSymbols.add(symbol); - - return symbol; -} - -/** Prevents NaN or out of 0.0<->1.0 bounds parameter values. */ -float safeParamValue (float value) -{ - if (std::isnan(value)) - value = 0.0f; - else if (value < 0.0f) - value = 0.0f; - else if (value > 1.0f) - value = 1.0f; - return value; -} - -/** Create the manifest.ttl file contents */ -const String makeManifestFile (AudioProcessor* const filter, const String& binary) -{ - const String& pluginURI(getPluginURI()); - String text; - - // Header - text += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; - text += "@prefix pset: <" LV2_PRESETS_PREFIX "> .\n"; - text += "@prefix rdfs: .\n"; - text += "@prefix ui: <" LV2_UI_PREFIX "> .\n"; - text += "\n"; - - // Plugin - text += "<" + pluginURI + ">\n"; - text += " a lv2:Plugin ;\n"; - text += " lv2:binary <" + binary + PLUGIN_EXT "> ;\n"; - text += " rdfs:seeAlso <" + binary + ".ttl> .\n"; - text += "\n"; - -#if ! JUCE_AUDIOPROCESSOR_NO_GUI - // UIs - if (filter->hasEditor()) - { - text += "<" + pluginURI + "#ExternalUI>\n"; - text += " a <" LV2_EXTERNAL_UI__Widget "> ;\n"; - text += " ui:binary <" + binary + PLUGIN_EXT "> ;\n"; - text += " lv2:requiredFeature <" LV2_INSTANCE_ACCESS_URI "> ;\n"; - text += " lv2:extensionData <" LV2_PROGRAMS__UIInterface "> .\n"; - text += "\n"; - - text += "<" + pluginURI + "#ParentUI>\n"; - #if JUCE_MAC - text += " a ui:CocoaUI ;\n"; - #elif JUCE_LINUX - text += " a ui:X11UI ;\n"; - #elif JUCE_WINDOWS - text += " a ui:WindowsUI ;\n"; - #endif - text += " ui:binary <" + binary + PLUGIN_EXT "> ;\n"; - text += " lv2:requiredFeature <" LV2_INSTANCE_ACCESS_URI "> ;\n"; - text += " lv2:optionalFeature ui:noUserResize ;\n"; - text += " lv2:extensionData <" LV2_PROGRAMS__UIInterface "> .\n"; - text += "\n"; - } -#endif - -#if JucePlugin_WantsLV2Presets - const String presetSeparator(pluginURI.contains("#") ? ":" : "#"); - - // Presets - for (int i = 0; i < filter->getNumPrograms(); ++i) - { - text += "<" + pluginURI + presetSeparator + "preset" + String::formatted("%03i", i+1) + ">\n"; - text += " a pset:Preset ;\n"; - text += " lv2:appliesTo <" + pluginURI + "> ;\n"; - text += " rdfs:label \"" + filter->getProgramName(i) + "\" ;\n"; - text += " rdfs:seeAlso .\n"; - text += "\n"; - } -#endif - - return text; -} - -/** Create the -plugin-.ttl file contents */ -const String makePluginFile (AudioProcessor* const filter, const int maxNumInputChannels, const int maxNumOutputChannels) -{ - const String& pluginURI(getPluginURI()); - String text; - - // Header - text += "@prefix atom: <" LV2_ATOM_PREFIX "> .\n"; - text += "@prefix doap: .\n"; - text += "@prefix foaf: .\n"; - text += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; - text += "@prefix rdfs: .\n"; - text += "@prefix ui: <" LV2_UI_PREFIX "> .\n"; - text += "\n"; - - // Plugin - text += "<" + pluginURI + ">\n"; - text += " a " + getPluginType() + " ;\n"; - text += " lv2:requiredFeature <" LV2_BUF_SIZE__boundedBlockLength "> ,\n"; -#if JucePlugin_WantsLV2FixedBlockSize - text += " <" LV2_BUF_SIZE__fixedBlockLength "> ,\n"; -#endif - text += " <" LV2_URID__map "> ;\n"; - text += " lv2:extensionData <" LV2_OPTIONS__interface "> ,\n"; -#if JucePlugin_WantsLV2State - text += " <" LV2_STATE__interface "> ,\n"; -#endif - text += " <" LV2_PROGRAMS__Interface "> ;\n"; - text += "\n"; - -#if ! JUCE_AUDIOPROCESSOR_NO_GUI - // UIs - if (filter->hasEditor()) - { - text += " ui:ui <" + pluginURI + "#ExternalUI> ,\n"; - text += " <" + pluginURI + "#ParentUI> ;\n"; - text += "\n"; - } -#endif - - uint32 portIndex = 0; - -#if (JucePlugin_WantsMidiInput || JucePlugin_WantsLV2TimePos) - // MIDI input - text += " lv2:port [\n"; - text += " a lv2:InputPort, atom:AtomPort ;\n"; - text += " atom:bufferType atom:Sequence ;\n"; - #if JucePlugin_WantsMidiInput - text += " atom:supports <" LV2_MIDI__MidiEvent "> ;\n"; - #endif - #if JucePlugin_WantsLV2TimePos - text += " atom:supports <" LV2_TIME__Position "> ;\n"; - #endif - text += " lv2:index " + String(portIndex++) + " ;\n"; - text += " lv2:symbol \"lv2_events_in\" ;\n"; - text += " lv2:name \"Events Input\" ;\n"; - text += " lv2:designation lv2:control ;\n"; - #if ! JucePlugin_IsSynth - text += " lv2:portProperty lv2:connectionOptional ;\n"; - #endif - text += " ] ;\n"; - text += "\n"; -#endif - -#if JucePlugin_ProducesMidiOutput - // MIDI output - text += " lv2:port [\n"; - text += " a lv2:OutputPort, atom:AtomPort ;\n"; - text += " atom:bufferType atom:Sequence ;\n"; - text += " atom:supports <" LV2_MIDI__MidiEvent "> ;\n"; - text += " lv2:index " + String(portIndex++) + " ;\n"; - text += " lv2:symbol \"lv2_midi_out\" ;\n"; - text += " lv2:name \"MIDI Output\" ;\n"; - text += " ] ;\n"; - text += "\n"; -#endif - - // Freewheel port - text += " lv2:port [\n"; - text += " a lv2:InputPort, lv2:ControlPort ;\n"; - text += " lv2:index " + String(portIndex++) + " ;\n"; - text += " lv2:symbol \"lv2_freewheel\" ;\n"; - text += " lv2:name \"Freewheel\" ;\n"; - text += " lv2:default 0.0 ;\n"; - text += " lv2:minimum 0.0 ;\n"; - text += " lv2:maximum 1.0 ;\n"; - text += " lv2:designation <" LV2_CORE__freeWheeling "> ;\n"; - text += " lv2:portProperty lv2:toggled, <" LV2_PORT_PROPS__notOnGUI "> ;\n"; - text += " ] ;\n"; - text += "\n"; - -#if JucePlugin_WantsLV2Latency - // Latency port - text += " lv2:port [\n"; - text += " a lv2:OutputPort, lv2:ControlPort ;\n"; - text += " lv2:index " + String(portIndex++) + " ;\n"; - text += " lv2:symbol \"lv2_latency\" ;\n"; - text += " lv2:name \"Latency\" ;\n"; - text += " lv2:designation <" LV2_CORE__latency "> ;\n"; - text += " lv2:portProperty lv2:reportsLatency, lv2:integer ;\n"; - text += " ] ;\n"; - text += "\n"; -#endif - - // Audio inputs - for (int i=0; i < maxNumInputChannels; ++i) - { - if (i == 0) - text += " lv2:port [\n"; - else - text += " [\n"; - - text += " a lv2:InputPort, lv2:AudioPort ;\n"; - text += " lv2:index " + String(portIndex++) + " ;\n"; - text += " lv2:symbol \"lv2_audio_in_" + String(i+1) + "\" ;\n"; - text += " lv2:name \"Audio Input " + String(i+1) + "\" ;\n"; - - if (i+1 == maxNumInputChannels) - text += " ] ;\n\n"; - else - text += " ] ,\n"; - } - - // Audio outputs - for (int i=0; i < maxNumOutputChannels; ++i) - { - if (i == 0) - text += " lv2:port [\n"; - else - text += " [\n"; - - text += " a lv2:OutputPort, lv2:AudioPort ;\n"; - text += " lv2:index " + String(portIndex++) + " ;\n"; - text += " lv2:symbol \"lv2_audio_out_" + String(i+1) + "\" ;\n"; - text += " lv2:name \"Audio Output " + String(i+1) + "\" ;\n"; - - if (i+1 == maxNumOutputChannels) - text += " ] ;\n\n"; - else - text += " ] ,\n"; - } - - // Parameters - for (int i=0; i < filter->getNumParameters(); ++i) - { - if (i == 0) - text += " lv2:port [\n"; - else - text += " [\n"; - - text += " a lv2:InputPort, lv2:ControlPort ;\n"; - text += " lv2:index " + String(portIndex++) + " ;\n"; - text += " lv2:symbol \"" + nameToSymbol(filter->getParameterName(i), i) + "\" ;\n"; - - if (filter->getParameterName(i).isNotEmpty()) - text += " lv2:name \"" + filter->getParameterName(i) + "\" ;\n"; - else - text += " lv2:name \"Port " + String(i+1) + "\" ;\n"; - - text += " lv2:default " + String::formatted("%f", safeParamValue(filter->getParameter(i))) + " ;\n"; - text += " lv2:minimum 0.0 ;\n"; - text += " lv2:maximum 1.0 ;\n"; - - if (! filter->isParameterAutomatable(i)) - text += " lv2:portProperty <" LV2_PORT_PROPS__expensive "> ;\n"; - - if (i+1 == filter->getNumParameters()) - text += " ] ;\n\n"; - else - text += " ] ,\n"; - } - - text += " doap:name \"" + filter->getName() + "\" ;\n"; - text += " doap:maintainer [ foaf:name \"" JucePlugin_Manufacturer "\" ] .\n"; - - return text; -} - -/** Create the presets.ttl file contents */ -const String makePresetsFile (AudioProcessor* const filter) -{ - const String& pluginURI(getPluginURI()); - String text; - - // Header - text += "@prefix atom: <" LV2_ATOM_PREFIX "> .\n"; - text += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; - text += "@prefix pset: <" LV2_PRESETS_PREFIX "> .\n"; - text += "@prefix rdf: .\n"; - text += "@prefix rdfs: .\n"; - text += "@prefix state: <" LV2_STATE_PREFIX "> .\n"; - text += "@prefix xsd: .\n"; - text += "\n"; - - // Presets - const int numPrograms = filter->getNumPrograms(); - const String presetSeparator(pluginURI.contains("#") ? ":" : "#"); - - for (int i = 0; i < numPrograms; ++i) - { - std::cout << "\nSaving preset " << i+1 << "/" << numPrograms+1 << "..."; - std::cout.flush(); - - String preset; - - // Label - filter->setCurrentProgram(i); - preset += "<" + pluginURI + presetSeparator + "preset" + String::formatted("%03i", i+1) + "> a pset:Preset ;\n"; - - // State -#if JucePlugin_WantsLV2State - preset += " state:state [\n"; - #if JucePlugin_WantsLV2StateString - preset += " <" JUCE_LV2_STATE_STRING_URI ">\n"; - preset += "\"\"\"\n"; - preset += filter->getStateInformationString().replace("\r\n","\n"); - preset += "\"\"\"\n"; - #else - MemoryBlock chunkMemory; - filter->getCurrentProgramStateInformation(chunkMemory); - const String chunkString(Base64::toBase64(chunkMemory.getData(), chunkMemory.getSize())); - - preset += " <" JUCE_LV2_STATE_BINARY_URI "> [\n"; - preset += " a atom:Chunk ;\n"; - preset += " rdf:value \"" + chunkString + "\"^^xsd:base64Binary ;\n"; - preset += " ] ;\n"; - #endif - if (filter->getNumParameters() == 0) - { - preset += " ] .\n\n"; - continue; - } - - preset += " ] ;\n\n"; -#endif - - // Port values - usedSymbols.clear(); - - for (int j=0; j < filter->getNumParameters(); ++j) - { - if (j == 0) - preset += " lv2:port [\n"; - else - preset += " [\n"; - - preset += " lv2:symbol \"" + nameToSymbol(filter->getParameterName(j), j) + "\" ;\n"; - preset += " pset:value " + String::formatted("%f", safeParamValue(filter->getParameter(j))) + " ;\n"; - - if (j+1 == filter->getNumParameters()) - preset += " ] "; - else - preset += " ] ,\n"; - } - preset += ".\n\n"; - - text += preset; - } - - return text; -} - -/** Creates manifest.ttl, plugin.ttl and presets.ttl files */ -void createLv2Files(const char* basename) -{ - const ScopedJuceInitialiser_GUI juceInitialiser; - ScopedPointer filter (createPluginFilterOfType (AudioProcessor::wrapperType_LV2)); - - String binary(basename); - String binaryTTL(binary + ".ttl"); - - std::cout << "Writing manifest.ttl..."; std::cout.flush(); - std::fstream manifest("manifest.ttl", std::ios::out); - manifest << makeManifestFile(filter, binary) << std::endl; - manifest.close(); - std::cout << " done!" << std::endl; - - std::cout << "Writing " << binary << ".ttl..."; std::cout.flush(); - std::fstream plugin(binaryTTL.toUTF8(), std::ios::out); - plugin << makePluginFile(filter, JucePlugin_MaxNumInputChannels, JucePlugin_MaxNumOutputChannels) << std::endl; - plugin.close(); - std::cout << " done!" << std::endl; - -#if JucePlugin_WantsLV2Presets - std::cout << "Writing presets.ttl..."; std::cout.flush(); - std::fstream presets("presets.ttl", std::ios::out); - presets << makePresetsFile(filter) << std::endl; - presets.close(); - std::cout << " done!" << std::endl; -#endif -} - -//============================================================================== -#if JUCE_LINUX - -class SharedMessageThread : public Thread -{ -public: - SharedMessageThread() - : Thread ("Lv2MessageThread"), - initialised (false) - { - startThread (7); - - while (! initialised) - sleep (1); - } - - ~SharedMessageThread() - { - MessageManager::getInstance()->stopDispatchLoop(); - waitForThreadToExit (5000); - } - - void run() override - { - const ScopedJuceInitialiser_GUI juceInitialiser; - - MessageManager::getInstance()->setCurrentThreadAsMessageThread(); - initialised = true; - - MessageManager::getInstance()->runDispatchLoop(); - } - -private: - volatile bool initialised; -}; -#endif - -#if ! JUCE_AUDIOPROCESSOR_NO_GUI -//============================================================================== -/** - Lightweight DocumentWindow subclass for external ui -*/ -class JuceLv2ExternalUIWindow : public DocumentWindow -{ -public: - /** Creates a Document Window wrapper */ - JuceLv2ExternalUIWindow (AudioProcessorEditor* editor, const String& title) : - DocumentWindow (title, Colours::white, DocumentWindow::minimiseButton | DocumentWindow::closeButton, false), - closed (false), - lastPos (0, 0) - { - setOpaque (true); - setContentNonOwned (editor, true); - setSize (editor->getWidth(), editor->getHeight()); - setUsingNativeTitleBar (true); - } - - /** Close button handler */ - void closeButtonPressed() - { - saveLastPos(); - removeFromDesktop(); - closed = true; - } - - void saveLastPos() - { - lastPos = getScreenPosition(); - } - - void restoreLastPos() - { - setTopLeftPosition (lastPos.getX(), lastPos.getY()); - } - - Point getLastPos() - { - return lastPos; - } - - bool isClosed() - { - return closed; - } - - void reset() - { - closed = false; - } - -private: - bool closed; - Point lastPos; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLv2ExternalUIWindow); -}; - -//============================================================================== -/** - Juce LV2 External UI handle -*/ -class JuceLv2ExternalUIWrapper : public LV2_External_UI_Widget -{ -public: - JuceLv2ExternalUIWrapper (AudioProcessorEditor* editor, const String& title) - : window (editor, title) - { - // external UI calls - run = doRun; - show = doShow; - hide = doHide; - } - - ~JuceLv2ExternalUIWrapper() - { - if (window.isOnDesktop()) - window.removeFromDesktop(); - } - - void close() - { - window.closeButtonPressed(); - } - - bool isClosed() - { - return window.isClosed(); - } - - void reset(const String& title) - { - window.reset(); - window.setName(title); - } - - void repaint() - { - window.repaint(); - } - - Point getScreenPosition() - { - if (window.isClosed()) - return window.getLastPos(); - else - return window.getScreenPosition(); - } - - void setScreenPos (int x, int y) - { - if (! window.isClosed()) - window.setTopLeftPosition(x, y); - } - - //============================================================================== - static void doRun (LV2_External_UI_Widget* _this_) - { - const MessageManagerLock mmLock; - JuceLv2ExternalUIWrapper* self = (JuceLv2ExternalUIWrapper*) _this_; - - if (! self->isClosed()) - self->window.repaint(); - } - - static void doShow (LV2_External_UI_Widget* _this_) - { - const MessageManagerLock mmLock; - JuceLv2ExternalUIWrapper* self = (JuceLv2ExternalUIWrapper*) _this_; - - if (! self->isClosed()) - { - if (! self->window.isOnDesktop()) - self->window.addToDesktop(); - - self->window.restoreLastPos(); - self->window.setVisible(true); - } - } - - static void doHide (LV2_External_UI_Widget* _this_) - { - const MessageManagerLock mmLock; - JuceLv2ExternalUIWrapper* self = (JuceLv2ExternalUIWrapper*) _this_; - - if (! self->isClosed()) - { - self->window.saveLastPos(); - self->window.setVisible(false); - } - } - -private: - JuceLv2ExternalUIWindow window; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLv2ExternalUIWrapper); -}; - -//============================================================================== -/** - Juce LV2 Parent UI container, listens for resize events and passes them to ui-resize -*/ -class JuceLv2ParentContainer : public Component -{ -public: - JuceLv2ParentContainer (AudioProcessorEditor* editor, const LV2UI_Resize* uiResize_) - : uiResize(uiResize_) - { - setOpaque (true); - editor->setOpaque (true); - setBounds (editor->getBounds()); - - editor->setTopLeftPosition (0, 0); - addAndMakeVisible (editor); - } - - ~JuceLv2ParentContainer() - { - } - - void paint (Graphics&) {} - void paintOverChildren (Graphics&) {} - - void childBoundsChanged (Component* child) - { - const int cw = child->getWidth(); - const int ch = child->getHeight(); - -#if JUCE_LINUX - XResizeWindow (display.display, (Window) getWindowHandle(), cw, ch); -#else - setSize (cw, ch); -#endif - - if (uiResize != nullptr) - uiResize->ui_resize (uiResize->handle, cw, ch); - } - - void reset (const LV2UI_Resize* uiResize_) - { - uiResize = uiResize_; - - if (uiResize != nullptr) - uiResize->ui_resize (uiResize->handle, getWidth(), getHeight()); - } - -private: - //============================================================================== - const LV2UI_Resize* uiResize; -#if JUCE_LINUX - ScopedXDisplay display; -#endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLv2ParentContainer); -}; - -//============================================================================== -/** - Juce LV2 UI handle -*/ -class JuceLv2UIWrapper : public AudioProcessorListener, - public Timer -{ -public: - JuceLv2UIWrapper (AudioProcessor* filter_, LV2UI_Write_Function writeFunction_, LV2UI_Controller controller_, - LV2UI_Widget* widget, const LV2_Feature* const* features, bool isExternal_) - : filter (filter_), - writeFunction (writeFunction_), - controller (controller_), - isExternal (isExternal_), - controlPortOffset (0), - lastProgramCount (0), - uiTouch (nullptr), - programsHost (nullptr), - externalUIHost (nullptr), - lastExternalUIPos (-1, -1), - uiResize (nullptr) - { - jassert (filter != nullptr); - - filter->addListener(this); - - if (filter->hasEditor()) - { - editor = filter->createEditorIfNeeded(); - - if (editor == nullptr) - { - *widget = nullptr; - return; - } - } - - for (int i = 0; features[i] != nullptr; ++i) - { - if (strcmp(features[i]->URI, LV2_UI__touch) == 0) - uiTouch = (const LV2UI_Touch*)features[i]->data; - - else if (strcmp(features[i]->URI, LV2_PROGRAMS__Host) == 0) - programsHost = (const LV2_Programs_Host*)features[i]->data; - } - - if (isExternal) - { - resetExternalUI (features); - - if (externalUIHost != nullptr) - { - String title (filter->getName()); - - if (externalUIHost->plugin_human_id != nullptr) - title = externalUIHost->plugin_human_id; - - externalUI = new JuceLv2ExternalUIWrapper (editor, title); - *widget = externalUI; - startTimer (100); - } - else - { - *widget = nullptr; - } - } - else - { - resetParentUI (features); - - if (parentContainer != nullptr) - *widget = parentContainer->getWindowHandle(); - else - *widget = nullptr; - } - -#if (JucePlugin_WantsMidiInput || JucePlugin_WantsLV2TimePos) - controlPortOffset += 1; -#endif -#if JucePlugin_ProducesMidiOutput - controlPortOffset += 1; -#endif - controlPortOffset += 1; // freewheel -#if JucePlugin_WantsLV2Latency - controlPortOffset += 1; -#endif - controlPortOffset += JucePlugin_MaxNumInputChannels; - controlPortOffset += JucePlugin_MaxNumOutputChannels; - - lastProgramCount = filter->getNumPrograms(); - } - - ~JuceLv2UIWrapper() - { - PopupMenu::dismissAllActiveMenus(); - - filter->removeListener(this); - - parentContainer = nullptr; - externalUI = nullptr; - externalUIHost = nullptr; - - if (editor != nullptr) - { - filter->editorBeingDeleted (editor); - editor = nullptr; - } - } - - //============================================================================== - // LV2 core calls - - void lv2Cleanup() - { - const MessageManagerLock mmLock; - - if (isExternal) - { - if (isTimerRunning()) - stopTimer(); - - externalUIHost = nullptr; - - if (externalUI != nullptr) - { - lastExternalUIPos = externalUI->getScreenPosition(); - externalUI->close(); - } - } - else - { - if (parentContainer) - { - parentContainer->setVisible (false); - if (parentContainer->isOnDesktop()) - parentContainer->removeFromDesktop(); - } - } - } - - //============================================================================== - // Juce calls - - void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) - { - if (writeFunction != nullptr && controller != nullptr) - writeFunction (controller, index + controlPortOffset, sizeof (float), 0, &newValue); - } - - void audioProcessorChanged (AudioProcessor*) - { - if (filter != nullptr && programsHost != nullptr) - { - if (filter->getNumPrograms() != lastProgramCount) - { - programsHost->program_changed (programsHost->handle, -1); - lastProgramCount = filter->getNumPrograms(); - } - else - programsHost->program_changed (programsHost->handle, filter->getCurrentProgram()); - } - } - - void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int parameterIndex) - { - if (uiTouch != nullptr) - uiTouch->touch (uiTouch->handle, parameterIndex + controlPortOffset, true); - } - - void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int parameterIndex) - { - if (uiTouch != nullptr) - uiTouch->touch (uiTouch->handle, parameterIndex + controlPortOffset, false); - } - - void timerCallback() - { - if (externalUI != nullptr && externalUI->isClosed()) - { - if (externalUIHost != nullptr) - externalUIHost->ui_closed (controller); - - if (isTimerRunning()) - stopTimer(); - } - } - - //============================================================================== - void resetIfNeeded (LV2UI_Write_Function writeFunction_, LV2UI_Controller controller_, LV2UI_Widget* widget, - const LV2_Feature* const* features) - { - writeFunction = writeFunction_; - controller = controller_; - uiTouch = nullptr; - programsHost = nullptr; - - for (int i = 0; features[i] != nullptr; ++i) - { - if (strcmp(features[i]->URI, LV2_UI__touch) == 0) - uiTouch = (const LV2UI_Touch*)features[i]->data; - - else if (strcmp(features[i]->URI, LV2_PROGRAMS__Host) == 0) - programsHost = (const LV2_Programs_Host*)features[i]->data; - } - - if (isExternal) - { - resetExternalUI (features); - *widget = externalUI; - } - else - { - resetParentUI (features); - *widget = parentContainer->getWindowHandle(); - } - } - - void repaint() - { - const MessageManagerLock mmLock; - - if (editor != nullptr) - editor->repaint(); - - if (parentContainer != nullptr) - parentContainer->repaint(); - - if (externalUI != nullptr) - externalUI->repaint(); - } - -private: - AudioProcessor* const filter; - ScopedPointer editor; - - LV2UI_Write_Function writeFunction; - LV2UI_Controller controller; - const bool isExternal; - - uint32 controlPortOffset; - int lastProgramCount; - - const LV2UI_Touch* uiTouch; - const LV2_Programs_Host* programsHost; - - ScopedPointer externalUI; - const LV2_External_UI_Host* externalUIHost; - Point lastExternalUIPos; - - ScopedPointer parentContainer; - const LV2UI_Resize* uiResize; - -#if JUCE_LINUX - ScopedXDisplay display; -#endif - - //============================================================================== - void resetExternalUI (const LV2_Feature* const* features) - { - externalUIHost = nullptr; - - for (int i = 0; features[i] != nullptr; ++i) - { - if (strcmp(features[i]->URI, LV2_EXTERNAL_UI__Host) == 0) - { - externalUIHost = (const LV2_External_UI_Host*)features[i]->data; - break; - } - } - - if (externalUI != nullptr) - { - String title(filter->getName()); - - if (externalUIHost->plugin_human_id != nullptr) - title = externalUIHost->plugin_human_id; - - if (lastExternalUIPos.getX() != -1 && lastExternalUIPos.getY() != -1) - externalUI->setScreenPos(lastExternalUIPos.getX(), lastExternalUIPos.getY()); - - externalUI->reset(title); - startTimer (100); - } - } - - void resetParentUI (const LV2_Feature* const* features) - { - void* parent = nullptr; - uiResize = nullptr; - - for (int i = 0; features[i] != nullptr; ++i) - { - if (strcmp(features[i]->URI, LV2_UI__parent) == 0) - parent = features[i]->data; - - else if (strcmp(features[i]->URI, LV2_UI__resize) == 0) - uiResize = (const LV2UI_Resize*)features[i]->data; - } - - if (parent != nullptr) - { - if (parentContainer == nullptr) - parentContainer = new JuceLv2ParentContainer (editor, uiResize); - - parentContainer->setVisible (false); - - if (parentContainer->isOnDesktop()) - parentContainer->removeFromDesktop(); - - parentContainer->addToDesktop (0, parent); - -#if JUCE_LINUX - Window hostWindow = (Window) parent; - Window editorWnd = (Window) parentContainer->getWindowHandle(); - XReparentWindow (display.display, editorWnd, hostWindow, 0, 0); -#endif - - parentContainer->reset (uiResize); - parentContainer->setVisible (true); - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLv2UIWrapper) -}; - -#endif /* JUCE_AUDIOPROCESSOR_NO_GUI */ - -//============================================================================== -/** - Juce LV2 handle -*/ -class JuceLv2Wrapper : public AudioPlayHead -{ -public: - //============================================================================== - JuceLv2Wrapper (double sampleRate_, const LV2_Feature* const* features) - : numInChans (JucePlugin_MaxNumInputChannels), - numOutChans (JucePlugin_MaxNumOutputChannels), - bufferSize (2048), - sampleRate (sampleRate_), - uridMap (nullptr), - uridAtomBlank (0), - uridAtomObject (0), - uridAtomDouble (0), - uridAtomFloat (0), - uridAtomInt (0), - uridAtomLong (0), - uridAtomSequence (0), - uridMidiEvent (0), - uridTimePos (0), - uridTimeBar (0), - uridTimeBarBeat (0), - uridTimeBeatsPerBar (0), - uridTimeBeatsPerMinute (0), - uridTimeBeatUnit (0), - uridTimeFrame (0), - uridTimeSpeed (0), - usingNominalBlockLength (false) - { - { - const MessageManagerLock mmLock; - filter = createPluginFilterOfType (AudioProcessor::wrapperType_LV2); - } - jassert (filter != nullptr); - - filter->setPlayConfigDetails (numInChans, numOutChans, 0, 0); - filter->setPlayHead (this); - -#if (JucePlugin_WantsMidiInput || JucePlugin_WantsLV2TimePos) - portEventsIn = nullptr; -#endif -#if JucePlugin_ProducesMidiOutput - portMidiOut = nullptr; -#endif - - portFreewheel = nullptr; - -#if JucePlugin_WantsLV2Latency - portLatency = nullptr; -#endif - - for (int i=0; i < numInChans; ++i) - portAudioIns[i] = nullptr; - for (int i=0; i < numOutChans; ++i) - portAudioOuts[i] = nullptr; - - portControls.insertMultiple (0, nullptr, filter->getNumParameters()); - - for (int i=0; i < filter->getNumParameters(); ++i) - lastControlValues.add (filter->getParameter(i)); - - curPosInfo.resetToDefault(); - - // we need URID_Map first - for (int i=0; features[i] != nullptr; ++i) - { - if (strcmp(features[i]->URI, LV2_URID__map) == 0) - { - uridMap = (const LV2_URID_Map*)features[i]->data; - break; - } - } - - // we require uridMap to work properly (it's set as required feature) - jassert (uridMap != nullptr); - - if (uridMap != nullptr) - { - uridAtomBlank = uridMap->map(uridMap->handle, LV2_ATOM__Blank); - uridAtomObject = uridMap->map(uridMap->handle, LV2_ATOM__Object); - uridAtomDouble = uridMap->map(uridMap->handle, LV2_ATOM__Double); - uridAtomFloat = uridMap->map(uridMap->handle, LV2_ATOM__Float); - uridAtomInt = uridMap->map(uridMap->handle, LV2_ATOM__Int); - uridAtomLong = uridMap->map(uridMap->handle, LV2_ATOM__Long); - uridAtomSequence = uridMap->map(uridMap->handle, LV2_ATOM__Sequence); - uridMidiEvent = uridMap->map(uridMap->handle, LV2_MIDI__MidiEvent); - uridTimePos = uridMap->map(uridMap->handle, LV2_TIME__Position); - uridTimeBar = uridMap->map(uridMap->handle, LV2_TIME__bar); - uridTimeBarBeat = uridMap->map(uridMap->handle, LV2_TIME__barBeat); - uridTimeBeatsPerBar = uridMap->map(uridMap->handle, LV2_TIME__beatsPerBar); - uridTimeBeatsPerMinute = uridMap->map(uridMap->handle, LV2_TIME__beatsPerMinute); - uridTimeBeatUnit = uridMap->map(uridMap->handle, LV2_TIME__beatUnit); - uridTimeFrame = uridMap->map(uridMap->handle, LV2_TIME__frame); - uridTimeSpeed = uridMap->map(uridMap->handle, LV2_TIME__speed); - - for (int i=0; features[i] != nullptr; ++i) - { - if (strcmp(features[i]->URI, LV2_OPTIONS__options) == 0) - { - const LV2_Options_Option* options = (const LV2_Options_Option*)features[i]->data; - - for (int j=0; options[j].key != 0; ++j) - { - if (options[j].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__nominalBlockLength)) - { - if (options[j].type == uridAtomInt) - { - bufferSize = *(int*)options[j].value; - usingNominalBlockLength = true; - } - else - { - std::cerr << "Host provides nominalBlockLength but has wrong value type" << std::endl; - } - break; - } - - if (options[j].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__maxBlockLength)) - { - if (options[j].type == uridAtomInt) - bufferSize = *(int*)options[j].value; - else - std::cerr << "Host provides maxBlockLength but has wrong value type" << std::endl; - - // no break, continue in case host supports nominalBlockLength - } - } - break; - } - } - } - - progDesc.bank = 0; - progDesc.program = 0; - progDesc.name = nullptr; - } - - ~JuceLv2Wrapper () - { - const MessageManagerLock mmLock; - -#if ! JUCE_AUDIOPROCESSOR_NO_GUI - ui = nullptr; -#endif - filter = nullptr; - - if (progDesc.name != nullptr) - free((void*)progDesc.name); - - portControls.clear(); - lastControlValues.clear(); - } - - //============================================================================== - // LV2 core calls - - void lv2ConnectPort (uint32 portId, void* dataLocation) - { - uint32 index = 0; - -#if (JucePlugin_WantsMidiInput || JucePlugin_WantsLV2TimePos) - if (portId == index++) - { - portEventsIn = (LV2_Atom_Sequence*)dataLocation; - return; - } -#endif - -#if JucePlugin_ProducesMidiOutput - if (portId == index++) - { - portMidiOut = (LV2_Atom_Sequence*)dataLocation; - return; - } -#endif - - if (portId == index++) - { - portFreewheel = (float*)dataLocation; - return; - } - -#if JucePlugin_WantsLV2Latency - if (portId == index++) - { - portLatency = (float*)dataLocation; - return; - } -#endif - - for (int i=0; i < numInChans; ++i) - { - if (portId == index++) - { - portAudioIns[i] = (float*)dataLocation; - return; - } - } - - for (int i=0; i < numOutChans; ++i) - { - if (portId == index++) - { - portAudioOuts[i] = (float*)dataLocation; - return; - } - } - - for (int i=0; i < filter->getNumParameters(); ++i) - { - if (portId == index++) - { - portControls.set(i, (float*)dataLocation); - return; - } - } - } - - void lv2Activate() - { - jassert (filter != nullptr); - - filter->prepareToPlay (sampleRate, bufferSize); - filter->setPlayConfigDetails (numInChans, numOutChans, sampleRate, bufferSize); - - channels.calloc (numInChans + numOutChans); - -#if (JucePlugin_WantsMidiInput || JucePlugin_ProducesMidiOutput) - midiEvents.ensureSize (2048); - midiEvents.clear(); -#endif - } - - void lv2Deactivate() - { - jassert (filter != nullptr); - - filter->releaseResources(); - - channels.free(); - } - - void lv2Run (uint32 sampleCount) - { - jassert (filter != nullptr); - -#if JucePlugin_WantsLV2Latency - if (portLatency != nullptr) - *portLatency = filter->getLatencySamples(); -#endif - - if (portFreewheel != nullptr) - filter->setNonRealtime (*portFreewheel >= 0.5f); - - if (sampleCount == 0) - { - /** - LV2 pre-roll - Hosts might use this to force plugins to update its output control ports. - (plugins can only access port locations during run) */ - return; - } - - // Check for updated parameters - { - float curValue; - - for (int i = 0; i < portControls.size(); ++i) - { - if (portControls[i] != nullptr) - { - curValue = *portControls[i]; - - if (lastControlValues[i] != curValue) - { - filter->setParameter (i, curValue); - lastControlValues.setUnchecked (i, curValue); - } - } - } - } - - { - const ScopedLock sl (filter->getCallbackLock()); - - if (filter->isSuspended() && false) - { - for (int i = 0; i < numOutChans; ++i) - zeromem (portAudioOuts[i], sizeof (float) * sampleCount); - } - else - { - int i; - for (i = 0; i < numOutChans; ++i) - { - channels[i] = portAudioOuts[i]; - - if (i < numInChans && portAudioIns[i] != portAudioOuts[i]) - FloatVectorOperations::copy (portAudioOuts [i], portAudioIns[i], sampleCount); - } - - for (; i < numInChans; ++i) - channels [i] = portAudioIns[i]; - -#if (JucePlugin_WantsMidiInput || JucePlugin_WantsLV2TimePos) - if (portEventsIn != nullptr) - { - midiEvents.clear(); - - LV2_ATOM_SEQUENCE_FOREACH(portEventsIn, iter) - { - const LV2_Atom_Event* event = (const LV2_Atom_Event*)iter; - - if (event == nullptr) - continue; - if (event->time.frames >= sampleCount) - break; - - #if JucePlugin_WantsMidiInput - if (event->body.type == uridMidiEvent) - { - const uint8* data = (const uint8*)(event + 1); - midiEvents.addEvent(data, event->body.size, event->time.frames); - continue; - } - #endif - #if JucePlugin_WantsLV2TimePos - if (event->body.type == uridAtomBlank || event->body.type == uridAtomObject) - { - const LV2_Atom_Object* obj = (LV2_Atom_Object*)&event->body; - - if (obj->body.otype != uridTimePos) - continue; - - LV2_Atom* bar = nullptr; - LV2_Atom* barBeat = nullptr; - LV2_Atom* beatUnit = nullptr; - LV2_Atom* beatsPerBar = nullptr; - LV2_Atom* beatsPerMinute = nullptr; - LV2_Atom* frame = nullptr; - LV2_Atom* speed = nullptr; - - lv2_atom_object_get (obj, - uridTimeBar, &bar, - uridTimeBarBeat, &barBeat, - uridTimeBeatUnit, &beatUnit, - uridTimeBeatsPerBar, &beatsPerBar, - uridTimeBeatsPerMinute, &beatsPerMinute, - uridTimeFrame, &frame, - uridTimeSpeed, &speed, - nullptr); - - // need to handle this first as other values depend on it - if (speed != nullptr) - { - /**/ if (speed->type == uridAtomDouble) - lastPositionData.speed = ((LV2_Atom_Double*)speed)->body; - else if (speed->type == uridAtomFloat) - lastPositionData.speed = ((LV2_Atom_Float*)speed)->body; - else if (speed->type == uridAtomInt) - lastPositionData.speed = ((LV2_Atom_Int*)speed)->body; - else if (speed->type == uridAtomLong) - lastPositionData.speed = ((LV2_Atom_Long*)speed)->body; - - curPosInfo.isPlaying = lastPositionData.speed != 0.0; - } - - if (bar != nullptr) - { - /**/ if (bar->type == uridAtomDouble) - lastPositionData.bar = ((LV2_Atom_Double*)bar)->body; - else if (bar->type == uridAtomFloat) - lastPositionData.bar = ((LV2_Atom_Float*)bar)->body; - else if (bar->type == uridAtomInt) - lastPositionData.bar = ((LV2_Atom_Int*)bar)->body; - else if (bar->type == uridAtomLong) - lastPositionData.bar = ((LV2_Atom_Long*)bar)->body; - } - - if (barBeat != nullptr) - { - /**/ if (barBeat->type == uridAtomDouble) - lastPositionData.barBeat = ((LV2_Atom_Double*)barBeat)->body; - else if (barBeat->type == uridAtomFloat) - lastPositionData.barBeat = ((LV2_Atom_Float*)barBeat)->body; - else if (barBeat->type == uridAtomInt) - lastPositionData.barBeat = ((LV2_Atom_Int*)barBeat)->body; - else if (barBeat->type == uridAtomLong) - lastPositionData.barBeat = ((LV2_Atom_Long*)barBeat)->body; - } - - if (beatUnit != nullptr) - { - /**/ if (beatUnit->type == uridAtomDouble) - lastPositionData.beatUnit = ((LV2_Atom_Double*)beatUnit)->body; - else if (beatUnit->type == uridAtomFloat) - lastPositionData.beatUnit = ((LV2_Atom_Float*)beatUnit)->body; - else if (beatUnit->type == uridAtomInt) - lastPositionData.beatUnit = ((LV2_Atom_Int*)beatUnit)->body; - else if (beatUnit->type == uridAtomLong) - lastPositionData.beatUnit = ((LV2_Atom_Long*)beatUnit)->body; - - if (lastPositionData.beatUnit > 0) - curPosInfo.timeSigDenominator = lastPositionData.beatUnit; - } - - if (beatsPerBar != nullptr) - { - /**/ if (beatsPerBar->type == uridAtomDouble) - lastPositionData.beatsPerBar = ((LV2_Atom_Double*)beatsPerBar)->body; - else if (beatsPerBar->type == uridAtomFloat) - lastPositionData.beatsPerBar = ((LV2_Atom_Float*)beatsPerBar)->body; - else if (beatsPerBar->type == uridAtomInt) - lastPositionData.beatsPerBar = ((LV2_Atom_Int*)beatsPerBar)->body; - else if (beatsPerBar->type == uridAtomLong) - lastPositionData.beatsPerBar = ((LV2_Atom_Long*)beatsPerBar)->body; - - if (lastPositionData.beatsPerBar > 0.0f) - curPosInfo.timeSigNumerator = lastPositionData.beatsPerBar; - } - - if (beatsPerMinute != nullptr) - { - /**/ if (beatsPerMinute->type == uridAtomDouble) - lastPositionData.beatsPerMinute = ((LV2_Atom_Double*)beatsPerMinute)->body; - else if (beatsPerMinute->type == uridAtomFloat) - lastPositionData.beatsPerMinute = ((LV2_Atom_Float*)beatsPerMinute)->body; - else if (beatsPerMinute->type == uridAtomInt) - lastPositionData.beatsPerMinute = ((LV2_Atom_Int*)beatsPerMinute)->body; - else if (beatsPerMinute->type == uridAtomLong) - lastPositionData.beatsPerMinute = ((LV2_Atom_Long*)beatsPerMinute)->body; - - if (lastPositionData.beatsPerMinute > 0.0f) - { - curPosInfo.bpm = lastPositionData.beatsPerMinute; - - if (lastPositionData.speed != 0) - curPosInfo.bpm *= std::abs(lastPositionData.speed); - } - } - - if (frame != nullptr) - { - /**/ if (frame->type == uridAtomDouble) - lastPositionData.frame = ((LV2_Atom_Double*)frame)->body; - else if (frame->type == uridAtomFloat) - lastPositionData.frame = ((LV2_Atom_Float*)frame)->body; - else if (frame->type == uridAtomInt) - lastPositionData.frame = ((LV2_Atom_Int*)frame)->body; - else if (frame->type == uridAtomLong) - lastPositionData.frame = ((LV2_Atom_Long*)frame)->body; - - if (lastPositionData.frame >= 0) - { - curPosInfo.timeInSamples = lastPositionData.frame; - curPosInfo.timeInSeconds = double(curPosInfo.timeInSamples)/sampleRate; - } - } - - if (lastPositionData.bar >= 0 && lastPositionData.beatsPerBar > 0.0f) - { - curPosInfo.ppqPositionOfLastBarStart = lastPositionData.bar * lastPositionData.beatsPerBar; - - if (lastPositionData.barBeat >= 0.0f) - curPosInfo.ppqPosition = curPosInfo.ppqPositionOfLastBarStart + lastPositionData.barBeat; - } - - lastPositionData.extraValid = (lastPositionData.beatsPerMinute > 0.0 && - lastPositionData.beatUnit > 0 && - lastPositionData.beatsPerBar > 0.0f); - } - #endif - } - } -#endif - { - AudioSampleBuffer chans (channels, jmax (numInChans, numOutChans), sampleCount); - filter->processBlock (chans, midiEvents); - } - } - } - -#if JucePlugin_WantsLV2TimePos - // update timePos for next callback - if (lastPositionData.speed != 0.0) - { - if (lastPositionData.speed > 0.0) - { - // playing forwards - lastPositionData.frame += sampleCount; - } - else - { - // playing backwards - lastPositionData.frame -= sampleCount; - - if (lastPositionData.frame < 0) - lastPositionData.frame = 0; - } - - curPosInfo.timeInSamples = lastPositionData.frame; - curPosInfo.timeInSeconds = double(curPosInfo.timeInSamples)/sampleRate; - - if (lastPositionData.extraValid) - { - const double beatsPerMinute = lastPositionData.beatsPerMinute * lastPositionData.speed; - const double framesPerBeat = 60.0 * sampleRate / beatsPerMinute; - const double addedBarBeats = double(sampleCount) / framesPerBeat; - - if (lastPositionData.bar >= 0 && lastPositionData.barBeat >= 0.0f) - { - lastPositionData.bar += std::floor((lastPositionData.barBeat+addedBarBeats)/ - lastPositionData.beatsPerBar); - lastPositionData.barBeat = std::fmod(lastPositionData.barBeat+addedBarBeats, - lastPositionData.beatsPerBar); - - if (lastPositionData.bar < 0) - lastPositionData.bar = 0; - - curPosInfo.ppqPositionOfLastBarStart = lastPositionData.bar * lastPositionData.beatsPerBar; - curPosInfo.ppqPosition = curPosInfo.ppqPositionOfLastBarStart + lastPositionData.barBeat; - } - - curPosInfo.bpm = std::abs(beatsPerMinute); - } - } -#endif - -#if JucePlugin_ProducesMidiOutput - if (portMidiOut != nullptr) - { - const uint32_t capacity = portMidiOut->atom.size; - - portMidiOut->atom.size = sizeof(LV2_Atom_Sequence_Body); - portMidiOut->atom.type = uridAtomSequence; - portMidiOut->body.unit = 0; - portMidiOut->body.pad = 0; - - if (! midiEvents.isEmpty()) - { - const uint8* midiEventData; - int midiEventSize, midiEventPosition; - MidiBuffer::Iterator i (midiEvents); - - uint32_t size, offset = 0; - LV2_Atom_Event* aev; - - while (i.getNextEvent (midiEventData, midiEventSize, midiEventPosition)) - { - jassert (midiEventPosition >= 0 && midiEventPosition < (int)sampleCount); - - if (sizeof(LV2_Atom_Event) + midiEventSize > capacity - offset) - break; - - aev = (LV2_Atom_Event*)((char*)LV2_ATOM_CONTENTS(LV2_Atom_Sequence, portMidiOut) + offset); - aev->time.frames = midiEventPosition; - aev->body.type = uridMidiEvent; - aev->body.size = midiEventSize; - memcpy(LV2_ATOM_BODY(&aev->body), midiEventData, midiEventSize); - - size = lv2_atom_pad_size(sizeof(LV2_Atom_Event) + midiEventSize); - offset += size; - portMidiOut->atom.size += size; - } - - midiEvents.clear(); - } - } else -#endif - if (! midiEvents.isEmpty()) - { - midiEvents.clear(); - } - } - - //============================================================================== - // LV2 extended calls - - uint32_t lv2GetOptions (LV2_Options_Option* options) - { - // currently unused - ignoreUnused(options); - - return LV2_OPTIONS_SUCCESS; - } - - uint32_t lv2SetOptions (const LV2_Options_Option* options) - { - for (int j=0; options[j].key != 0; ++j) - { - if (options[j].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__nominalBlockLength)) - { - if (options[j].type == uridAtomInt) - bufferSize = *(int*)options[j].value; - else - std::cerr << "Host changed nominalBlockLength but with wrong value type" << std::endl; - } - else if (options[j].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__maxBlockLength) && ! usingNominalBlockLength) - { - if (options[j].type == uridAtomInt) - bufferSize = *(int*)options[j].value; - else - std::cerr << "Host changed maxBlockLength but with wrong value type" << std::endl; - } - else if (options[j].key == uridMap->map(uridMap->handle, LV2_CORE__sampleRate)) - { - if (options[j].type == uridAtomDouble) - sampleRate = *(double*)options[j].value; - else - std::cerr << "Host changed sampleRate but with wrong value type" << std::endl; - } - } - - return LV2_OPTIONS_SUCCESS; - } - - const LV2_Program_Descriptor* lv2GetProgram (uint32_t index) - { - jassert (filter != nullptr); - - if (progDesc.name != nullptr) - { - free((void*)progDesc.name); - progDesc.name = nullptr; - } - - if ((int)index < filter->getNumPrograms()) - { - progDesc.bank = index / 128; - progDesc.program = index % 128; - progDesc.name = strdup(filter->getProgramName(index).toUTF8()); - return &progDesc; - } - - return nullptr; - } - - void lv2SelectProgram (uint32_t bank, uint32_t program) - { - jassert (filter != nullptr); - - int realProgram = bank * 128 + program; - - if (realProgram < filter->getNumPrograms()) - { - filter->setCurrentProgram(realProgram); - - // update input control ports now - for (int i = 0; i < portControls.size(); ++i) - { - float value = filter->getParameter(i); - - if (portControls[i] != nullptr) - *portControls[i] = value; - - lastControlValues.set(i, value); - } - } - } - - LV2_State_Status lv2SaveState (LV2_State_Store_Function store, LV2_State_Handle stateHandle) - { - jassert (filter != nullptr); - -#if JucePlugin_WantsLV2StateString - String stateData(filter->getStateInformationString().replace("\r\n","\n")); - CharPointer_UTF8 charData(stateData.toUTF8()); - - store (stateHandle, - uridMap->map(uridMap->handle, JUCE_LV2_STATE_STRING_URI), - charData.getAddress(), - charData.sizeInBytes(), - uridMap->map(uridMap->handle, LV2_ATOM__String), - LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE); -#else - MemoryBlock chunkMemory; - filter->getCurrentProgramStateInformation (chunkMemory); - - store (stateHandle, - uridMap->map(uridMap->handle, JUCE_LV2_STATE_BINARY_URI), - chunkMemory.getData(), - chunkMemory.getSize(), - uridMap->map(uridMap->handle, LV2_ATOM__Chunk), - LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE); -#endif - - return LV2_STATE_SUCCESS; - } - - LV2_State_Status lv2RestoreState (LV2_State_Retrieve_Function retrieve, LV2_State_Handle stateHandle, uint32_t flags) - { - jassert (filter != nullptr); - - size_t size = 0; - uint32 type = 0; - const void* data = retrieve (stateHandle, -#if JucePlugin_WantsLV2StateString - uridMap->map(uridMap->handle, JUCE_LV2_STATE_STRING_URI), -#else - uridMap->map(uridMap->handle, JUCE_LV2_STATE_BINARY_URI), -#endif - &size, &type, &flags); - - if (data == nullptr || size == 0 || type == 0) - return LV2_STATE_ERR_UNKNOWN; - -#if JucePlugin_WantsLV2StateString - if (type == uridMap->map (uridMap->handle, LV2_ATOM__String)) - { - String stateData (CharPointer_UTF8(static_cast(data))); - filter->setStateInformationString (stateData); - - #if ! JUCE_AUDIOPROCESSOR_NO_GUI - if (ui != nullptr) - ui->repaint(); - #endif - - return LV2_STATE_SUCCESS; - } -#else - if (type == uridMap->map (uridMap->handle, LV2_ATOM__Chunk)) - { - filter->setCurrentProgramStateInformation (data, size); - - #if ! JUCE_AUDIOPROCESSOR_NO_GUI - if (ui != nullptr) - ui->repaint(); - #endif - - return LV2_STATE_SUCCESS; - } -#endif - - return LV2_STATE_ERR_BAD_TYPE; - } - - //============================================================================== - // Juce calls - - bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) - { -#if JucePlugin_WantsLV2TimePos - info = curPosInfo; - return true; -#else - ignoreUnused(info); - return false; -#endif - } - -#if ! JUCE_AUDIOPROCESSOR_NO_GUI - //============================================================================== - JuceLv2UIWrapper* getUI (LV2UI_Write_Function writeFunction, LV2UI_Controller controller, LV2UI_Widget* widget, - const LV2_Feature* const* features, bool isExternal) - { - const MessageManagerLock mmLock; - - if (ui != nullptr) - ui->resetIfNeeded (writeFunction, controller, widget, features); - else - ui = new JuceLv2UIWrapper (filter, writeFunction, controller, widget, features, isExternal); - - return ui; - } -#endif - -private: -#if JUCE_LINUX - SharedResourcePointer msgThread; -#else - SharedResourcePointer sharedJuceGUI; -#endif - - ScopedPointer filter; -#if ! JUCE_AUDIOPROCESSOR_NO_GUI - ScopedPointer ui; -#endif - HeapBlock channels; - MidiBuffer midiEvents; - int numInChans, numOutChans; - -#if (JucePlugin_WantsMidiInput || JucePlugin_WantsLV2TimePos) - LV2_Atom_Sequence* portEventsIn; -#endif -#if JucePlugin_ProducesMidiOutput - LV2_Atom_Sequence* portMidiOut; -#endif - float* portFreewheel; -#if JucePlugin_WantsLV2Latency - float* portLatency; -#endif - float* portAudioIns[JucePlugin_MaxNumInputChannels]; - float* portAudioOuts[JucePlugin_MaxNumOutputChannels]; - Array portControls; - - uint32 bufferSize; - double sampleRate; - Array lastControlValues; - AudioPlayHead::CurrentPositionInfo curPosInfo; - - struct Lv2PositionData { - int64_t bar; - float barBeat; - uint32_t beatUnit; - float beatsPerBar; - float beatsPerMinute; - int64_t frame; - double speed; - bool extraValid; - - Lv2PositionData() - : bar(-1), - barBeat(-1.0f), - beatUnit(0), - beatsPerBar(0.0f), - beatsPerMinute(0.0f), - frame(-1), - speed(0.0), - extraValid(false) {} - }; - Lv2PositionData lastPositionData; - - const LV2_URID_Map* uridMap; - LV2_URID uridAtomBlank; - LV2_URID uridAtomObject; - LV2_URID uridAtomDouble; - LV2_URID uridAtomFloat; - LV2_URID uridAtomInt; - LV2_URID uridAtomLong; - LV2_URID uridAtomSequence; - LV2_URID uridMidiEvent; - LV2_URID uridTimePos; - LV2_URID uridTimeBar; - LV2_URID uridTimeBarBeat; - LV2_URID uridTimeBeatsPerBar; // timeSigNumerator - LV2_URID uridTimeBeatsPerMinute; // bpm - LV2_URID uridTimeBeatUnit; // timeSigDenominator - LV2_URID uridTimeFrame; // timeInSamples - LV2_URID uridTimeSpeed; - - bool usingNominalBlockLength; // if false use maxBlockLength - - LV2_Program_Descriptor progDesc; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLv2Wrapper) -}; - -//============================================================================== -// LV2 descriptor functions - -static LV2_Handle juceLV2_Instantiate (const LV2_Descriptor*, double sampleRate, const char*, const LV2_Feature* const* features) -{ - return new JuceLv2Wrapper (sampleRate, features); -} - -#define handlePtr ((JuceLv2Wrapper*)handle) - -static void juceLV2_ConnectPort (LV2_Handle handle, uint32 port, void* dataLocation) -{ - handlePtr->lv2ConnectPort (port, dataLocation); -} - -static void juceLV2_Activate (LV2_Handle handle) -{ - handlePtr->lv2Activate(); -} - -static void juceLV2_Run( LV2_Handle handle, uint32 sampleCount) -{ - handlePtr->lv2Run (sampleCount); -} - -static void juceLV2_Deactivate (LV2_Handle handle) -{ - handlePtr->lv2Deactivate(); -} - -static void juceLV2_Cleanup (LV2_Handle handle) -{ - delete handlePtr; -} - -//============================================================================== -// LV2 extended functions - -static uint32_t juceLV2_getOptions (LV2_Handle handle, LV2_Options_Option* options) -{ - return handlePtr->lv2GetOptions(options); -} - -static uint32_t juceLV2_setOptions (LV2_Handle handle, const LV2_Options_Option* options) -{ - return handlePtr->lv2SetOptions(options); -} - -static const LV2_Program_Descriptor* juceLV2_getProgram (LV2_Handle handle, uint32_t index) -{ - return handlePtr->lv2GetProgram(index); -} - -static void juceLV2_selectProgram (LV2_Handle handle, uint32_t bank, uint32_t program) -{ - handlePtr->lv2SelectProgram(bank, program); -} - -static LV2_State_Status juceLV2_SaveState (LV2_Handle handle, LV2_State_Store_Function store, LV2_State_Handle stateHandle, - uint32_t, const LV2_Feature* const*) -{ - return handlePtr->lv2SaveState(store, stateHandle); -} - -static LV2_State_Status juceLV2_RestoreState (LV2_Handle handle, LV2_State_Retrieve_Function retrieve, LV2_State_Handle stateHandle, - uint32_t flags, const LV2_Feature* const*) -{ - return handlePtr->lv2RestoreState(retrieve, stateHandle, flags); -} - -#undef handlePtr - -static const void* juceLV2_ExtensionData (const char* uri) -{ - static const LV2_Options_Interface options = { juceLV2_getOptions, juceLV2_setOptions }; - static const LV2_Programs_Interface programs = { juceLV2_getProgram, juceLV2_selectProgram }; - static const LV2_State_Interface state = { juceLV2_SaveState, juceLV2_RestoreState }; - - if (strcmp(uri, LV2_OPTIONS__interface) == 0) - return &options; - if (strcmp(uri, LV2_PROGRAMS__Interface) == 0) - return &programs; - if (strcmp(uri, LV2_STATE__interface) == 0) - return &state; - - return nullptr; -} - -#if ! JUCE_AUDIOPROCESSOR_NO_GUI -//============================================================================== -// LV2 UI descriptor functions - -static LV2UI_Handle juceLV2UI_Instantiate (LV2UI_Write_Function writeFunction, LV2UI_Controller controller, - LV2UI_Widget* widget, const LV2_Feature* const* features, bool isExternal) -{ - for (int i = 0; features[i] != nullptr; ++i) - { - if (strcmp(features[i]->URI, LV2_INSTANCE_ACCESS_URI) == 0 && features[i]->data != nullptr) - { - JuceLv2Wrapper* wrapper = (JuceLv2Wrapper*)features[i]->data; - return wrapper->getUI(writeFunction, controller, widget, features, isExternal); - } - } - - std::cerr << "Host does not support instance-access, cannot use UI" << std::endl; - return nullptr; -} - -static LV2UI_Handle juceLV2UI_InstantiateExternal (const LV2UI_Descriptor*, const char*, const char*, LV2UI_Write_Function writeFunction, - LV2UI_Controller controller, LV2UI_Widget* widget, const LV2_Feature* const* features) -{ - return juceLV2UI_Instantiate(writeFunction, controller, widget, features, true); -} - -static LV2UI_Handle juceLV2UI_InstantiateParent (const LV2UI_Descriptor*, const char*, const char*, LV2UI_Write_Function writeFunction, - LV2UI_Controller controller, LV2UI_Widget* widget, const LV2_Feature* const* features) -{ - return juceLV2UI_Instantiate(writeFunction, controller, widget, features, false); -} - -static void juceLV2UI_Cleanup (LV2UI_Handle handle) -{ - ((JuceLv2UIWrapper*)handle)->lv2Cleanup(); -} -#endif - -//============================================================================== -// static LV2 Descriptor objects - -static const LV2_Descriptor JuceLv2Plugin = { - strdup(getPluginURI().toRawUTF8()), - juceLV2_Instantiate, - juceLV2_ConnectPort, - juceLV2_Activate, - juceLV2_Run, - juceLV2_Deactivate, - juceLV2_Cleanup, - juceLV2_ExtensionData -}; - -#if ! JUCE_AUDIOPROCESSOR_NO_GUI -static const LV2UI_Descriptor JuceLv2UI_External = { - strdup(String(getPluginURI() + "#ExternalUI").toRawUTF8()), - juceLV2UI_InstantiateExternal, - juceLV2UI_Cleanup, - nullptr, - nullptr -}; - -static const LV2UI_Descriptor JuceLv2UI_Parent = { - strdup(String(getPluginURI() + "#ParentUI").toRawUTF8()), - juceLV2UI_InstantiateParent, - juceLV2UI_Cleanup, - nullptr, - nullptr -}; -#endif - -static const struct DescriptorCleanup { - DescriptorCleanup() {} - ~DescriptorCleanup() - { - free((void*)JuceLv2Plugin.URI); -#if ! JUCE_AUDIOPROCESSOR_NO_GUI - free((void*)JuceLv2UI_External.URI); - free((void*)JuceLv2UI_Parent.URI); -#endif - } -} _descCleanup; - -#if JUCE_WINDOWS - #define JUCE_EXPORTED_FUNCTION extern "C" __declspec (dllexport) -#else - #define JUCE_EXPORTED_FUNCTION extern "C" __attribute__ ((visibility("default"))) -#endif - -//============================================================================== -// startup code.. - -JUCE_EXPORTED_FUNCTION void lv2_generate_ttl (const char* basename); -JUCE_EXPORTED_FUNCTION void lv2_generate_ttl (const char* basename) -{ - createLv2Files (basename); -} - -JUCE_EXPORTED_FUNCTION const LV2_Descriptor* lv2_descriptor (uint32 index); -JUCE_EXPORTED_FUNCTION const LV2_Descriptor* lv2_descriptor (uint32 index) -{ - return (index == 0) ? &JuceLv2Plugin : nullptr; -} - -#if ! JUCE_AUDIOPROCESSOR_NO_GUI -JUCE_EXPORTED_FUNCTION const LV2UI_Descriptor* lv2ui_descriptor (uint32 index); -JUCE_EXPORTED_FUNCTION const LV2UI_Descriptor* lv2ui_descriptor (uint32 index) -{ - switch (index) - { - case 0: - return &JuceLv2UI_External; - case 1: - return &JuceLv2UI_Parent; - default: - return nullptr; - } -} -#endif - -#endif diff -Nru juce-6.1.5~ds0/debian/extra/lv2-ttl-generator/generate-ttl.sh juce-7.0.0~ds0/debian/extra/lv2-ttl-generator/generate-ttl.sh --- juce-6.1.5~ds0/debian/extra/lv2-ttl-generator/generate-ttl.sh 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/extra/lv2-ttl-generator/generate-ttl.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -#!/bin/sh - -#set -e -#echo "Please run this script from the _bin folder" - -error() { - echo "$@" 1>&2 -} - -SCRIPTPATH=$(cd ${0%/*}; pwd) - -if [ -f ${SCRIPTPATH}/lv2_ttl_generator.exe ]; then - GEN=${SCRIPTPATH}/lv2_ttl_generator.exe - EXT=dll -else - GEN=${SCRIPTPATH}/lv2_ttl_generator - EXT=so -fi -if [ ! -x "${GEN}" ]; then - error "unable to find lv2_ttl_generator" - exit 1 -fi - -SEARCHPATH=$1 -if [ "x${SEARCHPATH}" = "x" ]; then - if [ -d "lv2" ]; then - SEARCHPATH="lv2" - fi - if [ ! -d "${SEARCHPATH}" ]; then - SEARCHPATH=. - fi -fi -if [ ! -d "${SEARCHPATH}" ]; then - error "cannot search plugins in non-existing directory ${SEARCHPATH}" - exit 1 -fi - - -find ${SEARCHPATH} -type d -name "*.lv2" -exec /bin/sh -c "cd {}; ${GEN} ./*.${EXT}" \; - diff -Nru juce-6.1.5~ds0/debian/extra/lv2-ttl-generator/GNUmakefile juce-7.0.0~ds0/debian/extra/lv2-ttl-generator/GNUmakefile --- juce-6.1.5~ds0/debian/extra/lv2-ttl-generator/GNUmakefile 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/extra/lv2-ttl-generator/GNUmakefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -#!/usr/bin/makefile -f - -all: build - -build: lv2_ttl_generator -mingw: lv2_ttl_generator.exe - -lv2_ttl_generator: lv2_ttl_generator.c - $(CXX) $(CPPFLAGS) $(CXXFLAGS) lv2_ttl_generator.c -o lv2_ttl_generator -ldl $(LDFLAGS) - -lv2_ttl_generator.exe: lv2_ttl_generator.c - $(CXX) lv2_ttl_generator.c -o lv2_ttl_generator.exe -static - touch lv2_ttl_generator - -clean: - rm -f lv2_ttl_generator lv2_ttl_generator.exe diff -Nru juce-6.1.5~ds0/debian/extra/lv2-ttl-generator/lv2_ttl_generator.c juce-7.0.0~ds0/debian/extra/lv2-ttl-generator/lv2_ttl_generator.c --- juce-6.1.5~ds0/debian/extra/lv2-ttl-generator/lv2_ttl_generator.c 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/extra/lv2-ttl-generator/lv2_ttl_generator.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -/* - * JUCE LV2 *.ttl generator - */ - -#include -#include - -#ifdef _WIN32 - #include - #define TTL_GENERATOR_WINDOWS -#else - #include -#endif - -#ifndef nullptr - #define nullptr (0) -#endif - -typedef void (*TTL_Generator_Function)(const char* basename); - -int main(int argc, char* argv[]) -{ - if (argc != 2) - { - printf("usage: %s /path/to/plugin-DLL\n", argv[0]); - return 1; - } - -#ifdef TTL_GENERATOR_WINDOWS - const HMODULE handle = LoadLibraryA(argv[1]); -#else - void* const handle = dlopen(argv[1], RTLD_LAZY); -#endif - - if (! handle) - { -#ifdef TTL_GENERATOR_WINDOWS - printf("Failed to open plugin DLL\n"); -#else - printf("Failed to open plugin DLL, error was:\n%s\n", dlerror()); -#endif - return 2; - } - -#ifdef TTL_GENERATOR_WINDOWS - const TTL_Generator_Function ttlFn = (TTL_Generator_Function)GetProcAddress(handle, "lv2_generate_ttl"); -#else - const TTL_Generator_Function ttlFn = (TTL_Generator_Function)dlsym(handle, "lv2_generate_ttl"); -#endif - - if (ttlFn != NULL) - { - char basename[strlen(argv[1])+1]; - -#ifdef TTL_GENERATOR_WINDOWS - if (char* base2 = strrchr(argv[1], '\\')) -#else - if (char* base2 = strrchr(argv[1], '/')) -#endif - { - strcpy(basename, base2+1); - basename[strrchr(base2, '.')-base2-1] = '\0'; - } - else - strcpy(basename, argv[1]); - - printf("Generate ttl data for '%s', basename: '%s'\n", argv[1], basename); - - ttlFn(basename); - } - else - printf("Failed to find 'lv2_generate_ttl' function\n"); - -#ifdef TTL_GENERATOR_WINDOWS - FreeLibrary(handle); -#else - dlclose(handle); -#endif - - return 0; -} diff -Nru juce-6.1.5~ds0/debian/extra/lv2-ttl-generator/readme.txt juce-7.0.0~ds0/debian/extra/lv2-ttl-generator/readme.txt --- juce-6.1.5~ds0/debian/extra/lv2-ttl-generator/readme.txt 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/extra/lv2-ttl-generator/readme.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -this lv2_ttl_generator is taken from DISTRHO by Filipe Coelho (aka 'falkTX') - -http://distrho.sourceforge.net -https://github.com/falkTX/DISTRHO - - -this small tool creates the needed .ttl files out of the plug-in binaries (.so) for the .lv2 bundle diff -Nru juce-6.1.5~ds0/debian/juce-modules-source-data.install juce-7.0.0~ds0/debian/juce-modules-source-data.install --- juce-6.1.5~ds0/debian/juce-modules-source-data.install 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/juce-modules-source-data.install 2022-06-28 06:25:52.000000000 +0000 @@ -1,4 +1,3 @@ -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/ usr/include/JUCE*/* /usr/share/juce/ ChangeList.txt /usr/share/juce/ diff -Nru juce-6.1.5~ds0/debian/juce-tools.install juce-7.0.0~ds0/debian/juce-tools.install --- juce-6.1.5~ds0/debian/juce-tools.install 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/juce-tools.install 2022-06-28 06:25:52.000000000 +0000 @@ -2,4 +2,4 @@ debian/artifacts/juce.png usr/share/pixmaps/ */extras/Projucer/Projucer_artefacts/*/Projucer usr/bin/ usr/bin/juce* usr/bin/ -usr/lib/${DEB_HOST_MULTIARCH} +usr/bin/JUCE*/juce* usr/bin/ diff -Nru juce-6.1.5~ds0/debian/patches/cross.patch juce-7.0.0~ds0/debian/patches/cross.patch --- juce-6.1.5~ds0/debian/patches/cross.patch 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/patches/cross.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -From: Debian Multimedia Maintainers -Date: Mon, 16 Mar 2020 13:32:21 +0100 -Subject: cross - ---- - extras/Projucer/Builds/LinuxMakefile/Makefile | 16 ++++++++++------ - 1 file changed, 10 insertions(+), 6 deletions(-) - ---- juce.orig/extras/Projucer/Builds/LinuxMakefile/Makefile -+++ juce/extras/Projucer/Builds/LinuxMakefile/Makefile -@@ -19,6 +19,10 @@ - AR=ar - endif - -+ifndef PKG_CONFIG -+ PKG_CONFIG=pkg-config -+endif -+ - ifndef CONFIG - CONFIG=Debug - endif -@@ -35,13 +39,13 @@ - TARGET_ARCH := - endif - -- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) -+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" - JUCE_TARGET_APP := Projucer - - JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) - JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) -- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) -+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs freetype2) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) - - CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) - endif -@@ -56,13 +60,13 @@ - TARGET_ARCH := - endif - -- JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) -+ JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" - JUCE_TARGET_APP := Projucer - - JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS) - JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) -- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) -+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs freetype2) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) - - CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) - endif -@@ -132,8 +136,8 @@ - all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) - - $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES) -- @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } -- @pkg-config --print-errors freetype2 -+ @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "$(PKG_CONFIG) not installed. Please, install it."; exit 1; } -+ @$(PKG_CONFIG) --print-errors freetype2 - @echo Linking "Projucer - App" - -$(V_AT)mkdir -p $(JUCE_BINDIR) - -$(V_AT)mkdir -p $(JUCE_LIBDIR) diff -Nru juce-6.1.5~ds0/debian/patches/debian_buildcmake.patch juce-7.0.0~ds0/debian/patches/debian_buildcmake.patch --- juce-6.1.5~ds0/debian/patches/debian_buildcmake.patch 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/patches/debian_buildcmake.patch 2022-06-28 06:25:52.000000000 +0000 @@ -15,7 +15,7 @@ --- juce.orig/extras/Build/CMake/JUCEUtils.cmake +++ juce/extras/Build/CMake/JUCEUtils.cmake -@@ -83,6 +83,7 @@ +@@ -87,6 +87,7 @@ if((CMAKE_SYSTEM_NAME STREQUAL "Linux") OR (CMAKE_SYSTEM_NAME MATCHES ".*BSD")) _juce_create_pkgconfig_target(JUCE_CURL_LINUX_DEPS libcurl) _juce_create_pkgconfig_target(JUCE_BROWSER_LINUX_DEPS webkit2gtk-4.0 gtk+-x11-3.0) @@ -23,7 +23,7 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") find_program(JUCE_XCRUN xcrun) -@@ -225,6 +226,8 @@ +@@ -235,6 +236,8 @@ if(needs_browser) target_link_libraries(${target} PRIVATE juce::pkgconfig_JUCE_BROWSER_LINUX_DEPS) endif() diff -Nru juce-6.1.5~ds0/debian/patches/debian_cmake.patch juce-7.0.0~ds0/debian/patches/debian_cmake.patch --- juce-6.1.5~ds0/debian/patches/debian_cmake.patch 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/patches/debian_cmake.patch 2022-06-28 06:25:52.000000000 +0000 @@ -7,16 +7,16 @@ This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ --- juce.orig/extras/Build/CMake/JUCEConfig.cmake.in +++ juce/extras/Build/CMake/JUCEConfig.cmake.in -@@ -20,6 +20,8 @@ +@@ -22,6 +22,8 @@ - @PACKAGE_INIT@ + include("${CMAKE_CURRENT_LIST_DIR}/LV2_HELPER.cmake") +set(PACKAGE_PREFIX_DIR "@CMAKE_INSTALL_PREFIX@") + if(NOT TARGET juce::juceaide) add_executable(juce::juceaide IMPORTED) set_target_properties(juce::juceaide PROPERTIES -@@ -28,11 +30,11 @@ +@@ -30,11 +32,11 @@ check_required_components("@PROJECT_NAME@") @@ -31,7 +31,7 @@ set(_juce_modules juce_analytics -@@ -84,7 +86,7 @@ +@@ -86,7 +88,7 @@ unset(_targets_expected) foreach(_juce_module IN LISTS _juce_modules) diff -Nru juce-6.1.5~ds0/debian/patches/debian_fixed-defines.patch juce-7.0.0~ds0/debian/patches/debian_fixed-defines.patch --- juce-6.1.5~ds0/debian/patches/debian_fixed-defines.patch 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/patches/debian_fixed-defines.patch 2022-06-28 06:25:52.000000000 +0000 @@ -44,7 +44,7 @@ // The following checks should cause a compile error if you've forgotten to // define all your plugin settings properly.. -@@ -39,6 +63,7 @@ +@@ -38,6 +62,7 @@ #endif #define JUCE_CHECKSETTINGMACROS_H diff -Nru juce-6.1.5~ds0/debian/patches/debian_link_systemlibs.patch juce-7.0.0~ds0/debian/patches/debian_link_systemlibs.patch --- juce-6.1.5~ds0/debian/patches/debian_link_systemlibs.patch 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/patches/debian_link_systemlibs.patch 2022-06-28 06:25:52.000000000 +0000 @@ -16,7 +16,7 @@ --- juce.orig/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h +++ juce/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h -@@ -652,6 +652,9 @@ +@@ -692,6 +692,9 @@ StringArray result (linuxLibs); auto libraries = StringArray::fromTokens (getExternalLibrariesString(), ";", "\"'"); @@ -28,7 +28,7 @@ for (auto& lib : libraries) --- juce.orig/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp +++ juce/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp -@@ -520,6 +520,39 @@ +@@ -558,6 +558,39 @@ if (isCurlEnabled (project) && ! isLoadCurlSymbolsLazilyEnabled (project)) packages.add ("libcurl"); diff -Nru juce-6.1.5~ds0/debian/patches/debian_system_modules.patch juce-7.0.0~ds0/debian/patches/debian_system_modules.patch --- juce-6.1.5~ds0/debian/patches/debian_system_modules.patch 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/patches/debian_system_modules.patch 2022-06-28 06:25:52.000000000 +0000 @@ -11,7 +11,7 @@ --- juce.orig/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp +++ juce/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp -@@ -362,7 +362,7 @@ +@@ -352,7 +352,7 @@ } else if (key == Ids::defaultJuceModulePath) { diff -Nru juce-6.1.5~ds0/debian/patches/debian_unittests_globalpaths.patch juce-7.0.0~ds0/debian/patches/debian_unittests_globalpaths.patch --- juce-6.1.5~ds0/debian/patches/debian_unittests_globalpaths.patch 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/patches/debian_unittests_globalpaths.patch 2022-06-28 06:25:52.000000000 +0000 @@ -51,5 +51,5 @@ + + - + diff -Nru juce-6.1.5~ds0/debian/patches/LV2-audioprocessor.patch juce-7.0.0~ds0/debian/patches/LV2-audioprocessor.patch --- juce-6.1.5~ds0/debian/patches/LV2-audioprocessor.patch 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/patches/LV2-audioprocessor.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -From: Filipe Coelho -Date: Sat, 10 Feb 2018 00:00:00 +0100 -Subject: LV2 fixes for autiodprocessor -MIME-Version: 1.0 -Content-Type: text/plain; charset="utf-8" -Content-Transfer-Encoding: 8bit - -Origin: https://github.com/DISTRHO/juce/tree/9f6cdc3659df13169285464ee1d13ef14357f833 -Reviewed-by: IOhannes m zmölnig ---- - .../juce_audio_processors/processors/juce_AudioProcessor.h | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - ---- juce.orig/modules/juce_audio_processors/processors/juce_AudioProcessor.h -+++ juce/modules/juce_audio_processors/processors/juce_AudioProcessor.h -@@ -928,6 +928,7 @@ - */ - virtual void setNonRealtime (bool isNonRealtime) noexcept; - -+ #if ! JUCE_AUDIOPROCESSOR_NO_GUI - //============================================================================== - /** Creates the processor's GUI. - -@@ -977,6 +978,7 @@ - This may call createEditor() internally to create the component. - */ - AudioProcessorEditor* createEditorIfNeeded(); -+ #endif - - //============================================================================== - /** Returns the default number of steps for a parameter. -@@ -1119,6 +1121,11 @@ - virtual void processorLayoutsChanged(); - - //============================================================================== -+ /** LV2 specific calls, saving/restore as string. */ -+ virtual String getStateInformationString () { return String(); } -+ virtual void setStateInformationString (const String&) {} -+ -+ //============================================================================== - /** Adds a listener that will be called when an aspect of this processor changes. */ - virtual void addListener (AudioProcessorListener* newListener); - -@@ -1188,9 +1195,11 @@ - - virtual CurveData getResponseCurve (CurveData::Type /*curveType*/) const { return {}; } - -+ #if ! JUCE_AUDIOPROCESSOR_NO_GUI - //============================================================================== - /** Not for public use - this is called before deleting an editor component. */ - void editorBeingDeleted (AudioProcessorEditor*) noexcept; -+ #endif - - /** Flags to indicate the type of plugin context in which a processor is being used. */ - enum WrapperType -@@ -1204,6 +1213,7 @@ - wrapperType_AAX, - wrapperType_Standalone, - wrapperType_Unity -+ , wrapperType_LV2 - }; - - /** When loaded by a plugin wrapper, this flag will be set to indicate the type -@@ -1463,7 +1473,9 @@ - - //============================================================================== - Array listeners; -+ #if ! JUCE_AUDIOPROCESSOR_NO_GUI - Component::SafePointer activeEditor; -+ #endif - double currentSampleRate = 0; - int blockSize = 0, latencySamples = 0; - bool suspended = false; diff -Nru juce-6.1.5~ds0/debian/patches/overridable_pkg-config.patch juce-7.0.0~ds0/debian/patches/overridable_pkg-config.patch --- juce-6.1.5~ds0/debian/patches/overridable_pkg-config.patch 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/patches/overridable_pkg-config.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -From: Debian Multimedia Maintainers -Date: Mon, 16 Mar 2020 13:32:21 +0100 -Subject: Allow overridable pkg-config in generated Makefiles - -Origin: Debian -Bug: https://github.com/WeAreROLI/JUCE/issues/677 -Last-Update: 2020-03-16 - -E.g. to allow cross-building of juce-packages. -See also https://bugs.debian.org/951684 -Last-Update: 2020-03-16 ---- - .../Source/ProjectSaving/jucer_ProjectExport_Make.h | 13 +++++++++---- - 1 file changed, 9 insertions(+), 4 deletions(-) - ---- juce.orig/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h -+++ juce/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h -@@ -306,8 +306,8 @@ - - if (! packages.isEmpty()) - { -- out << "\t@command -v pkg-config >/dev/null 2>&1 || { echo >&2 \"pkg-config not installed. Please, install it.\"; exit 1; }" << newLine -- << "\t@pkg-config --print-errors"; -+ out << "\t@command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 \"$(PKG_CONFIG) not installed. Please, install it.\"; exit 1; }" << newLine -+ << "\t@$(PKG_CONFIG) --print-errors"; - - for (auto& pkg : packages) - out << " " << pkg; -@@ -562,7 +562,7 @@ - auto compilePackages = getCompilePackages(); - - if (compilePackages.size() > 0) -- return "$(shell pkg-config --cflags " + compilePackages.joinIntoString (" ") + ")"; -+ return "$(shell $(PKG_CONFIG) --cflags " + compilePackages.joinIntoString (" ") + ")"; - - return {}; - } -@@ -572,7 +572,7 @@ - auto linkPackages = getLinkPackages(); - - if (linkPackages.size() > 0) -- return "$(shell pkg-config --libs " + linkPackages.joinIntoString (" ") + ")"; -+ return "$(shell $(PKG_CONFIG) --libs " + linkPackages.joinIntoString (" ") + ")"; - - return {}; - } -@@ -943,6 +943,11 @@ - << "endif" << newLine - << newLine; - -+ out << "ifndef PKG_CONFIG" << newLine -+ << " PKG_CONFIG=pkg-config" << newLine -+ << "endif" << newLine -+ << newLine; -+ - out << "ifndef AR" << newLine - << " AR=ar" << newLine - << "endif" << newLine diff -Nru juce-6.1.5~ds0/debian/patches/series juce-7.0.0~ds0/debian/patches/series --- juce-6.1.5~ds0/debian/patches/series 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/patches/series 2022-06-28 06:25:52.000000000 +0000 @@ -1,4 +1,3 @@ -LV2-audioprocessor.patch debian_fixed-defines.patch debian_no-update-check.patch debian_system_modules.patch @@ -6,7 +5,5 @@ debian_unittests_globalpaths.patch debian_vst.patch debian_link_systemlibs.patch -cross.patch debian_buildcmake.patch -overridable_pkg-config.patch debian_cmake.patch diff -Nru juce-6.1.5~ds0/debian/rules juce-7.0.0~ds0/debian/rules --- juce-6.1.5~ds0/debian/rules 2022-01-31 10:55:24.000000000 +0000 +++ juce-7.0.0~ds0/debian/rules 2022-06-28 06:25:52.000000000 +0000 @@ -57,20 +57,16 @@ $(empty) override_dh_auto_build-arch: - dh_auto_build -- Projucer + dh_auto_build -- Projucer juce_lv2_helper cp $(CURDIR)/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon.png \ $(DEBIAN_BUILD_ARTIFACTS)/juce.png - dh_auto_build -D debian/extra/lv2-ttl-generator/ override_dh_auto_build-indep: + dh_auto_build -- juce_lv2_helper mkdir -p docs/doxygen/build cp docs/JUCE*.md docs/CMake*.md docs/doxygen/build/ make -C docs/doxygen -execute_after_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_install-indep: dh_install --indep -X.tag @@ -85,7 +81,6 @@ execute_after_dh_clean: make -C docs/doxygen/ clean - make -C debian/extra/lv2-ttl-generator/ clean rm -f $(DEBIAN_BUILD_ARTIFACTS)/* diff -Nru "/tmp/tmp3xyzf76u/FU8JCLV1je/juce-6.1.5~ds0/docs/CMake API.md" "/tmp/tmp3xyzf76u/WWZuZyRX_p/juce-7.0.0~ds0/docs/CMake API.md" --- "/tmp/tmp3xyzf76u/FU8JCLV1je/juce-6.1.5~ds0/docs/CMake API.md" 2022-01-26 13:07:09.000000000 +0000 +++ "/tmp/tmp3xyzf76u/WWZuZyRX_p/juce-7.0.0~ds0/docs/CMake API.md" 2022-06-21 07:56:28.000000000 +0000 @@ -427,6 +427,22 @@ plist if `APP_SANDBOX_ENABLED` is `TRUE`. Each key should be in the form `com.apple.security.*` where `*` is a specific entitlement. +`APP_SANDBOX_FILE_ACCESS_HOME_RO` +- A set of space-separated paths that will be added to this target's entitlements plist for + accessing read-only paths relative to the home directory if `APP_SANDBOX_ENABLED` is `TRUE`. + +`APP_SANDBOX_FILE_ACCESS_HOME_RW` +- A set of space-separated paths that will be added to this target's entitlements plist for + accessing read/write paths relative to the home directory if `APP_SANDBOX_ENABLED` is `TRUE`. + +`APP_SANDBOX_FILE_ACCESS_ABS_RO` +- A set of space-separated paths that will be added to this target's entitlements plist for + accessing read-only absolute paths if `APP_SANDBOX_ENABLED` is `TRUE`. + +`APP_SANDBOX_FILE_ACCESS_ABS_RW` +- A set of space-separated paths that will be added to this target's entitlements plist for + accessing read/write absolute paths if `APP_SANDBOX_ENABLED` is `TRUE`. + `PLIST_TO_MERGE` - A string to insert into an app/plugin's Info.plist. @@ -583,6 +599,40 @@ Unlike the other `COPY_DIR` arguments, this argument does not have a default value so be sure to set it if you have enabled `COPY_PLUGIN_AFTER_BUILD` and the `Unity` format. +`IS_ARA_EFFECT` +- May be either TRUE or FALSE (defaults to FALSE). If TRUE it enables additional codepaths in the + VST3 and AU plugin wrappers allowing compatible hosts to load the plugin with additional ARA + functionality. It will also add the preprocessor definition `JucePlugin_Enable_ARA=1`, which can + be used in preprocessor conditions inside the plugin code. You should not add this definition + using `target_compile_definitions` manually. + +`ARA_FACTORY_ID` +- A globally unique and versioned identifier string. If not provided a sensible default will be + generated using the `BUNDLE_ID` and `VERSION` values. The version must be updated if e.g. the + plugin's (compatible) document archive ID(s) or its analysis or playback transformation + capabilities change. + +`ARA_DOCUMENT_ARCHIVE_ID` +- Identifier string for document archives created by the document controller. This ID must be + globally unique and is shared only amongst document controllers that create the same archives and + produce the same render results based upon the same input data. This means that the ID must be + updated if the archive format changes in any way that is no longer downwards compatible. If not + provided a version independent default will be created that is only appropriate as long as the + format remains unchanged. + +`ARA_ANALYSIS_TYPES` +- Defaults to having no analyzable types. Should be one or more of the following values if the + document controller has the corresponding analysis capability: `kARAContentTypeNotes`, + `kARAContentTypeTempoEntries`, `kARAContentTypeBarSignatures`, `kARAContentTypeStaticTuning `, + `kARAContentTypeKeySignatures`, `kARAContentTypeSheetChords` + +`ARA_TRANSFORMATION_FLAGS` +- Defaults to `kARAPlaybackTransformationNoChanges`. If the document controller has the ability to + provide the corresponding change it should be one or more of: + `kARAPlaybackTransformationTimestretch`, `kARAPlaybackTransformationTimestretchReflectingTempo`, + `kARAPlaybackTransformationContentBasedFadeAtTail`, + `kARAPlaybackTransformationContentBasedFadeAtHead` + #### `juce_add_binary_data` juce_add_binary_data( @@ -648,10 +698,11 @@ juce_set_aax_sdk_path() juce_set_vst2_sdk_path() juce_set_vst3_sdk_path() + juce_set_ara_sdk_path() -Call these functions from your CMakeLists to set up your local AAX, VST2, and VST3 SDKs. These -functions should be called *before* adding any targets that may depend on the AAX/VST2/VST3 SDKs -(plugin hosts, AAX/VST2/VST3 plugins etc.). +Call these functions from your CMakeLists to set up your local AAX, VST2, VST3 and ARA SDKs. These +functions should be called *before* adding any targets that may depend on the AAX/VST2/VST3/ARA SDKs +(plugin hosts, AAX/VST2/VST3/ARA plugins etc.). #### `juce_add_module` diff -Nru "/tmp/tmp3xyzf76u/FU8JCLV1je/juce-6.1.5~ds0/docs/JUCE Module Format.md" "/tmp/tmp3xyzf76u/WWZuZyRX_p/juce-7.0.0~ds0/docs/JUCE Module Format.md" --- "/tmp/tmp3xyzf76u/FU8JCLV1je/juce-6.1.5~ds0/docs/JUCE Module Format.md" 2022-01-26 13:07:09.000000000 +0000 +++ "/tmp/tmp3xyzf76u/WWZuZyRX_p/juce-7.0.0~ds0/docs/JUCE Module Format.md" 2022-06-21 07:56:28.000000000 +0000 @@ -185,11 +185,18 @@ parent folder, which need to be added to a project's header search path - OSXFrameworks - - (Optional) A list (space or comma-separated) of OSX frameworks that are needed + - (Optional) A list (space or comma-separated) of OSX frameworks that are needed by this module + +- WeakOSXFrameworks + - (Optional) A list (space or comma-separated) of weak linked OSX frameworks that are needed by this module - iOSFrameworks - - (Optional) Like OSXFrameworks, but for iOS targets + - (Optional) A list (space or comma-separated) of iOS frameworks that are needed by this module + +- WeakiOSFrameworks + - (Optional) A list (space or comma-separated) of weak linked iOS frameworks that are needed + by this module - linuxPackages - (Optional) A list (space or comma-separated) pkg-config packages that should be used to pass diff -Nru juce-6.1.5~ds0/examples/Assets/AudioLiveScrollingDisplay.h juce-7.0.0~ds0/examples/Assets/AudioLiveScrollingDisplay.h --- juce-6.1.5~ds0/examples/Assets/AudioLiveScrollingDisplay.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Assets/AudioLiveScrollingDisplay.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/examples/Assets/DemoUtilities.h juce-7.0.0~ds0/examples/Assets/DemoUtilities.h --- juce-6.1.5~ds0/examples/Assets/DemoUtilities.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Assets/DemoUtilities.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/examples/Assets/DSPDemos_Common.h juce-7.0.0~ds0/examples/Assets/DSPDemos_Common.h --- juce-6.1.5~ds0/examples/Assets/DSPDemos_Common.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Assets/DSPDemos_Common.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/examples/Assets/WavefrontObjParser.h juce-7.0.0~ds0/examples/Assets/WavefrontObjParser.h --- juce-6.1.5~ds0/examples/Assets/WavefrontObjParser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Assets/WavefrontObjParser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/examples/Audio/AudioAppDemo.h juce-7.0.0~ds0/examples/Audio/AudioAppDemo.h --- juce-6.1.5~ds0/examples/Audio/AudioAppDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Audio/AudioAppDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Audio/AudioLatencyDemo.h juce-7.0.0~ds0/examples/Audio/AudioLatencyDemo.h --- juce-6.1.5~ds0/examples/Audio/AudioLatencyDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Audio/AudioLatencyDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Audio/AudioPlaybackDemo.h juce-7.0.0~ds0/examples/Audio/AudioPlaybackDemo.h --- juce-6.1.5~ds0/examples/Audio/AudioPlaybackDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Audio/AudioPlaybackDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone type: Component mainClass: AudioPlaybackDemo diff -Nru juce-6.1.5~ds0/examples/Audio/AudioRecordingDemo.h juce-7.0.0~ds0/examples/Audio/AudioRecordingDemo.h --- juce-6.1.5~ds0/examples/Audio/AudioRecordingDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Audio/AudioRecordingDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Audio/AudioSettingsDemo.h juce-7.0.0~ds0/examples/Audio/AudioSettingsDemo.h --- juce-6.1.5~ds0/examples/Audio/AudioSettingsDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Audio/AudioSettingsDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Audio/AudioSynthesiserDemo.h juce-7.0.0~ds0/examples/Audio/AudioSynthesiserDemo.h --- juce-6.1.5~ds0/examples/Audio/AudioSynthesiserDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Audio/AudioSynthesiserDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Audio/CMakeLists.txt juce-7.0.0~ds0/examples/Audio/CMakeLists.txt --- juce-6.1.5~ds0/examples/Audio/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Audio/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/Audio/MidiDemo.h juce-7.0.0~ds0/examples/Audio/MidiDemo.h --- juce-6.1.5~ds0/examples/Audio/MidiDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Audio/MidiDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Audio/MPEDemo.h juce-7.0.0~ds0/examples/Audio/MPEDemo.h --- juce-6.1.5~ds0/examples/Audio/MPEDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Audio/MPEDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Audio/PluckedStringsDemo.h juce-7.0.0~ds0/examples/Audio/PluckedStringsDemo.h --- juce-6.1.5~ds0/examples/Audio/PluckedStringsDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Audio/PluckedStringsDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Audio/SimpleFFTDemo.h juce-7.0.0~ds0/examples/Audio/SimpleFFTDemo.h --- juce-6.1.5~ds0/examples/Audio/SimpleFFTDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Audio/SimpleFFTDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/CMake/CMakeLists.txt juce-7.0.0~ds0/examples/CMake/CMakeLists.txt --- juce-6.1.5~ds0/examples/CMake/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/CMake/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/CMakeLists.txt juce-7.0.0~ds0/examples/CMakeLists.txt --- juce-6.1.5~ds0/examples/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -41,6 +41,12 @@ "${CMAKE_CURRENT_SOURCE_DIR}/PushNotificationsDemo.h") endif() + if(NOT (TARGET juce_ara_sdk + AND (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR CMAKE_SYSTEM_NAME STREQUAL "Darwin"))) + list(REMOVE_ITEM headers + "${CMAKE_CURRENT_SOURCE_DIR}/ARAPluginDemo.h") + endif() + foreach(header IN ITEMS ${headers}) juce_add_pip(${header} added_target) target_link_libraries(${added_target} PUBLIC diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/Android/app/CMakeLists.txt juce-7.0.0~ds0/examples/DemoRunner/Builds/Android/app/CMakeLists.txt --- juce-6.1.5~ds0/examples/DemoRunner/Builds/Android/app/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/Android/app/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -12,9 +12,18 @@ add_library("cpufeatures" STATIC "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c") set_source_files_properties("${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c" PROPERTIES COMPILE_FLAGS "-Wno-sign-conversion -Wno-gnu-statement-expression") -add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_CONTENT_SHARING=1]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.5]] [[-DJUCE_APP_VERSION_HEX=0x60105]]) +add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_CONTENT_SHARING=1]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.0]] [[-DJUCE_APP_VERSION_HEX=0x70000]]) include_directories( AFTER + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK" "../../../JuceLibraryCode" "../../../../../modules" "${ANDROID_NDK}/sources/android/cpufeatures" @@ -23,9 +32,9 @@ enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.5]] [[-DJUCE_APP_VERSION_HEX=0x60105]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.0]] [[-DJUCE_APP_VERSION_HEX=0x70000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.5]] [[-DJUCE_APP_VERSION_HEX=0x60105]] [[-DNDEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.0]] [[-DJUCE_APP_VERSION_HEX=0x70000]] [[-DNDEBUG=1]]) else() message( FATAL_ERROR "No matching build-configuration found." ) endif() @@ -66,6 +75,7 @@ "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" @@ -80,7 +90,6 @@ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" - "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" @@ -117,6 +126,7 @@ "../../../../../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/native/juce_mac_CoreAudioTimeConversions.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" @@ -159,9 +169,9 @@ "../../../../../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_SampleRateHelpers.cpp" "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" - "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" @@ -455,6 +465,8 @@ "../../../../../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_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.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" @@ -479,6 +491,116 @@ "../../../../../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/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" "../../../../../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" @@ -576,16 +698,27 @@ "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.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_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.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_VST3PluginFormat_test.cpp" "../../../../../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" @@ -614,6 +747,17 @@ "../../../../../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/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.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" @@ -627,6 +771,9 @@ "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" "../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" @@ -637,6 +784,8 @@ "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" @@ -784,9 +933,12 @@ "../../../../../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.cpp" "../../../../../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_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.h" "../../../../../modules/juce_core/containers/juce_PropertySet.cpp" @@ -800,6 +952,9 @@ "../../../../../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_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.h" "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" "../../../../../modules/juce_core/files/juce_DirectoryIterator.h" "../../../../../modules/juce_core/files/juce_File.cpp" @@ -866,6 +1021,7 @@ "../../../../../modules/juce_core/misc/juce_Uuid.h" "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" "../../../../../modules/juce_core/native/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" "../../../../../modules/juce_core/native/juce_android_Files.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" @@ -1177,6 +1333,7 @@ "../../../../../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_EventLoopInternal.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" @@ -1554,10 +1711,12 @@ "../../../../../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_PointerState.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/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" @@ -1589,13 +1748,13 @@ "../../../../../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_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" "../../../../../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" @@ -1738,8 +1897,8 @@ "../../../../../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_NSViewFrameWatcher.h" "../../../../../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" @@ -1840,6 +1999,8 @@ "../../../JuceLibraryCode/include_juce_audio_devices.cpp" "../../../JuceLibraryCode/include_juce_audio_formats.cpp" "../../../JuceLibraryCode/include_juce_audio_processors.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_ara.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp" "../../../JuceLibraryCode/include_juce_audio_utils.cpp" "../../../JuceLibraryCode/include_juce_box2d.cpp" "../../../JuceLibraryCode/include_juce_core.cpp" @@ -1857,1811 +2018,1963 @@ "../../../JuceLibraryCode/JuceHeader.h" ) -set_source_files_properties("../../../Source/Demos/IntroScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/Demos/JUCEDemos.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/UI/DemoContentComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/UI/MainComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/UI/SettingsContent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/JUCEAppIcon.png" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/analytics/juce_Analytics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/analytics/juce_Analytics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/analytics/juce_ButtonTracker.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/analytics/juce_ButtonTracker.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/destinations/juce_AnalyticsDestination.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/juce_analytics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/juce_analytics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Bela.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/assert.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/callback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/compat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/export.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2ChainShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2ChainShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2CircleShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2CircleShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2EdgeShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2EdgeShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2PolygonShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2PolygonShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2Shape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2BroadPhase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2BroadPhase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2CollideCircle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2CollideEdge.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2CollidePolygon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2Collision.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2Collision.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2Distance.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2Distance.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2DynamicTree.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2DynamicTree.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2TimeOfImpact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2TimeOfImpact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2BlockAllocator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2BlockAllocator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Draw.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Draw.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2GrowableStack.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Math.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Math.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Settings.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Settings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2StackAllocator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2StackAllocator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Timer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Timer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndCircleContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndCircleContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndPolygonContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndPolygonContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2CircleContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2CircleContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2Contact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2Contact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ContactSolver.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ContactSolver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndCircleContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndCircleContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndPolygonContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonAndCircleContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonAndCircleContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2DistanceJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2DistanceJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2FrictionJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2FrictionJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2GearJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2GearJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2Joint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2Joint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2MouseJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2MouseJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2PrismaticJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2PrismaticJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2PulleyJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2PulleyJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2RevoluteJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2RevoluteJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2RopeJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2RopeJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2WeldJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2WeldJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2WheelJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2WheelJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2Body.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2Body.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2ContactManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2ContactManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2Fixture.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2Fixture.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2Island.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2Island.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2TimeStep.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2World.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2World.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2WorldCallbacks.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2WorldCallbacks.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Rope/b2Rope.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Rope/b2Rope.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Box2D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/README.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/utils/juce_Box2DRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/utils/juce_Box2DRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/juce_box2d.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/juce_box2d.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_MathsFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_NormalisableRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Range.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Reservoir.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Functional.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/java/README.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Misc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_curl_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_intel_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_CFHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Files.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Network.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Strings.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Registry.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerSupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerWarnings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_PlatformDefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_StandardHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_TargetPlatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_NewLine.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringRef.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_CriticalSection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_InterProcessLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Process.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_SpinLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTestCategories.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/adler32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/compress.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/infback.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/uncompr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.in.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zlib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_BlowFish.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_BlowFish.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_Primes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_Primes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_RSAKey.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_RSAKey.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_MD5.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_MD5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_SHA256.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_SHA256.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_AudioBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_AudioBlock_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister_Impl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Windowing.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_FastMathApproximations.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LogRampedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LogRampedValue_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LookupTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LookupTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Phase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Polynomial.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DelayLine.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DelayLine.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DryWetMixer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DryWetMixer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter_Impl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Panner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Panner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Bias.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Chorus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Chorus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Compressor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Compressor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Gain.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_LadderFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_LadderFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Limiter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Limiter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_NoiseGate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_NoiseGate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Oscillator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Phaser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Phaser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_WaveShaper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Initialisation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Message.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_NotificationType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_android_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_EventLoop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Line.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Parallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Point.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ScaledImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_Justification.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_common_MimeTypes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_MessageBoxOptions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_HWNDComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Draggable3DOrientation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Matrix3D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Quaternion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Vector3D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_android.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_ios.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_linux_X11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_osx.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_win32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGLExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gl.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gles2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gles2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_khrplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_wgl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCArgument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCArgument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCBundle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCBundle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCMessage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCReceiver.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCSender.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCSender.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTimeTag.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTimeTag.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTypes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/juce_osc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/juce_osc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/juce_product_unlocking.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/juce_product_unlocking.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/juce_product_unlocking.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_android_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_android_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_ios_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_win32_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_win32_ComTypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_win32_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/playback/juce_VideoComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/playback/juce_VideoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/juce_video.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/juce_video.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/juce_video.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../JuceLibraryCode/JuceHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties( + "../../../Source/Demos/IntroScreen.h" + "../../../Source/Demos/JUCEDemos.h" + "../../../Source/UI/DemoContentComponent.h" + "../../../Source/UI/MainComponent.h" + "../../../Source/UI/SettingsContent.h" + "../../../Source/JUCEAppIcon.png" + "../../../../../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/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_AudioProcessLoadMeasurer.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.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/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.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/native/juce_mac_CoreAudioTimeConversions.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_ADSR_test.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" + "../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" + "../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" + "../../../../../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_basics/utilities/juce_WindowedSincInterpolator.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.mm" + "../../../../../modules/juce_audio_basics/juce_audio_basics.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_SampleRateHelpers.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" + "../../../../../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/oboe/include/oboe/AudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" + "../../../../../modules/juce_audio_devices/native/oboe/README.md" + "../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" + "../../../../../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.mm" + "../../../../../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_audio_devices/juce_audio_devices.cpp" + "../../../../../modules/juce_audio_devices/juce_audio_devices.mm" + "../../../../../modules/juce_audio_devices/juce_audio_devices.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/assert.h" + "../../../../../modules/juce_audio_formats/codecs/flac/callback.h" + "../../../../../modules/juce_audio_formats/codecs/flac/compat.h" + "../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" + "../../../../../modules/juce_audio_formats/codecs/flac/export.h" + "../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/flac/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.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_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.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/sampler/juce_Sampler.cpp" + "../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" + "../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" + "../../../../../modules/juce_audio_formats/juce_audio_formats.mm" + "../../../../../modules/juce_audio_formats/juce_audio_formats.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/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" + "../../../../../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/base/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/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/ivstparameterfunctionname.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/ivsttestplugprovider.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/vstspeaker.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" + "../../../../../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" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.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_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.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_VST3PluginFormat_test.cpp" + "../../../../../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/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_AudioProcessorEditorHostContext.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_HostedAudioProcessorParameter.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/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.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_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" + "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.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_KeyboardComponentBase.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" + "../../../../../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_win_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.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_audio_utils/juce_audio_utils.cpp" + "../../../../../modules/juce_audio_utils/juce_audio_utils.mm" + "../../../../../modules/juce_audio_utils/juce_audio_utils.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/b2Draw.cpp" + "../../../../../modules/juce_box2d/box2d/Common/b2Draw.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/Common/b2Timer.cpp" + "../../../../../modules/juce_box2d/box2d/Common/b2Timer.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.cpp" + "../../../../../modules/juce_box2d/box2d/Rope/b2Rope.h" + "../../../../../modules/juce_box2d/box2d/Box2D.h" + "../../../../../modules/juce_box2d/box2d/README.txt" + "../../../../../modules/juce_box2d/utils/juce_Box2DRenderer.cpp" + "../../../../../modules/juce_box2d/utils/juce_Box2DRenderer.h" + "../../../../../modules/juce_box2d/juce_box2d.cpp" + "../../../../../modules/juce_box2d/juce_box2d.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.cpp" + "../../../../../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_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" + "../../../../../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_SingleThreadedAbstractFifo.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_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.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_RangedDirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.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_Javascript.cpp" + "../../../../../modules/juce_core/javascript/juce_Javascript.h" + "../../../../../modules/juce_core/javascript/juce_JSON.cpp" + "../../../../../modules/juce_core/javascript/juce_JSON.h" + "../../../../../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_AllocationHooks.cpp" + "../../../../../modules/juce_core/memory/juce_AllocationHooks.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_Reservoir.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_Functional.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/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" + "../../../../../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_BasicNativeHeaders.h" + "../../../../../modules/juce_core/native/juce_curl_Network.cpp" + "../../../../../modules/juce_core/native/juce_intel_SharedCode.h" + "../../../../../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_CFHelpers.h" + "../../../../../modules/juce_core/native/juce_mac_Files.mm" + "../../../../../modules/juce_core/native/juce_mac_Network.mm" + "../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" + "../../../../../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_posix_IPAddress.h" + "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" + "../../../../../modules/juce_core/native/juce_posix_SharedCode.h" + "../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" + "../../../../../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_CompilerWarnings.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_CharacterFunctions.cpp" + "../../../../../modules/juce_core/text/juce_CharacterFunctions.h" + "../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF32.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.cpp" + "../../../../../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/zlib/adler32.c" + "../../../../../modules/juce_core/zip/zlib/compress.c" + "../../../../../modules/juce_core/zip/zlib/crc32.c" + "../../../../../modules/juce_core/zip/zlib/crc32.h" + "../../../../../modules/juce_core/zip/zlib/deflate.c" + "../../../../../modules/juce_core/zip/zlib/deflate.h" + "../../../../../modules/juce_core/zip/zlib/infback.c" + "../../../../../modules/juce_core/zip/zlib/inffast.c" + "../../../../../modules/juce_core/zip/zlib/inffast.h" + "../../../../../modules/juce_core/zip/zlib/inffixed.h" + "../../../../../modules/juce_core/zip/zlib/inflate.c" + "../../../../../modules/juce_core/zip/zlib/inflate.h" + "../../../../../modules/juce_core/zip/zlib/inftrees.c" + "../../../../../modules/juce_core/zip/zlib/inftrees.h" + "../../../../../modules/juce_core/zip/zlib/trees.c" + "../../../../../modules/juce_core/zip/zlib/trees.h" + "../../../../../modules/juce_core/zip/zlib/uncompr.c" + "../../../../../modules/juce_core/zip/zlib/zconf.h" + "../../../../../modules/juce_core/zip/zlib/zconf.in.h" + "../../../../../modules/juce_core/zip/zlib/zlib.h" + "../../../../../modules/juce_core/zip/zlib/zutil.c" + "../../../../../modules/juce_core/zip/zlib/zutil.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_core/juce_core.cpp" + "../../../../../modules/juce_core/juce_core.mm" + "../../../../../modules/juce_core/juce_core.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.mm" + "../../../../../modules/juce_cryptography/juce_cryptography.h" + "../../../../../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/undomanager/juce_UndoableAction.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.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_ValueTreePropertyWithDefault.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" + "../../../../../modules/juce_data_structures/juce_data_structures.cpp" + "../../../../../modules/juce_data_structures/juce_data_structures.mm" + "../../../../../modules/juce_data_structures/juce_data_structures.h" + "../../../../../modules/juce_dsp/containers/juce_AudioBlock.h" + "../../../../../modules/juce_dsp/containers/juce_AudioBlock_test.cpp" + "../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction.h" + "../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp" + "../../../../../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_Convolution_test.cpp" + "../../../../../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/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_BallisticsFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.h" + "../../../../../modules/juce_dsp/processors/juce_DelayLine.cpp" + "../../../../../modules/juce_dsp/processors/juce_DelayLine.h" + "../../../../../modules/juce_dsp/processors/juce_DryWetMixer.cpp" + "../../../../../modules/juce_dsp/processors/juce_DryWetMixer.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_FirstOrderTPTFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.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_LinkwitzRileyFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h" + "../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp" + "../../../../../modules/juce_dsp/processors/juce_Oversampling.h" + "../../../../../modules/juce_dsp/processors/juce_Panner.cpp" + "../../../../../modules/juce_dsp/processors/juce_Panner.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessContext.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp" + "../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h" + "../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h" + "../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.h" + "../../../../../modules/juce_dsp/widgets/juce_Bias.h" + "../../../../../modules/juce_dsp/widgets/juce_Chorus.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Chorus.h" + "../../../../../modules/juce_dsp/widgets/juce_Compressor.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Compressor.h" + "../../../../../modules/juce_dsp/widgets/juce_Gain.h" + "../../../../../modules/juce_dsp/widgets/juce_LadderFilter.cpp" + "../../../../../modules/juce_dsp/widgets/juce_LadderFilter.h" + "../../../../../modules/juce_dsp/widgets/juce_Limiter.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Limiter.h" + "../../../../../modules/juce_dsp/widgets/juce_NoiseGate.cpp" + "../../../../../modules/juce_dsp/widgets/juce_NoiseGate.h" + "../../../../../modules/juce_dsp/widgets/juce_Oscillator.h" + "../../../../../modules/juce_dsp/widgets/juce_Phaser.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Phaser.h" + "../../../../../modules/juce_dsp/widgets/juce_Reverb.h" + "../../../../../modules/juce_dsp/widgets/juce_WaveShaper.h" + "../../../../../modules/juce_dsp/juce_dsp.cpp" + "../../../../../modules/juce_dsp/juce_dsp.mm" + "../../../../../modules/juce_dsp/juce_dsp.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/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_EventLoopInternal.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_ScopedLowPowerModeDisabler.cpp" + "../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.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_events/juce_events.cpp" + "../../../../../modules/juce_events/juce_events.mm" + "../../../../../modules/juce_events/juce_events.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_Rectangle_test.cpp" + "../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" + "../../../../../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/images/juce_ScaledImage.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_RenderingHelpers.h" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.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_graphics/juce_graphics.cpp" + "../../../../../modules/juce_graphics/juce_graphics.mm" + "../../../../../modules/juce_graphics/juce_graphics.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.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_ComponentTraverser.h" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.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_FilenameComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.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_ImagePreviewComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.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_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_FocusOutline.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.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_PointerState.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/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.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_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_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" + "../../../../../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_MultiTouchMapper.h" + "../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" + "../../../../../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_ScopedThreadDPIAwarenessSetter.h" + "../../../../../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_MessageBoxOptions.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_basics/juce_gui_basics.cpp" + "../../../../../modules/juce_gui_basics/juce_gui_basics.mm" + "../../../../../modules/juce_gui_basics/juce_gui_basics.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_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_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_HWNDComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" + "../../../../../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_android_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.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_NSViewComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" + "../../../../../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_HWNDComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.mm" + "../../../../../modules/juce_gui_extra/juce_gui_extra.h" + "../../../../../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/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/native/juce_OpenGLExtensions.h" + "../../../../../modules/juce_opengl/opengl/juce_gl.cpp" + "../../../../../modules/juce_opengl/opengl/juce_gl.h" + "../../../../../modules/juce_opengl/opengl/juce_gles2.cpp" + "../../../../../modules/juce_opengl/opengl/juce_gles2.h" + "../../../../../modules/juce_opengl/opengl/juce_khrplatform.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/opengl/juce_wgl.h" + "../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp" + "../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h" + "../../../../../modules/juce_opengl/juce_opengl.cpp" + "../../../../../modules/juce_opengl/juce_opengl.mm" + "../../../../../modules/juce_opengl/juce_opengl.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_osc/juce_osc.cpp" + "../../../../../modules/juce_osc/juce_osc.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/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_product_unlocking/juce_product_unlocking.cpp" + "../../../../../modules/juce_product_unlocking/juce_product_unlocking.mm" + "../../../../../modules/juce_product_unlocking/juce_product_unlocking.h" + "../../../../../modules/juce_video/capture/juce_CameraDevice.cpp" + "../../../../../modules/juce_video/capture/juce_CameraDevice.h" + "../../../../../modules/juce_video/native/juce_android_CameraDevice.h" + "../../../../../modules/juce_video/native/juce_android_Video.h" + "../../../../../modules/juce_video/native/juce_ios_CameraDevice.h" + "../../../../../modules/juce_video/native/juce_mac_CameraDevice.h" + "../../../../../modules/juce_video/native/juce_mac_Video.h" + "../../../../../modules/juce_video/native/juce_win32_CameraDevice.h" + "../../../../../modules/juce_video/native/juce_win32_ComTypes.h" + "../../../../../modules/juce_video/native/juce_win32_Video.h" + "../../../../../modules/juce_video/playback/juce_VideoComponent.cpp" + "../../../../../modules/juce_video/playback/juce_VideoComponent.h" + "../../../../../modules/juce_video/juce_video.cpp" + "../../../../../modules/juce_video/juce_video.mm" + "../../../../../modules/juce_video/juce_video.h" + "../../../JuceLibraryCode/JuceHeader.h" + PROPERTIES HEADER_FILE_ONLY TRUE) target_compile_options( ${BINARY_NAME} PRIVATE "-fsigned-char" ) if( JUCE_BUILD_CONFIGURATION MATCHES "DEBUG" ) - target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) + target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) endif() if( JUCE_BUILD_CONFIGURATION MATCHES "RELEASE" ) - target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) + target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) endif() find_library(log "log") diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml juce-7.0.0~ds0/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml --- juce-6.1.5~ds0/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml 2022-06-21 07:56:28.000000000 +0000 @@ -1,10 +1,10 @@ - - + diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h juce-7.0.0~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h --- juce-6.1.5~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h juce-7.0.0~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h --- juce-6.1.5~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h juce-7.0.0~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h --- juce-6.1.5~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/WavefrontObjParser.h juce-7.0.0~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/WavefrontObjParser.h --- juce-6.1.5~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/WavefrontObjParser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/Android/app/src/main/assets/WavefrontObjParser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj juce-7.0.0~ds0/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj --- juce-6.1.5~ds0/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj 2022-06-21 07:56:28.000000000 +0000 @@ -25,9 +25,11 @@ 527DA2E6827BAFDDD3E8E80F /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = B4389672DA4CC8E0A531062D; }; 5CB78489F16E82144914972D /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = 979F23EA9E5E76131299E886; }; 5E4310B3F6BB639875D3E9B8 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = 49ECA8B998B339A083674A22; }; + 5EB6872A39122A5AB67E544E /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = 8D44097417573B38729A0179; }; 611298FAC1A543BDD10D4C41 /* include_juce_box2d.cpp */ = {isa = PBXBuildFile; fileRef = 4DF215D350FFE5E119CBA7E5; }; 63A2F309E55DAC206E9B97E3 /* App */ = {isa = PBXBuildFile; fileRef = CFF2BBEB242CC8B3B904B5F9; }; 6658EEC5F9D63D3419EB7098 /* CoreServices.framework */ = {isa = PBXBuildFile; fileRef = E07FC48041C3E9F9721F3BCE; }; + 67D7E529C3713ED79F5F3AA9 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 5BD7D121AD30987C08BE10E8; }; 6A61CBB4E39BFD392D97528F /* CoreMIDI.framework */ = {isa = PBXBuildFile; fileRef = 61AE09C749B007B70A265D9B; }; 6B5560283DEEBD6DD2D6C984 /* include_juce_dsp.mm */ = {isa = PBXBuildFile; fileRef = C1E93FAF6C68A40A664422CD; }; 712D81867EC698463252FA79 /* include_juce_audio_utils.mm */ = {isa = PBXBuildFile; fileRef = EDDA01B246C6128CAF7A2914; }; @@ -87,6 +89,7 @@ 4FE6029FF76BCE9698595DC5 /* juce_product_unlocking */ /* juce_product_unlocking */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_product_unlocking; path = ../../../../modules/juce_product_unlocking; sourceTree = SOURCE_ROOT; }; 5965349393850F41DF76F350 /* include_juce_analytics.cpp */ /* include_juce_analytics.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_analytics.cpp; path = ../../JuceLibraryCode/include_juce_analytics.cpp; sourceTree = SOURCE_ROOT; }; 5A9F2000C66D24E8B01BE60B /* juce_gui_basics */ /* juce_gui_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_gui_basics; path = ../../../../modules/juce_gui_basics; sourceTree = SOURCE_ROOT; }; + 5BD7D121AD30987C08BE10E8 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 60F2869DC345EAF2314D6C09 /* juce_audio_devices */ /* juce_audio_devices */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_devices; path = ../../../../modules/juce_audio_devices; sourceTree = SOURCE_ROOT; }; 61AE09C749B007B70A265D9B /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; 651ECE3C7BA845DDCFEE48F3 /* juce_osc */ /* juce_osc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_osc; path = ../../../../modules/juce_osc; sourceTree = SOURCE_ROOT; }; @@ -102,6 +105,7 @@ 8135645508EEFDBDCDF2ADC6 /* Images.xcassets */ /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = DemoRunner/Images.xcassets; sourceTree = SOURCE_ROOT; }; 873F9DD54978E601102353B4 /* CoreText.framework */ /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 8CE533D611CD0984AD028D73 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; + 8D44097417573B38729A0179 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; 903CD4126C779884797EF915 /* juce_core */ /* juce_core */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_core; path = ../../../../modules/juce_core; sourceTree = SOURCE_ROOT; }; 9144821E003E15E4042B57DB /* include_juce_video.mm */ /* include_juce_video.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_video.mm; path = ../../JuceLibraryCode/include_juce_video.mm; sourceTree = SOURCE_ROOT; }; 934ACDCB3FD9D223A3481D8F /* JUCEDemos.cpp */ /* JUCEDemos.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = JUCEDemos.cpp; path = ../../Source/Demos/JUCEDemos.cpp; sourceTree = SOURCE_ROOT; }; @@ -224,6 +228,8 @@ 03A63C3CA6F24977F19C316D, E061A1C75FA5722167FC4997, E67AB94002886AF67437D6AE, + 8D44097417573B38729A0179, + 5BD7D121AD30987C08BE10E8, EDDA01B246C6128CAF7A2914, 4DF215D350FFE5E119CBA7E5, 3BC9753E0CD75A36DC742EE0, @@ -345,7 +351,7 @@ AC6F0E9A0809A184B2C2B7DE = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { @@ -421,6 +427,8 @@ 9EACEA6BE8D0ACC72C12C080, 26652AB1BB77C8A39434775F, 2707968B431D83AC7E28E49B, + 5EB6872A39122A5AB67E544E, + 67D7E529C3713ED79F5F3AA9, 712D81867EC698463252FA79, 611298FAC1A543BDD10D4C41, D183F8140174ACCDDCD230A2, @@ -511,7 +519,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -533,6 +541,8 @@ "JUCE_MODULE_AVAILABLE_juce_video=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_USE_MP3AUDIOFORMAT=1", + "JUCE_PLUGINHOST_VST3=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_ALLOW_STATIC_NULL_VARIABLES=0", "JUCE_STRICT_REFCOUNTEDPOINTER=1", "JUCE_USE_CAMERA=1", @@ -540,19 +550,28 @@ "JUCE_DEMO_RUNNER=1", "JUCE_UNIT_TESTS=1", "JUCER_XCODE_IPHONE_5BC26AE3=1", - "JUCE_APP_VERSION=6.1.5", - "JUCE_APP_VERSION_HEX=0x60105", + "JUCE_APP_VERSION=7.0.0", + "JUCE_APP_VERSION_HEX=0x70000", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", "$(inherited)", @@ -561,9 +580,10 @@ INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; LLVM_LTO = YES; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner; PRODUCT_NAME = "DemoRunner"; USE_HEADERMAP = NO; @@ -591,7 +611,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -613,6 +633,8 @@ "JUCE_MODULE_AVAILABLE_juce_video=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_USE_MP3AUDIOFORMAT=1", + "JUCE_PLUGINHOST_VST3=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_ALLOW_STATIC_NULL_VARIABLES=0", "JUCE_STRICT_REFCOUNTEDPOINTER=1", "JUCE_USE_CAMERA=1", @@ -620,19 +642,28 @@ "JUCE_DEMO_RUNNER=1", "JUCE_UNIT_TESTS=1", "JUCER_XCODE_IPHONE_5BC26AE3=1", - "JUCE_APP_VERSION=6.1.5", - "JUCE_APP_VERSION_HEX=0x60105", + "JUCE_APP_VERSION=7.0.0", + "JUCE_APP_VERSION_HEX=0x70000", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", "$(inherited)", @@ -640,9 +671,10 @@ INFOPLIST_FILE = Info-App.plist; INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner; PRODUCT_NAME = "DemoRunner"; USE_HEADERMAP = NO; diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/iOS/Info-App.plist juce-7.0.0~ds0/examples/DemoRunner/Builds/iOS/Info-App.plist --- juce-6.1.5~ds0/examples/DemoRunner/Builds/iOS/Info-App.plist 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/iOS/Info-App.plist 2022-06-21 07:56:28.000000000 +0000 @@ -30,9 +30,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 6.1.5 + 7.0.0 CFBundleVersion - 6.1.5 + 7.0.0 NSHumanReadableCopyright Copyright (c) 2020 - Raw Material Software Limited NSHighResolutionCapable diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/LinuxMakefile/Makefile juce-7.0.0~ds0/examples/DemoRunner/Builds/LinuxMakefile/Makefile --- juce-6.1.5~ds0/examples/DemoRunner/Builds/LinuxMakefile/Makefile 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/LinuxMakefile/Makefile 2022-06-21 07:56:28.000000000 +0000 @@ -11,6 +11,10 @@ # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.0" "-DJUCE_APP_VERSION_HEX=0x70000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := DemoRunner JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,13 +60,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.0" "-DJUCE_APP_VERSION_HEX=0x70000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := DemoRunner JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -79,6 +83,8 @@ $(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \ $(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o \ $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o \ $(JUCE_OBJDIR)/include_juce_box2d_b0305d8b.o \ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \ @@ -99,8 +105,8 @@ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors alsa freetype2 libcurl + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors alsa freetype2 libcurl @echo Linking "DemoRunner - App" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) @@ -162,6 +168,16 @@ @echo "Compiling include_juce_audio_processors.cpp" $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" +$(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o: ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_ara.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o: ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_lv2_libs.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o: ../../JuceLibraryCode/include_juce_audio_utils.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling include_juce_audio_utils.cpp" diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj juce-7.0.0~ds0/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj --- juce-6.1.5~ds0/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj 2022-06-21 07:56:28.000000000 +0000 @@ -25,8 +25,10 @@ 527DA2E6827BAFDDD3E8E80F /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = B4389672DA4CC8E0A531062D; }; 5CB78489F16E82144914972D /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = 979F23EA9E5E76131299E886; }; 5E4310B3F6BB639875D3E9B8 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = 49ECA8B998B339A083674A22; }; + 5EB6872A39122A5AB67E544E /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = 8D44097417573B38729A0179; }; 611298FAC1A543BDD10D4C41 /* include_juce_box2d.cpp */ = {isa = PBXBuildFile; fileRef = 4DF215D350FFE5E119CBA7E5; }; 63A2F309E55DAC206E9B97E3 /* App */ = {isa = PBXBuildFile; fileRef = CFF2BBEB242CC8B3B904B5F9; }; + 67D7E529C3713ED79F5F3AA9 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 5BD7D121AD30987C08BE10E8; }; 6A61CBB4E39BFD392D97528F /* CoreMIDI.framework */ = {isa = PBXBuildFile; fileRef = 61AE09C749B007B70A265D9B; }; 6B5560283DEEBD6DD2D6C984 /* include_juce_dsp.mm */ = {isa = PBXBuildFile; fileRef = C1E93FAF6C68A40A664422CD; }; 712D81867EC698463252FA79 /* include_juce_audio_utils.mm */ = {isa = PBXBuildFile; fileRef = EDDA01B246C6128CAF7A2914; }; @@ -35,7 +37,6 @@ 7B4163348896EB1B86B15160 /* AVFoundation.framework */ = {isa = PBXBuildFile; fileRef = DC192EFA899E6CBE6B5CD394; }; 8584640341100008744861A5 /* IOKit.framework */ = {isa = PBXBuildFile; fileRef = 71A91516AFD980FEE694C0E1; }; 89AD16514B1F4133FFEA1DF9 /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = 96D99A08027CA35D6A4E5CFD; }; - 89BC6E2354102D975E08E918 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = 440D507FD8F31DB62B1F95C7; }; 8C0AEA08A71075A6C765AEC9 /* AVKit.framework */ = {isa = PBXBuildFile; fileRef = 3B99CF94C44E2EE04635A439; }; 91CD2BCE4CA07E18229EB436 /* RecentFilesMenuTemplate.nib */ = {isa = PBXBuildFile; fileRef = 9672FCE6167ADB567A9EB2F8; }; 9BEA1428416CE06BF72FBAB8 /* DiscRecording.framework */ = {isa = PBXBuildFile; fileRef = 3DC90DA86565B0356B6E5E0B; }; @@ -80,7 +81,6 @@ 3DC90DA86565B0356B6E5E0B /* DiscRecording.framework */ /* DiscRecording.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; }; 3E4ED41C374261CFFD309743 /* include_juce_graphics.mm */ /* include_juce_graphics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_graphics.mm; path = ../../JuceLibraryCode/include_juce_graphics.mm; sourceTree = SOURCE_ROOT; }; 40BD06D4AB0D2C73E936A2F1 /* OpenGL.framework */ /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 440D507FD8F31DB62B1F95C7 /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; 470C3E4553B513FFEF752779 /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 491641F7632BCC81BBA0ED85 /* juce_audio_formats */ /* juce_audio_formats */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_formats; path = ../../../../modules/juce_audio_formats; sourceTree = SOURCE_ROOT; }; 49ECA8B998B339A083674A22 /* Foundation.framework */ /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -91,6 +91,7 @@ 4FE6029FF76BCE9698595DC5 /* juce_product_unlocking */ /* juce_product_unlocking */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_product_unlocking; path = ../../../../modules/juce_product_unlocking; sourceTree = SOURCE_ROOT; }; 5965349393850F41DF76F350 /* include_juce_analytics.cpp */ /* include_juce_analytics.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_analytics.cpp; path = ../../JuceLibraryCode/include_juce_analytics.cpp; sourceTree = SOURCE_ROOT; }; 5A9F2000C66D24E8B01BE60B /* juce_gui_basics */ /* juce_gui_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_gui_basics; path = ../../../../modules/juce_gui_basics; sourceTree = SOURCE_ROOT; }; + 5BD7D121AD30987C08BE10E8 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 5CD17151385A69F1E07FE85B /* DSP */ /* DSP */ = {isa = PBXFileReference; lastKnownFileType = folder; name = DSP; path = ../../../DSP; sourceTree = ""; }; 60F2869DC345EAF2314D6C09 /* juce_audio_devices */ /* juce_audio_devices */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_devices; path = ../../../../modules/juce_audio_devices; sourceTree = SOURCE_ROOT; }; 61AE09C749B007B70A265D9B /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; @@ -104,6 +105,7 @@ 7A5AAE9EE573FC6105CC4AAC /* SettingsContent.h */ /* SettingsContent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SettingsContent.h; path = ../../Source/UI/SettingsContent.h; sourceTree = SOURCE_ROOT; }; 7B3243C92248D379A0489AA4 /* Utilities */ /* Utilities */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Utilities; path = ../../../Utilities; sourceTree = ""; }; 8CE533D611CD0984AD028D73 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; + 8D44097417573B38729A0179 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; 903CD4126C779884797EF915 /* juce_core */ /* juce_core */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_core; path = ../../../../modules/juce_core; sourceTree = SOURCE_ROOT; }; 9144821E003E15E4042B57DB /* include_juce_video.mm */ /* include_juce_video.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_video.mm; path = ../../JuceLibraryCode/include_juce_video.mm; sourceTree = SOURCE_ROOT; }; 934ACDCB3FD9D223A3481D8F /* JUCEDemos.cpp */ /* JUCEDemos.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = JUCEDemos.cpp; path = ../../Source/Demos/JUCEDemos.cpp; sourceTree = SOURCE_ROOT; }; @@ -146,7 +148,6 @@ 163B0CF2DD0990A63DF1D5A6, 7B4163348896EB1B86B15160, 8C0AEA08A71075A6C765AEC9, - 89BC6E2354102D975E08E918, 9F15FD7A7CE83CFD98F07D59, 1351A13E78F38741C6075600, 527DA2E6827BAFDDD3E8E80F, @@ -171,7 +172,6 @@ 470C3E4553B513FFEF752779, DC192EFA899E6CBE6B5CD394, 3B99CF94C44E2EE04635A439, - 440D507FD8F31DB62B1F95C7, 02A2ED58B066B4D119F67913, 4F0A137A4115946A346180E6, B4389672DA4CC8E0A531062D, @@ -221,6 +221,8 @@ 03A63C3CA6F24977F19C316D, E061A1C75FA5722167FC4997, E67AB94002886AF67437D6AE, + 8D44097417573B38729A0179, + 5BD7D121AD30987C08BE10E8, EDDA01B246C6128CAF7A2914, 4DF215D350FFE5E119CBA7E5, 3BC9753E0CD75A36DC742EE0, @@ -345,7 +347,7 @@ AC6F0E9A0809A184B2C2B7DE = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { @@ -421,6 +423,8 @@ 9EACEA6BE8D0ACC72C12C080, 26652AB1BB77C8A39434775F, 2707968B431D83AC7E28E49B, + 5EB6872A39122A5AB67E544E, + 67D7E529C3713ED79F5F3AA9, 712D81867EC698463252FA79, 611298FAC1A543BDD10D4C41, D183F8140174ACCDDCD230A2, @@ -507,7 +511,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -529,6 +533,8 @@ "JUCE_MODULE_AVAILABLE_juce_video=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_USE_MP3AUDIOFORMAT=1", + "JUCE_PLUGINHOST_VST3=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_ALLOW_STATIC_NULL_VARIABLES=0", "JUCE_STRICT_REFCOUNTEDPOINTER=1", "JUCE_USE_CAMERA=1", @@ -536,19 +542,28 @@ "JUCE_DEMO_RUNNER=1", "JUCE_UNIT_TESTS=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=6.1.5", - "JUCE_APP_VERSION_HEX=0x60105", + "JUCE_APP_VERSION=7.0.0", + "JUCE_APP_VERSION_HEX=0x70000", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", "$(inherited)", @@ -558,9 +573,10 @@ INSTALL_PATH = "$(HOME)/Applications"; LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner; PRODUCT_NAME = "DemoRunner"; USE_HEADERMAP = NO; @@ -587,7 +603,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -609,6 +625,8 @@ "JUCE_MODULE_AVAILABLE_juce_video=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_USE_MP3AUDIOFORMAT=1", + "JUCE_PLUGINHOST_VST3=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_ALLOW_STATIC_NULL_VARIABLES=0", "JUCE_STRICT_REFCOUNTEDPOINTER=1", "JUCE_USE_CAMERA=1", @@ -616,19 +634,28 @@ "JUCE_DEMO_RUNNER=1", "JUCE_UNIT_TESTS=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=6.1.5", - "JUCE_APP_VERSION_HEX=0x60105", + "JUCE_APP_VERSION=7.0.0", + "JUCE_APP_VERSION_HEX=0x70000", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", "$(inherited)", @@ -637,9 +664,10 @@ INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner; PRODUCT_NAME = "DemoRunner"; USE_HEADERMAP = NO; diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/MacOSX/Info-App.plist juce-7.0.0~ds0/examples/DemoRunner/Builds/MacOSX/Info-App.plist --- juce-6.1.5~ds0/examples/DemoRunner/Builds/MacOSX/Info-App.plist 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/MacOSX/Info-App.plist 2022-06-21 07:56:28.000000000 +0000 @@ -24,9 +24,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 6.1.5 + 7.0.0 CFBundleVersion - 6.1.5 + 7.0.0 NSHumanReadableCopyright Copyright (c) 2020 - Raw Material Software Limited NSHighResolutionCapable diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,3476 +0,0 @@ - - - - - - Debug - x64 - - - Release - x64 - - - - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C} - - - - Application - false - false - v140 - 8.1 - - - Application - false - true - v140 - 8.1 - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - .exe - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - DemoRunner - true - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - DemoRunner - true - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Disabled - ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - true - NotUsing - $(IntDir)\ - $(IntDir)\ - $(IntDir)\DemoRunner.pdb - Level4 - true - true - /w44265 /w45038 /w44062 /bigobj %(AdditionalOptions) - stdcpp14 - - - _DEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\DemoRunner.exe - true - libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) - true - $(IntDir)\DemoRunner.pdb - Windows - true - - - true - $(IntDir)\DemoRunner.bsc - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreaded - true - NotUsing - $(IntDir)\ - $(IntDir)\ - $(IntDir)\DemoRunner.pdb - Level4 - true - true - /w44265 /w45038 /w44062 /bigobj %(AdditionalOptions) - stdcpp14 - - - NDEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\DemoRunner.exe - true - %(IgnoreSpecificDefaultLibraries) - false - $(IntDir)\DemoRunner.pdb - Windows - true - true - true - UseLinkTimeCodeGeneration - - - true - $(IntDir)\DemoRunner.bsc - - - - - - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - - - - - - - /bigobj %(AdditionalOptions) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 @@ -1,6041 +0,0 @@ - - - - - - {747DECFA-60E8-6F38-F8B4-1FC9052FD677} - - - {67AC4BA4-ADB7-61F2-40EB-054BFA2565E9} - - - {8C2BA468-929C-4792-FBD2-3009E3068DD0} - - - {AC828C39-320F-8E54-0482-C033528D4EEC} - - - {E3CEC08A-FA14-D343-5BFF-3D6A4A4FD713} - - - {B3BC836A-3932-C1E4-CA3C-A1C0D83281BA} - - - {97F7F593-75F8-D6B2-DC96-C946C3976226} - - - {EB58F05A-A968-CEBE-40C4-107CDD8F240F} - - - {5FCF559E-451A-CB1E-B177-A5DC5A0005BB} - - - {05CE33FC-868F-AA1A-12B8-79C98E753648} - - - {D78296AF-218E-B17E-7F8B-9D148601188D} - - - {B96EBA26-E668-FFAF-FC53-1EC1337DAF5A} - - - {D8532E5E-469E-5042-EFC8-238241704735} - - - {777B5D1D-9AF0-B22B-8894-034603EE97F5} - - - {8292766D-2459-2E7E-7615-17216318BA93} - - - {9BD56105-DAB4-EBD5-00DD-BD540E98FE88} - - - {10472B2C-9888-D269-F351-0D0AC3BCD16C} - - - {BF23FC10-1D57-2A9B-706F-6DD8A7B593D4} - - - {386862D5-4DCC-A4B3-5642-60A201E303EF} - - - {092EFC17-7C95-7E04-0ACA-0D61A462EE81} - - - {285118C6-8FDA-7DCE-BEF4-FFB2120876C5} - - - {69ED6B61-9B8D-D47E-E4A6-2E9F9A94A75A} - - - {7CDB7CD1-BB96-F593-3C78-1E06182B5839} - - - {B0A708DE-B4CF-196B-14FB-DC8221509B8E} - - - {34F46ADE-EE31-227A-A69E-7732E70145F1} - - - {BB9B3C77-17FB-E994-8B75-88F1727E4655} - - - {C0971D77-2F14-190A-E2AE-89D6285F4D5A} - - - {AABEA333-6524-8891-51C7-6DAEB5700628} - - - {F2D29337-983E-BAD7-7B5C-E0AB3D53D404} - - - {C674B0FB-1FC0-2986-94B1-083845018994} - - - {0AFC1CE8-F6E6-9817-8C21-8432B2A375DA} - - - {0D1AF264-3AC1-78A2-B2A4-AE6171F9194A} - - - {9A5DB854-CFFB-5F88-C566-0E10F994DDB3} - - - {38A5DDC7-416E-548F-39DA-887875FE6B20} - - - {980FE2DB-05D3-5FDA-79DA-067A56F5D19D} - - - {F336DC25-747A-0663-93D6-E3EB9AA0CBF8} - - - {7D78546A-80FC-4DCA-00B9-F191F0AB2179} - - - {9EB3EC7F-2AB7-DDAA-3C05-DF382B728D3F} - - - {6B9FBFDC-1D10-6246-356D-00FF4535CECB} - - - {D6FCFC8E-7136-9109-78C0-91A3EB4C443F} - - - {EBF18AC1-F0ED-937A-2824-4307CE2ADAF7} - - - {5A0F7922-2EFB-6465-57E4-A445B804EFB5} - - - {4EC45416-0E7C-7567-6F75-D0C8CEE7DC4F} - - - {C2985031-0496-55B5-41A8-BAB99E53D89D} - - - {FB4AB426-7009-0036-BB75-E34256AA7C89} - - - {E684D858-09E8-0251-8E86-5657129641E1} - - - {1EF1BF17-F941-243A-04D1-EE617D140CBA} - - - {344DB016-679C-FBD0-3EC6-4570C47522DE} - - - {3D9758A0-9359-1710-87C1-05D475C08B17} - - - {E824435F-FC7B-10BE-5D1A-5DACC51A8836} - - - {86737735-F6BA-F64A-5EC7-5C9F36755F79} - - - {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} - - - {80C72173-A1E1-C3C5-9288-B889CE2EAFEA} - - - {4138B955-AA0B-FA86-DBF9-404CAFFFA866} - - - {2B4166B8-F470-F07C-4F51-D2DAAAECBB18} - - - {9C295115-C0CD-3129-1C4D-FB53299B23FB} - - - {65526A8B-3447-9DF0-FD5D-00D111126027} - - - {A54A1F5C-F32F-F97B-9E8A-69922B770A54} - - - {B90A44F3-B62D-B5C0-81A2-683D2650AEE6} - - - {DAF30656-5915-0E45-C4E4-54439617D525} - - - {9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C} - - - {9C713CBA-A9E2-5F4E-F83C-2CAB8533913C} - - - {63571A07-9AA3-5BB0-1103-0B42A2E6BC9E} - - - {314F43F2-BC8F-B464-EAE7-86B9675454E9} - - - {874C5D0C-6D29-68EE-38BB-26200B56BC89} - - - {86BAA7A7-DC50-35B6-910B-932AEAF257F2} - - - {6B7BE34D-1BC1-C7B9-111F-C55CA8250943} - - - {9B6B6D54-D378-80C2-8CC9-D1D8FB44C2A8} - - - {D0584AC3-6837-14F6-90BF-5EA604D1F074} - - - {794B64EC-B809-32E3-AD00-4EE6A74802CA} - - - {67BE498C-9E1F-C73A-B99A-387C034CE680} - - - {1A9C8538-959B-25E3-473D-B462C9A9D458} - - - {AA9F594C-DFAF-C0A7-0CCD-9F90E54D3A01} - - - {230BF784-34F4-3BE8-46D4-54E6B67E5E9E} - - - {39F680F3-5161-4D1C-EAD0-3911ED808874} - - - {3197198B-A978-E330-C7FB-07E5CE8236C7} - - - {ED064203-CFE3-44F5-49E6-0BE948CCC752} - - - {60B6EF27-E71E-E771-7B52-F8228C928B3B} - - - {0ADD7306-A27A-EDEF-58D9-1011038D943B} - - - {5502FEA8-790D-593B-7FAF-105304E7A347} - - - {AFB1C715-E4C1-6EB6-367F-D39E64A43205} - - - {114D3F58-5C40-FB13-D076-E3C9CA8D9DBB} - - - {F9420CA4-6ED8-1262-CB31-33328608458F} - - - {1E1A2151-F76C-B7BC-0CB1-10A77A9CF19B} - - - {F9646265-8542-9FD2-1209-55FA76076736} - - - {5971F265-ED75-A920-9750-064F2EE5E6A2} - - - {42F7BE9D-3C8A-AE26-289B-8F355C068036} - - - {7868764A-6572-381A-906C-9C26792A4C29} - - - {03678508-A517-48BB-FB4A-485628C34E08} - - - {07D27C1D-3227-F527-356C-17DA11551A99} - - - {6146D580-99D2-A6C8-5908-30DC355BB6BA} - - - {C67003E8-BEA8-2188-F4B3-A122F4B4FA3F} - - - {09B91E68-1FF4-C7ED-9055-D4D96E66A0BA} - - - {30B3DA63-C1E4-F2EA-CEF0-8035D8CBFF64} - - - {4F24EEED-AA33-AC6C-9A39-72E71CF83EF0} - - - {0F70B1A9-BB50-23F5-2AE7-F95E51A00389} - - - {D4C8DC40-2CD2-04B6-05D0-1E7A88841390} - - - {58BED6AF-DB89-7560-B2B8-D937C1C0825A} - - - {B958F86B-6926-8D9B-2FC6-8BFD4BDC72C9} - - - {DB624F7D-D513-25AC-C13C-B9062EB3BEEE} - - - {89AA9B6C-4029-A34F-C1B0-3B5D8691F4D4} - - - {1A7F541C-B032-9C66-C320-A13B2A8A9866} - - - {4BAB7C18-51AB-0D9D-83CD-9C37F28D2E38} - - - {5523922E-8B0C-A52B-477C-752C09F8197F} - - - {857B6D8B-0ECB-FE9E-D1EB-D5E45E72F057} - - - {BAA582FA-40B7-320E-EE7A-4C3892C7BE72} - - - {89B3E447-34BE-C691-638E-09796C6B647E} - - - {9BE78436-DBF4-658C-579B-ED19FFD0EB5D} - - - {21E7FA61-9E0A-4BA1-04B7-AF47AFA9CB8B} - - - {632B4C79-AF7D-BFB5-D006-5AE67F607130} - - - {B10E20C2-4583-2B79-60B7-FE4D4B044313} - - - {CFB54F15-8A8A-0505-9B7F-ECA41CEE38E8} - - - {911F0159-A7A8-4A43-3FD4-154F62F4A44B} - - - {53CF03D3-988B-CD28-9130-CE08FDCEF7E9} - - - {29C6FE02-507E-F3FE-16CD-74D84842C1EA} - - - {8001BD68-125B-E392-8D3B-1F9C9520A65A} - - - {EDC17061-CFA0-8EA0-0ADA-90F31C2FB0F2} - - - {B813BD14-6565-2525-9AC3-E3AA48EDDA85} - - - {DDF4BA73-8578-406D-21F8-06B9BC70BFEA} - - - {73374573-0194-9A6E-461A-A81EEB511C26} - - - {5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E} - - - {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} - - - {3FDCD000-763F-8477-9AF8-70ABA2E91E5E} - - - {0947506F-66FA-EF8D-8A4E-4D48BCDBB226} - - - {E4B6AED3-F54C-3FF2-069F-640BACAE0E08} - - - {D5EADBCC-6A1C-C940-0206-26E49110AF08} - - - {D27DC92D-5BEB-9294-DCD1-81D54E245AD5} - - - {BCD73D20-42B1-6CDB-DE66-B06236A60F47} - - - {20DC13F6-2369-8841-9F0B-D13FA14EEE74} - - - {A302A8DB-120F-9EBB-A3D5-2C29963AA56B} - - - {45489C2A-6E0E-CCDC-6638-0DACEEB63CCA} - - - {F1B90726-DB55-0293-BFAF-C65C7DF5489C} - - - {2C55FD42-0ACD-B0B8-7EAE-EB17F09BAEEC} - - - {B68CD2B2-701F-9AB7-4638-2485D6E06BCF} - - - {B0B7C78E-729E-0FFA-D611-82AE8BC7FE2C} - - - {0A4F7E12-220C-14EF-0026-9C0629FA9C17} - - - {37F49E10-4E62-6D5C-FF70-722D0CA3D97E} - - - {160D9882-0F68-278D-C5F9-8960FD7421D2} - - - {4CED05DA-E0A2-E548-F753-1F2EF299A8E3} - - - {46AE69B8-AD58-4381-6CDE-25C8D75B01D2} - - - {E56CB4FC-32E8-8740-A3BB-B323CD937A99} - - - {4ECDCA0C-BB38-0729-A6B6-2FB0B4D0863B} - - - {294E4CD5-B06F-97D1-04A3-51871CEA507C} - - - {77228F15-BD91-06FF-2C7E-0377D25C2C94} - - - {5CB531E6-BF9A-2C50-056C-EE5A525D28D3} - - - {E4EA47E5-B41C-2A19-1783-7E9104096ECD} - - - {B331BC33-9770-3DB5-73F2-BC2469ECCF7F} - - - {46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC} - - - {D90A8DF7-FBAB-D363-13C0-6707BB22B72B} - - - {8AE77C40-6839-EC37-4515-BD3CC269BCE4} - - - {0EAD99DB-011F-09E5-45A2-365F646EB004} - - - {F57590C6-3B90-1BE1-1006-488BA33E8BD9} - - - {7C319D73-0D93-5842-0874-398D2D3038D5} - - - {2CB4DB0C-DD3B-6195-D822-76EC7A5C88D2} - - - {FE3CB19C-EF43-5CF5-DAF0-09D4E43D0AB9} - - - {C0E5DD5D-F8F1-DD25-67D7-291946AB3828} - - - {FE7E6CD5-C7A0-DB20-4E7E-D6E7F08C4578} - - - {895C2D33-E08D-B1BA-BB36-FC4CA65090C8} - - - {D64A57DB-A956-5519-1929-1D929B56E1B0} - - - {5A99CC24-AC45-7ED6-C11A-B8B86E76D884} - - - {7A131EEC-25A7-22F6-2839-A2194DDF3007} - - - {EA9DB76C-CEF7-6BFC-2070-28B7DF8E8063} - - - {3C206A40-6F1B-E683-ACF1-DEC3703D0140} - - - {DF95D4BF-E18C-125A-5EBB-8993A06E232C} - - - {118946F2-AC24-0F09-62D5-753DF87A60CD} - - - {07329F9B-7D3D-CEB3-C771-714842076140} - - - {08BBBECB-B0D1-7611-37EC-F57E1D0CE2A2} - - - {268E8F2A-980C-BF2F-B161-AACABC9D91F3} - - - {A4D76113-9EDC-DA60-D89B-5BACF7F1C426} - - - {1A9221A3-E993-70B2-6EA2-8E1DB5FF646A} - - - {CC2DAD7A-5B45-62AB-4C54-6FE6B1AE86C3} - - - {599138A9-EA63-53DD-941F-ABE3412D2949} - - - {422A4014-8587-1AE6-584F-32A62613A37B} - - - {9FBFF5E5-56F1-34A1-2C85-F760DA2B1EB7} - - - {EEE9B92C-AD26-4BEA-4D95-3F859090EA9F} - - - {B1DE8DB1-C00A-12C0-D690-8B3C9504A60A} - - - {640F6C76-C532-710A-DF73-582F2350F6A3} - - - {FFA9DA63-69C5-A392-4EEE-395CD07733BB} - - - {D3DCC9A9-ADBC-E37E-3CAA-43B3F156B8B9} - - - {409F7733-AD90-6113-85BA-7136DD178413} - - - {CB8DF3B2-0409-6D59-C5D4-A034EBB7F973} - - - {7774F72F-C951-B8AB-E927-E34AD23C52C8} - - - {658BADF8-7095-C722-F9EC-9F36E8818187} - - - {2C58F450-CD01-0231-2F16-0D4D68565164} - - - {FE955B6B-68AC-AA07-70D8-2413F6DB65C8} - - - {7ED5A90E-41AF-A1EF-659B-37CEEAB9BA61} - - - - - DemoRunner\Source\Demos - - - DemoRunner\Source\Demos - - - DemoRunner\Source\Demos - - - DemoRunner\Source\UI - - - DemoRunner\Source\UI - - - DemoRunner\Source - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\destinations - - - JUCE Modules\juce_analytics - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\synthesisers - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\midi_io\ump - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\sampler - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Rope - - - JUCE Modules\juce_box2d\utils - - - JUCE Modules\juce_box2d - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\filter_design - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\utils - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc - - - JUCE Modules\juce_product_unlocking\in_app_purchases - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\native - - - JUCE Modules\juce_product_unlocking\native - - - JUCE Modules\juce_product_unlocking - - - JUCE Modules\juce_product_unlocking - - - JUCE Modules\juce_video\capture - - - JUCE Modules\juce_video\playback - - - JUCE Modules\juce_video - - - JUCE Modules\juce_video - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - - - DemoRunner\Source\Demos - - - DemoRunner\Source\Demos - - - DemoRunner\Source\UI - - - DemoRunner\Source\UI - - - DemoRunner\Source\UI - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\destinations - - - JUCE Modules\juce_analytics\destinations - - - JUCE Modules\juce_analytics - - - JUCE Modules\juce_audio_basics\audio_play_head - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\native - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\synthesisers - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\midi_io\ump - - - JUCE Modules\juce_audio_devices\midi_io\ump - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\coupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\coupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\floor - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\uncoupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\sampler - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Rope - - - JUCE Modules\juce_box2d\box2d - - - JUCE Modules\juce_box2d\utils - - - JUCE Modules\juce_box2d - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\filter_design - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\utils - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc - - - JUCE Modules\juce_product_unlocking\in_app_purchases - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking - - - JUCE Modules\juce_video\capture - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\playback - - - JUCE Modules\juce_video - - - JUCE Library Code - - - - - DemoRunner\Source - - - JUCE Modules\juce_audio_devices\native\oboe - - - JUCE Modules\juce_audio_devices\native\oboe - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7 - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_box2d\box2d - - - JUCE Modules\juce_core\native\java - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Library Code - - - - - JUCE Library Code - - - diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner.sln juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner.sln --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner.sln 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 14 - -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DemoRunner - App", "DemoRunner_App.vcxproj", "{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Debug|x64.ActiveCfg = Debug|x64 - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Debug|x64.Build.0 = Debug|x64 - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Release|x64.ActiveCfg = Release|x64 - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal Binary files /tmp/tmp3xyzf76u/FU8JCLV1je/juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2015/icon.ico and /tmp/tmp3xyzf76u/WWZuZyRX_p/juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2015/icon.ico differ diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2015/resources.rc juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2015/resources.rc --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2015/resources.rc 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2015/resources.rc 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -#pragma code_page(65001) - -#ifdef JUCE_USER_DEFINED_RC_FILE - #include JUCE_USER_DEFINED_RC_FILE -#else - -#undef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#include - -VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,5,0 -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "Raw Material Software Limited\0" - VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0" - VALUE "FileDescription", "DemoRunner\0" - VALUE "FileVersion", "6.1.5\0" - VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "6.1.5\0" - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif - -IDI_ICON1 ICON DISCARDABLE "icon.ico" -IDI_ICON2 ICON DISCARDABLE "icon.ico" \ No newline at end of file diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -105,8 +106,8 @@ Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -171,13 +173,13 @@ true - + true - + true - + true @@ -288,7 +290,7 @@ true - + true @@ -657,6 +659,9 @@ true + + true + true @@ -690,6 +695,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -759,15 +881,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -801,6 +941,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -819,6 +977,9 @@ true + + true + true @@ -831,6 +992,12 @@ true + + true + + + true + true @@ -1038,9 +1205,15 @@ true + + true + true + + true + true @@ -1056,6 +1229,9 @@ true + + true + true @@ -1122,6 +1298,9 @@ true + + true + true @@ -2118,6 +2297,9 @@ true + + true + true @@ -2145,9 +2327,6 @@ true - - true - true @@ -2467,7 +2646,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2534,6 +2717,7 @@ + @@ -2722,6 +2906,7 @@ + @@ -2734,6 +2919,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2799,9 +3054,14 @@ + + + + + @@ -2822,6 +3082,11 @@ + + + + + @@ -2829,6 +3094,8 @@ + + @@ -2908,6 +3175,7 @@ + @@ -2916,6 +3184,8 @@ + + @@ -3124,6 +3394,7 @@ + @@ -3298,6 +3569,7 @@ + @@ -3321,6 +3593,7 @@ + @@ -3391,7 +3664,7 @@ - + @@ -3453,6 +3726,7 @@ + diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -155,6 +155,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -209,6 +335,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -604,13 +733,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -724,8 +853,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1099,6 +1228,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1135,6 +1267,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1204,6 +1453,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1213,9 +1468,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1249,6 +1516,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1267,6 +1552,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1282,6 +1570,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1504,9 +1798,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1522,6 +1822,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1588,6 +1891,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2629,6 +2935,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2665,9 +2974,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -3049,6 +3355,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -3237,6 +3549,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3801,6 +4116,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3837,6 +4155,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -4032,6 +4560,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -4041,6 +4575,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -4101,6 +4644,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -4122,6 +4680,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -4359,6 +4923,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -4383,6 +4950,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -5007,6 +5580,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5529,6 +6105,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -5598,6 +6177,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5808,7 +6390,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -5990,6 +6572,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2017/resources.rc juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2017/resources.rc --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2017/resources.rc 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2017/resources.rc 2022-06-21 07:56:28.000000000 +0000 @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,5,0 +FILEVERSION 7,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0" VALUE "FileDescription", "DemoRunner\0" - VALUE "FileVersion", "6.1.5\0" + VALUE "FileVersion", "7.0.0\0" VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "6.1.5\0" + VALUE "ProductVersion", "7.0.0\0" END END diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -105,8 +106,8 @@ Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -171,13 +173,13 @@ true - + true - + true - + true @@ -288,7 +290,7 @@ true - + true @@ -657,6 +659,9 @@ true + + true + true @@ -690,6 +695,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -759,15 +881,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -801,6 +941,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -819,6 +977,9 @@ true + + true + true @@ -831,6 +992,12 @@ true + + true + + + true + true @@ -1038,9 +1205,15 @@ true + + true + true + + true + true @@ -1056,6 +1229,9 @@ true + + true + true @@ -1122,6 +1298,9 @@ true + + true + true @@ -2118,6 +2297,9 @@ true + + true + true @@ -2145,9 +2327,6 @@ true - - true - true @@ -2467,7 +2646,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2534,6 +2717,7 @@ + @@ -2722,6 +2906,7 @@ + @@ -2734,6 +2919,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2799,9 +3054,14 @@ + + + + + @@ -2822,6 +3082,11 @@ + + + + + @@ -2829,6 +3094,8 @@ + + @@ -2908,6 +3175,7 @@ + @@ -2916,6 +3184,8 @@ + + @@ -3124,6 +3394,7 @@ + @@ -3298,6 +3569,7 @@ + @@ -3321,6 +3593,7 @@ + @@ -3391,7 +3664,7 @@ - + @@ -3453,6 +3726,7 @@ + diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -155,6 +155,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -209,6 +335,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -604,13 +733,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -724,8 +853,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1099,6 +1228,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1135,6 +1267,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1204,6 +1453,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1213,9 +1468,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1249,6 +1516,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1267,6 +1552,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1282,6 +1570,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1504,9 +1798,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1522,6 +1822,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1588,6 +1891,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2629,6 +2935,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2665,9 +2974,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -3049,6 +3355,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -3237,6 +3549,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3801,6 +4116,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3837,6 +4155,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -4032,6 +4560,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -4041,6 +4575,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -4101,6 +4644,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -4122,6 +4680,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -4359,6 +4923,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -4383,6 +4950,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -5007,6 +5580,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5529,6 +6105,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -5598,6 +6177,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5808,7 +6390,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -5990,6 +6572,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2019/resources.rc juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2019/resources.rc --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2019/resources.rc 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2019/resources.rc 2022-06-21 07:56:28.000000000 +0000 @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,5,0 +FILEVERSION 7,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0" VALUE "FileDescription", "DemoRunner\0" - VALUE "FileVersion", "6.1.5\0" + VALUE "FileVersion", "7.0.0\0" VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "6.1.5\0" + VALUE "ProductVersion", "7.0.0\0" END END diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -105,8 +106,8 @@ Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -171,13 +173,13 @@ true - + true - + true - + true @@ -288,7 +290,7 @@ true - + true @@ -657,6 +659,9 @@ true + + true + true @@ -690,6 +695,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -759,15 +881,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -801,6 +941,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -819,6 +977,9 @@ true + + true + true @@ -831,6 +992,12 @@ true + + true + + + true + true @@ -1038,9 +1205,15 @@ true + + true + true + + true + true @@ -1056,6 +1229,9 @@ true + + true + true @@ -1122,6 +1298,9 @@ true + + true + true @@ -2118,6 +2297,9 @@ true + + true + true @@ -2145,9 +2327,6 @@ true - - true - true @@ -2467,7 +2646,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2534,6 +2717,7 @@ + @@ -2722,6 +2906,7 @@ + @@ -2734,6 +2919,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2799,9 +3054,14 @@ + + + + + @@ -2822,6 +3082,11 @@ + + + + + @@ -2829,6 +3094,8 @@ + + @@ -2908,6 +3175,7 @@ + @@ -2916,6 +3184,8 @@ + + @@ -3124,6 +3394,7 @@ + @@ -3298,6 +3569,7 @@ + @@ -3321,6 +3593,7 @@ + @@ -3391,7 +3664,7 @@ - + @@ -3453,6 +3726,7 @@ + diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -155,6 +155,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -209,6 +335,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -604,13 +733,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -724,8 +853,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1099,6 +1228,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1135,6 +1267,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1204,6 +1453,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1213,9 +1468,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1249,6 +1516,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1267,6 +1552,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1282,6 +1570,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1504,9 +1798,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1522,6 +1822,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1588,6 +1891,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2629,6 +2935,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2665,9 +2974,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -3049,6 +3355,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -3237,6 +3549,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3801,6 +4116,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3837,6 +4155,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -4032,6 +4560,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -4041,6 +4575,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -4101,6 +4644,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -4122,6 +4680,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -4359,6 +4923,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -4383,6 +4950,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -5007,6 +5580,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5529,6 +6105,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -5598,6 +6177,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5808,7 +6390,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -5990,6 +6572,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2022/resources.rc juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2022/resources.rc --- juce-6.1.5~ds0/examples/DemoRunner/Builds/VisualStudio2022/resources.rc 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Builds/VisualStudio2022/resources.rc 2022-06-21 07:56:28.000000000 +0000 @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,5,0 +FILEVERSION 7,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0" VALUE "FileDescription", "DemoRunner\0" - VALUE "FileVersion", "6.1.5\0" + VALUE "FileVersion", "7.0.0\0" VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "6.1.5\0" + VALUE "ProductVersion", "7.0.0\0" END END diff -Nru juce-6.1.5~ds0/examples/DemoRunner/CMakeLists.txt juce-7.0.0~ds0/examples/DemoRunner/CMakeLists.txt --- juce-6.1.5~ds0/examples/DemoRunner/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -55,6 +55,8 @@ PIP_JUCE_EXAMPLES_DIRECTORY_STRING="${JUCE_SOURCE_DIR}/examples" JUCE_ALLOW_STATIC_NULL_VARIABLES=0 JUCE_DEMO_RUNNER=1 + JUCE_PLUGINHOST_LV2=1 + JUCE_PLUGINHOST_VST3=1 JUCE_STRICT_REFCOUNTEDPOINTER=1 JUCE_UNIT_TESTS=1 JUCE_USE_CAMERA=1 diff -Nru juce-6.1.5~ds0/examples/DemoRunner/DemoRunner.jucer juce-7.0.0~ds0/examples/DemoRunner/DemoRunner.jucer --- juce-6.1.5~ds0/examples/DemoRunner/DemoRunner.jucer 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/DemoRunner.jucer 2022-06-21 07:56:28.000000000 +0000 @@ -1,7 +1,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -287,7 +259,7 @@ + JUCE_STRICT_REFCOUNTEDPOINTER="1" JUCE_PLUGINHOST_LV2="1" JUCE_PLUGINHOST_VST3="1"/> diff -Nru juce-6.1.5~ds0/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp juce-7.0.0~ds0/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp --- juce-6.1.5~ds0/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff -Nru juce-6.1.5~ds0/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp juce-7.0.0~ds0/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp --- juce-6.1.5~ds0/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff -Nru juce-6.1.5~ds0/examples/DemoRunner/JuceLibraryCode/JuceHeader.h juce-7.0.0~ds0/examples/DemoRunner/JuceLibraryCode/JuceHeader.h --- juce-6.1.5~ds0/examples/DemoRunner/JuceLibraryCode/JuceHeader.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/JuceLibraryCode/JuceHeader.h 2022-06-21 07:56:28.000000000 +0000 @@ -54,7 +54,7 @@ { const char* const projectName = "DemoRunner"; const char* const companyName = "Raw Material Software Limited"; - const char* const versionString = "6.1.5"; - const int versionNumber = 0x60105; + const char* const versionString = "7.0.0"; + const int versionNumber = 0x70000; } #endif diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Source/Demos/DemoPIPs1.cpp juce-7.0.0~ds0/examples/DemoRunner/Source/Demos/DemoPIPs1.cpp --- juce-6.1.5~ds0/examples/DemoRunner/Source/Demos/DemoPIPs1.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Source/Demos/DemoPIPs1.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Source/Demos/DemoPIPs2.cpp juce-7.0.0~ds0/examples/DemoRunner/Source/Demos/DemoPIPs2.cpp --- juce-6.1.5~ds0/examples/DemoRunner/Source/Demos/DemoPIPs2.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Source/Demos/DemoPIPs2.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -30,7 +30,7 @@ #include "../../../Assets/AudioLiveScrollingDisplay.h" //============================================================================== -#if JUCE_MAC || JUCE_WINDOWS +#if JUCE_MAC || JUCE_WINDOWS || JUCE_IOS || JUCE_ANDROID #include "../../../GUI/AccessibilityDemo.h" #endif #include "../../../GUI/AnimationAppDemo.h" @@ -70,7 +70,7 @@ void registerDemos_Two() noexcept { - #if JUCE_MAC || JUCE_WINDOWS + #if JUCE_MAC || JUCE_WINDOWS || JUCE_IOS || JUCE_ANDROID REGISTER_DEMO (AccessibilityDemo, GUI, false) #endif REGISTER_DEMO (AnimationAppDemo, GUI, false) diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Source/Demos/IntroScreen.h juce-7.0.0~ds0/examples/DemoRunner/Source/Demos/IntroScreen.h --- juce-6.1.5~ds0/examples/DemoRunner/Source/Demos/IntroScreen.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Source/Demos/IntroScreen.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Source/Demos/JUCEDemos.cpp juce-7.0.0~ds0/examples/DemoRunner/Source/Demos/JUCEDemos.cpp --- juce-6.1.5~ds0/examples/DemoRunner/Source/Demos/JUCEDemos.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Source/Demos/JUCEDemos.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Source/Demos/JUCEDemos.h juce-7.0.0~ds0/examples/DemoRunner/Source/Demos/JUCEDemos.h --- juce-6.1.5~ds0/examples/DemoRunner/Source/Demos/JUCEDemos.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Source/Demos/JUCEDemos.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Source/Main.cpp juce-7.0.0~ds0/examples/DemoRunner/Source/Main.cpp --- juce-6.1.5~ds0/examples/DemoRunner/Source/Main.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Source/Main.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Source/UI/DemoContentComponent.cpp juce-7.0.0~ds0/examples/DemoRunner/Source/UI/DemoContentComponent.cpp --- juce-6.1.5~ds0/examples/DemoRunner/Source/UI/DemoContentComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Source/UI/DemoContentComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Source/UI/DemoContentComponent.h juce-7.0.0~ds0/examples/DemoRunner/Source/UI/DemoContentComponent.h --- juce-6.1.5~ds0/examples/DemoRunner/Source/UI/DemoContentComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Source/UI/DemoContentComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Source/UI/MainComponent.cpp juce-7.0.0~ds0/examples/DemoRunner/Source/UI/MainComponent.cpp --- juce-6.1.5~ds0/examples/DemoRunner/Source/UI/MainComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Source/UI/MainComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Source/UI/MainComponent.h juce-7.0.0~ds0/examples/DemoRunner/Source/UI/MainComponent.h --- juce-6.1.5~ds0/examples/DemoRunner/Source/UI/MainComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Source/UI/MainComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/DemoRunner/Source/UI/SettingsContent.h juce-7.0.0~ds0/examples/DemoRunner/Source/UI/SettingsContent.h --- juce-6.1.5~ds0/examples/DemoRunner/Source/UI/SettingsContent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DemoRunner/Source/UI/SettingsContent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -237,6 +237,11 @@ } private: + std::unique_ptr createAccessibilityHandler() override + { + return createIgnoredAccessibilityHandler (*this); + } + GraphicsSettingsGroup graphicsSettings; AudioSettingsGroup audioSettings; }; diff -Nru juce-6.1.5~ds0/examples/DSP/CMakeLists.txt juce-7.0.0~ds0/examples/DSP/CMakeLists.txt --- juce-6.1.5~ds0/examples/DSP/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DSP/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/DSP/ConvolutionDemo.h juce-7.0.0~ds0/examples/DSP/ConvolutionDemo.h --- juce-6.1.5~ds0/examples/DSP/ConvolutionDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DSP/ConvolutionDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/DSP/FIRFilterDemo.h juce-7.0.0~ds0/examples/DSP/FIRFilterDemo.h --- juce-6.1.5~ds0/examples/DSP/FIRFilterDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DSP/FIRFilterDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/DSP/GainDemo.h juce-7.0.0~ds0/examples/DSP/GainDemo.h --- juce-6.1.5~ds0/examples/DSP/GainDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DSP/GainDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/DSP/IIRFilterDemo.h juce-7.0.0~ds0/examples/DSP/IIRFilterDemo.h --- juce-6.1.5~ds0/examples/DSP/IIRFilterDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DSP/IIRFilterDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/DSP/OscillatorDemo.h juce-7.0.0~ds0/examples/DSP/OscillatorDemo.h --- juce-6.1.5~ds0/examples/DSP/OscillatorDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DSP/OscillatorDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/DSP/OverdriveDemo.h juce-7.0.0~ds0/examples/DSP/OverdriveDemo.h --- juce-6.1.5~ds0/examples/DSP/OverdriveDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DSP/OverdriveDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/DSP/SIMDRegisterDemo.h juce-7.0.0~ds0/examples/DSP/SIMDRegisterDemo.h --- juce-6.1.5~ds0/examples/DSP/SIMDRegisterDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DSP/SIMDRegisterDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/DSP/StateVariableFilterDemo.h juce-7.0.0~ds0/examples/DSP/StateVariableFilterDemo.h --- juce-6.1.5~ds0/examples/DSP/StateVariableFilterDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DSP/StateVariableFilterDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/DSP/WaveShaperTanhDemo.h juce-7.0.0~ds0/examples/DSP/WaveShaperTanhDemo.h --- juce-6.1.5~ds0/examples/DSP/WaveShaperTanhDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/DSP/WaveShaperTanhDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/AccessibilityDemo.h juce-7.0.0~ds0/examples/GUI/AccessibilityDemo.h --- juce-6.1.5~ds0/examples/GUI/AccessibilityDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/AccessibilityDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -32,7 +32,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/AnimationAppDemo.h juce-7.0.0~ds0/examples/GUI/AnimationAppDemo.h --- juce-6.1.5~ds0/examples/GUI/AnimationAppDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/AnimationAppDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, xcode_iphone + exporters: xcode_mac, vs2022, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/AnimationDemo.h juce-7.0.0~ds0/examples/GUI/AnimationDemo.h --- juce-6.1.5~ds0/examples/GUI/AnimationDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/AnimationDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/BouncingBallWavetableDemo.h juce-7.0.0~ds0/examples/GUI/BouncingBallWavetableDemo.h --- juce-6.1.5~ds0/examples/GUI/BouncingBallWavetableDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/BouncingBallWavetableDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/CameraDemo.h juce-7.0.0~ds0/examples/GUI/CameraDemo.h --- juce-6.1.5~ds0/examples/GUI/CameraDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/CameraDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -32,7 +32,7 @@ dependencies: juce_audio_basics, juce_audio_devices, juce_core, juce_cryptography, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_video - exporters: xcode_mac, vs2019, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, androidstudio, xcode_iphone moduleFlags: JUCE_USE_CAMERA=1, JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/CMakeLists.txt juce-7.0.0~ds0/examples/GUI/CMakeLists.txt --- juce-6.1.5~ds0/examples/GUI/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/GUI/CodeEditorDemo.h juce-7.0.0~ds0/examples/GUI/CodeEditorDemo.h --- juce-6.1.5~ds0/examples/GUI/CodeEditorDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/CodeEditorDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/ComponentDemo.h juce-7.0.0~ds0/examples/GUI/ComponentDemo.h --- juce-6.1.5~ds0/examples/GUI/ComponentDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/ComponentDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019 + exporters: xcode_mac, vs2022 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/ComponentTransformsDemo.h juce-7.0.0~ds0/examples/GUI/ComponentTransformsDemo.h --- juce-6.1.5~ds0/examples/GUI/ComponentTransformsDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/ComponentTransformsDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/DialogsDemo.h juce-7.0.0~ds0/examples/GUI/DialogsDemo.h --- juce-6.1.5~ds0/examples/GUI/DialogsDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/DialogsDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/FlexBoxDemo.h juce-7.0.0~ds0/examples/GUI/FlexBoxDemo.h --- juce-6.1.5~ds0/examples/GUI/FlexBoxDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/FlexBoxDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/FontsDemo.h juce-7.0.0~ds0/examples/GUI/FontsDemo.h --- juce-6.1.5~ds0/examples/GUI/FontsDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/FontsDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/GraphicsDemo.h juce-7.0.0~ds0/examples/GUI/GraphicsDemo.h --- juce-6.1.5~ds0/examples/GUI/GraphicsDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/GraphicsDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/GridDemo.h juce-7.0.0~ds0/examples/GUI/GridDemo.h --- juce-6.1.5~ds0/examples/GUI/GridDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/GridDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/HelloWorldDemo.h juce-7.0.0~ds0/examples/GUI/HelloWorldDemo.h --- juce-6.1.5~ds0/examples/GUI/HelloWorldDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/HelloWorldDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/ImagesDemo.h juce-7.0.0~ds0/examples/GUI/ImagesDemo.h --- juce-6.1.5~ds0/examples/GUI/ImagesDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/ImagesDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/KeyMappingsDemo.h juce-7.0.0~ds0/examples/GUI/KeyMappingsDemo.h --- juce-6.1.5~ds0/examples/GUI/KeyMappingsDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/KeyMappingsDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/LookAndFeelDemo.h juce-7.0.0~ds0/examples/GUI/LookAndFeelDemo.h --- juce-6.1.5~ds0/examples/GUI/LookAndFeelDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/LookAndFeelDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/MDIDemo.h juce-7.0.0~ds0/examples/GUI/MDIDemo.h --- juce-6.1.5~ds0/examples/GUI/MDIDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/MDIDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/MenusDemo.h juce-7.0.0~ds0/examples/GUI/MenusDemo.h --- juce-6.1.5~ds0/examples/GUI/MenusDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/MenusDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/MultiTouchDemo.h juce-7.0.0~ds0/examples/GUI/MultiTouchDemo.h --- juce-6.1.5~ds0/examples/GUI/MultiTouchDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/MultiTouchDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/OpenGLAppDemo.h juce-7.0.0~ds0/examples/GUI/OpenGLAppDemo.h --- juce-6.1.5~ds0/examples/GUI/OpenGLAppDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/OpenGLAppDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_opengl - exporters: xcode_mac, vs2019, xcode_iphone + exporters: xcode_mac, vs2022, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/OpenGLDemo2D.h juce-7.0.0~ds0/examples/GUI/OpenGLDemo2D.h --- juce-6.1.5~ds0/examples/GUI/OpenGLDemo2D.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/OpenGLDemo2D.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_opengl - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/OpenGLDemo.h juce-7.0.0~ds0/examples/GUI/OpenGLDemo.h --- juce-6.1.5~ds0/examples/GUI/OpenGLDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/OpenGLDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_opengl - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -906,6 +906,7 @@ void setShaderProgram (const String& vertexShader, const String& fragmentShader) { + const ScopedLock lock (shaderMutex); // Prevent concurrent access to shader strings and status newVertexShader = vertexShader; newFragmentShader = fragmentShader; } @@ -931,6 +932,7 @@ private: void handleAsyncUpdate() override { + const ScopedLock lock (shaderMutex); // Prevent concurrent access to shader strings and status controlsOverlay->statusLabel.setText (statusText, dontSendNotification); } @@ -1246,6 +1248,7 @@ OpenGLUtils::DemoTexture* textureToUse = nullptr; OpenGLUtils::DemoTexture* lastTexture = nullptr; + CriticalSection shaderMutex; String newVertexShader, newFragmentShader, statusText; struct BackgroundStar @@ -1258,6 +1261,8 @@ //============================================================================== void updateShader() { + const ScopedLock lock (shaderMutex); // Prevent concurrent access to shader strings and status + if (newVertexShader.isNotEmpty() || newFragmentShader.isNotEmpty()) { std::unique_ptr newShader (new OpenGLShaderProgram (openGLContext)); diff -Nru juce-6.1.5~ds0/examples/GUI/PropertiesDemo.h juce-7.0.0~ds0/examples/GUI/PropertiesDemo.h --- juce-6.1.5~ds0/examples/GUI/PropertiesDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/PropertiesDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/VideoDemo.h juce-7.0.0~ds0/examples/GUI/VideoDemo.h --- juce-6.1.5~ds0/examples/GUI/VideoDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/VideoDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_video - exporters: xcode_mac, vs2019, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/WebBrowserDemo.h juce-7.0.0~ds0/examples/GUI/WebBrowserDemo.h --- juce-6.1.5~ds0/examples/GUI/WebBrowserDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/WebBrowserDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/WidgetsDemo.h juce-7.0.0~ds0/examples/GUI/WidgetsDemo.h --- juce-6.1.5~ds0/examples/GUI/WidgetsDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/WidgetsDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/GUI/WindowsDemo.h juce-7.0.0~ds0/examples/GUI/WindowsDemo.h --- juce-6.1.5~ds0/examples/GUI/WindowsDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/GUI/WindowsDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Plugins/ARAPluginDemo.h juce-7.0.0~ds0/examples/Plugins/ARAPluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/ARAPluginDemo.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/ARAPluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1419 @@ +/* + ============================================================================== + + This file is part of the JUCE examples. + Copyright (c) 2022 - Raw Material Software Limited + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. + + THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, + WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR + PURPOSE, ARE DISCLAIMED. + + ============================================================================== +*/ + +/******************************************************************************* + The block below describes the properties of this PIP. A PIP is a short snippet + of code that can be read by the Projucer and used to generate a JUCE project. + + BEGIN_JUCE_PIP_METADATA + + name: ARAPluginDemo + version: 1.0.0 + vendor: JUCE + website: http://juce.com + description: Audio plugin using the ARA API. + + dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, + juce_audio_plugin_client, juce_audio_processors, + juce_audio_utils, juce_core, juce_data_structures, + juce_events, juce_graphics, juce_gui_basics, juce_gui_extra + exporters: xcode_mac, vs2022 + + moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 + + type: AudioProcessor + mainClass: ARADemoPluginAudioProcessor + documentControllerClass: ARADemoPluginDocumentControllerSpecialisation + + useLocalCopy: 1 + + END_JUCE_PIP_METADATA + +*******************************************************************************/ + +#pragma once + + +//============================================================================== +struct PreviewState +{ + std::atomic previewTime { 0.0 }; + std::atomic previewedRegion { nullptr }; +}; + +class SharedTimeSliceThread : public TimeSliceThread +{ +public: + SharedTimeSliceThread() + : TimeSliceThread (String (JucePlugin_Name) + " ARA Sample Reading Thread") + { + startThread (7); // Above default priority so playback is fluent, but below realtime + } +}; + +class AsyncConfigurationCallback : private AsyncUpdater +{ +public: + explicit AsyncConfigurationCallback (std::function callbackIn) + : callback (std::move (callbackIn)) {} + + ~AsyncConfigurationCallback() override { cancelPendingUpdate(); } + + template + auto withLock (RequiresLock&& fn) + { + const SpinLock::ScopedTryLockType scope (processingFlag); + return fn (scope.isLocked()); + } + + void startConfigure() { triggerAsyncUpdate(); } + +private: + void handleAsyncUpdate() override + { + const SpinLock::ScopedLockType scope (processingFlag); + callback(); + } + + std::function callback; + SpinLock processingFlag; +}; + +class Looper +{ +public: + Looper() : inputBuffer (nullptr), pos (loopRange.getStart()) + { + } + + Looper (const AudioBuffer* buffer, Range range) + : inputBuffer (buffer), loopRange (range), pos (range.getStart()) + { + } + + void writeInto (AudioBuffer& buffer) + { + if (loopRange.getLength() == 0) + buffer.clear(); + + const auto numChannelsToCopy = std::min (inputBuffer->getNumChannels(), buffer.getNumChannels()); + + for (auto samplesCopied = 0; samplesCopied < buffer.getNumSamples();) + { + const auto numSamplesToCopy = + std::min (buffer.getNumSamples() - samplesCopied, (int) (loopRange.getEnd() - pos)); + + for (int i = 0; i < numChannelsToCopy; ++i) + { + buffer.copyFrom (i, samplesCopied, *inputBuffer, i, (int) pos, numSamplesToCopy); + } + + samplesCopied += numSamplesToCopy; + pos += numSamplesToCopy; + + jassert (pos <= loopRange.getEnd()); + + if (pos == loopRange.getEnd()) + pos = loopRange.getStart(); + } + } + +private: + const AudioBuffer* inputBuffer; + Range loopRange; + int64 pos; +}; + +class OptionalRange +{ +public: + using Type = Range; + + OptionalRange() : valid (false) {} + explicit OptionalRange (Type valueIn) : valid (true), value (std::move (valueIn)) {} + + explicit operator bool() const noexcept { return valid; } + + const auto& operator*() const + { + jassert (valid); + return value; + } + +private: + bool valid; + Type value; +}; + +//============================================================================== +// Returns the modified sample range in the output buffer. +inline OptionalRange readPlaybackRangeIntoBuffer (Range playbackRange, + const ARAPlaybackRegion* playbackRegion, + AudioBuffer& buffer, + const std::function& getReader) +{ + const auto rangeInAudioModificationTime = playbackRange.movedToStartAt (playbackRange.getStart() + - playbackRegion->getStartInAudioModificationTime()); + + const auto audioSource = playbackRegion->getAudioModification()->getAudioSource(); + const auto audioModificationSampleRate = audioSource->getSampleRate(); + + const Range sampleRangeInAudioModification { + ARA::roundSamplePosition (rangeInAudioModificationTime.getStart() * audioModificationSampleRate), + ARA::roundSamplePosition (rangeInAudioModificationTime.getEnd() * audioModificationSampleRate) - 1 + }; + + const auto inputOffset = jlimit ((int64_t) 0, audioSource->getSampleCount(), sampleRangeInAudioModification.getStart()); + + const auto outputOffset = -std::min (sampleRangeInAudioModification.getStart(), (int64_t) 0); + + /* TODO: Handle different AudioSource and playback sample rates. + + The conversion should be done inside a specialized AudioFormatReader so that we could use + playbackSampleRate everywhere in this function and we could still read `readLength` number of samples + from the source. + + The current implementation will be incorrect when sampling rates differ. + */ + const auto readLength = [&] + { + const auto sourceReadLength = + std::min (sampleRangeInAudioModification.getEnd(), audioSource->getSampleCount()) - inputOffset; + + const auto outputReadLength = + std::min (outputOffset + sourceReadLength, (int64_t) buffer.getNumSamples()) - outputOffset; + + return std::min (sourceReadLength, outputReadLength); + }(); + + if (readLength == 0) + return OptionalRange { {} }; + + auto* reader = getReader (audioSource); + + if (reader != nullptr && reader->read (&buffer, (int) outputOffset, (int) readLength, inputOffset, true, true)) + return OptionalRange { { outputOffset, readLength } }; + + return {}; +} + +class PossiblyBufferedReader +{ +public: + PossiblyBufferedReader() = default; + + explicit PossiblyBufferedReader (std::unique_ptr readerIn) + : setTimeoutFn ([ptr = readerIn.get()] (int ms) { ptr->setReadTimeout (ms); }), + reader (std::move (readerIn)) + {} + + explicit PossiblyBufferedReader (std::unique_ptr readerIn) + : setTimeoutFn(), + reader (std::move (readerIn)) + {} + + void setReadTimeout (int ms) + { + NullCheckedInvocation::invoke (setTimeoutFn, ms); + } + + AudioFormatReader* get() const { return reader.get(); } + +private: + std::function setTimeoutFn; + std::unique_ptr reader; +}; + +//============================================================================== +class PlaybackRenderer : public ARAPlaybackRenderer +{ +public: + using ARAPlaybackRenderer::ARAPlaybackRenderer; + + void prepareToPlay (double sampleRateIn, + int maximumSamplesPerBlockIn, + int numChannelsIn, + AudioProcessor::ProcessingPrecision, + AlwaysNonRealtime alwaysNonRealtime) override + { + numChannels = numChannelsIn; + sampleRate = sampleRateIn; + maximumSamplesPerBlock = maximumSamplesPerBlockIn; + tempBuffer.reset (new AudioBuffer (numChannels, maximumSamplesPerBlock)); + + useBufferedAudioSourceReader = alwaysNonRealtime == AlwaysNonRealtime::no; + + for (const auto playbackRegion : getPlaybackRegions()) + { + auto audioSource = playbackRegion->getAudioModification()->getAudioSource(); + + if (audioSourceReaders.find (audioSource) == audioSourceReaders.end()) + { + auto reader = std::make_unique (audioSource); + + if (! useBufferedAudioSourceReader) + { + audioSourceReaders.emplace (audioSource, + PossiblyBufferedReader { std::move (reader) }); + } + else + { + const auto readAheadSize = jmax (4 * maximumSamplesPerBlock, + roundToInt (2.0 * sampleRate)); + audioSourceReaders.emplace (audioSource, + PossiblyBufferedReader { std::make_unique (reader.release(), + *sharedTimesliceThread, + readAheadSize) }); + } + } + } + } + + void releaseResources() override + { + audioSourceReaders.clear(); + tempBuffer.reset(); + } + + bool processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept override + { + const auto numSamples = buffer.getNumSamples(); + jassert (numSamples <= maximumSamplesPerBlock); + jassert (numChannels == buffer.getNumChannels()); + jassert (realtime == AudioProcessor::Realtime::no || useBufferedAudioSourceReader); + const auto timeInSamples = positionInfo.getTimeInSamples().orFallback (0); + const auto isPlaying = positionInfo.getIsPlaying(); + + bool success = true; + bool didRenderAnyRegion = false; + + if (isPlaying) + { + const auto blockRange = Range::withStartAndLength (timeInSamples, numSamples); + + for (const auto& playbackRegion : getPlaybackRegions()) + { + // Evaluate region borders in song time, calculate sample range to render in song time. + // Note that this example does not use head- or tailtime, so the includeHeadAndTail + // parameter is set to false here - this might need to be adjusted in actual plug-ins. + const auto playbackSampleRange = playbackRegion->getSampleRange (sampleRate, ARAPlaybackRegion::IncludeHeadAndTail::no); + auto renderRange = blockRange.getIntersectionWith (playbackSampleRange); + + if (renderRange.isEmpty()) + continue; + + // Evaluate region borders in modification/source time and calculate offset between + // song and source samples, then clip song samples accordingly + // (if an actual plug-in supports time stretching, this must be taken into account here). + Range modificationSampleRange { playbackRegion->getStartInAudioModificationSamples(), + playbackRegion->getEndInAudioModificationSamples() }; + const auto modificationSampleOffset = modificationSampleRange.getStart() - playbackSampleRange.getStart(); + + renderRange = renderRange.getIntersectionWith (modificationSampleRange.movedToStartAt (playbackSampleRange.getStart())); + + if (renderRange.isEmpty()) + continue; + + // Get the audio source for the region and find the reader for that source. + // This simplified example code only produces audio if sample rate and channel count match - + // a robust plug-in would need to do conversion, see ARA SDK documentation. + const auto audioSource = playbackRegion->getAudioModification()->getAudioSource(); + const auto readerIt = audioSourceReaders.find (audioSource); + + if (std::make_tuple (audioSource->getChannelCount(), audioSource->getSampleRate()) != std::make_tuple (numChannels, sampleRate) + || (readerIt == audioSourceReaders.end())) + { + success = false; + continue; + } + + auto& reader = readerIt->second; + reader.setReadTimeout (realtime == AudioProcessor::Realtime::no ? 100 : 0); + + // Calculate buffer offsets. + const int numSamplesToRead = (int) renderRange.getLength(); + const int startInBuffer = (int) (renderRange.getStart() - blockRange.getStart()); + auto startInSource = renderRange.getStart() + modificationSampleOffset; + + // Read samples: + // first region can write directly into output, later regions need to use local buffer. + auto& readBuffer = (didRenderAnyRegion) ? *tempBuffer : buffer; + + if (! reader.get()->read (&readBuffer, startInBuffer, numSamplesToRead, startInSource, true, true)) + { + success = false; + continue; + } + + if (didRenderAnyRegion) + { + // Mix local buffer into the output buffer. + for (int c = 0; c < numChannels; ++c) + buffer.addFrom (c, startInBuffer, *tempBuffer, c, startInBuffer, numSamplesToRead); + } + else + { + // Clear any excess at start or end of the region. + if (startInBuffer != 0) + buffer.clear (0, startInBuffer); + + const int endInBuffer = startInBuffer + numSamplesToRead; + const int remainingSamples = numSamples - endInBuffer; + + if (remainingSamples != 0) + buffer.clear (endInBuffer, remainingSamples); + + didRenderAnyRegion = true; + } + } + } + + // If no playback or no region did intersect, clear buffer now. + if (! didRenderAnyRegion) + buffer.clear(); + + return success; + } + +private: + //============================================================================== + // We're subclassing here only to provide a proper default c'tor for our shared resource + + SharedResourcePointer sharedTimesliceThread; + std::map audioSourceReaders; + bool useBufferedAudioSourceReader = true; + int numChannels = 2; + double sampleRate = 48000.0; + int maximumSamplesPerBlock = 128; + std::unique_ptr> tempBuffer; +}; + +class EditorRenderer : public ARAEditorRenderer, + private ARARegionSequence::Listener +{ +public: + EditorRenderer (ARA::PlugIn::DocumentController* documentController, const PreviewState* previewStateIn) + : ARAEditorRenderer (documentController), previewState (previewStateIn), previewBuffer() + { + jassert (previewState != nullptr); + } + + ~EditorRenderer() override + { + for (const auto& rs : regionSequences) + rs->removeListener (this); + } + + void didAddPlaybackRegionToRegionSequence (ARARegionSequence*, ARAPlaybackRegion*) override + { + asyncConfigCallback.startConfigure(); + } + + void didAddRegionSequence (ARA::PlugIn::RegionSequence* rs) noexcept override + { + auto* sequence = dynamic_cast (rs); + sequence->addListener (this); + regionSequences.insert (sequence); + asyncConfigCallback.startConfigure(); + } + + void didAddPlaybackRegion (ARA::PlugIn::PlaybackRegion*) noexcept override + { + asyncConfigCallback.startConfigure(); + } + + /* An ARA host could be using either the `addPlaybackRegion()` or `addRegionSequence()` interface + so we need to check the other side of both. + + The callback must have a signature of `bool (ARAPlaybackRegion*)` + */ + template + void forEachPlaybackRegion (Callback&& cb) + { + for (const auto& playbackRegion : getPlaybackRegions()) + if (! cb (playbackRegion)) + return; + + for (const auto& regionSequence : getRegionSequences()) + for (const auto& playbackRegion : regionSequence->getPlaybackRegions()) + if (! cb (playbackRegion)) + return; + } + + void prepareToPlay (double sampleRateIn, + int maximumExpectedSamplesPerBlock, + int numChannels, + AudioProcessor::ProcessingPrecision, + AlwaysNonRealtime alwaysNonRealtime) override + { + sampleRate = sampleRateIn; + previewBuffer = std::make_unique> (numChannels, (int) (2 * sampleRateIn)); + + ignoreUnused (maximumExpectedSamplesPerBlock, alwaysNonRealtime); + } + + void releaseResources() override + { + audioSourceReaders.clear(); + } + + void reset() override + { + previewBuffer->clear(); + } + + bool processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept override + { + ignoreUnused (realtime); + + return asyncConfigCallback.withLock ([&] (bool locked) + { + if (! locked) + return true; + + if (positionInfo.getIsPlaying()) + return true; + + if (const auto previewedRegion = previewState->previewedRegion.load()) + { + const auto regionIsAssignedToEditor = [&]() + { + bool regionIsAssigned = false; + + forEachPlaybackRegion ([&previewedRegion, ®ionIsAssigned] (const auto& region) + { + if (region == previewedRegion) + { + regionIsAssigned = true; + return false; + } + + return true; + }); + + return regionIsAssigned; + }(); + + if (regionIsAssignedToEditor) + { + const auto previewTime = previewState->previewTime.load(); + + if (lastPreviewTime != previewTime || lastPlaybackRegion != previewedRegion) + { + Range previewRangeInPlaybackTime { previewTime - 0.25, previewTime + 0.25 }; + previewBuffer->clear(); + const auto rangeInOutput = readPlaybackRangeIntoBuffer (previewRangeInPlaybackTime, + previewedRegion, + *previewBuffer, + [this] (auto* source) -> auto* + { + const auto iter = audioSourceReaders.find (source); + return iter != audioSourceReaders.end() ? iter->second.get() : nullptr; + }); + + if (rangeInOutput) + { + lastPreviewTime = previewTime; + lastPlaybackRegion = previewedRegion; + previewLooper = Looper (previewBuffer.get(), *rangeInOutput); + } + } + else + { + previewLooper.writeInto (buffer); + } + } + } + + return true; + }); + } + +private: + void configure() + { + forEachPlaybackRegion ([this, maximumExpectedSamplesPerBlock = 1000] (const auto& playbackRegion) + { + const auto audioSource = playbackRegion->getAudioModification()->getAudioSource(); + + if (audioSourceReaders.find (audioSource) == audioSourceReaders.end()) + { + audioSourceReaders[audioSource] = std::make_unique ( + new ARAAudioSourceReader (playbackRegion->getAudioModification()->getAudioSource()), + *timeSliceThread, + std::max (4 * maximumExpectedSamplesPerBlock, (int) sampleRate)); + } + + return true; + }); + } + + const PreviewState* previewState = nullptr; + AsyncConfigurationCallback asyncConfigCallback { [this] { configure(); } }; + double lastPreviewTime = 0.0; + ARAPlaybackRegion* lastPlaybackRegion = nullptr; + std::unique_ptr> previewBuffer; + Looper previewLooper; + + double sampleRate = 48000.0; + SharedResourcePointer timeSliceThread; + std::map> audioSourceReaders; + + std::set regionSequences; +}; + +//============================================================================== +class ARADemoPluginDocumentControllerSpecialisation : public ARADocumentControllerSpecialisation +{ +public: + using ARADocumentControllerSpecialisation::ARADocumentControllerSpecialisation; + + PreviewState previewState; + +protected: + ARAPlaybackRenderer* doCreatePlaybackRenderer() noexcept override + { + return new PlaybackRenderer (getDocumentController()); + } + + EditorRenderer* doCreateEditorRenderer() noexcept override + { + return new EditorRenderer (getDocumentController(), &previewState); + } + + bool doRestoreObjectsFromStream (ARAInputStream& input, + const ARARestoreObjectsFilter* filter) noexcept override + { + ignoreUnused (input, filter); + return false; + } + + bool doStoreObjectsToStream (ARAOutputStream& output, const ARAStoreObjectsFilter* filter) noexcept override + { + ignoreUnused (output, filter); + return false; + } +}; + +//============================================================================== +class ARADemoPluginAudioProcessorImpl : public AudioProcessor, + public AudioProcessorARAExtension +{ +public: + //============================================================================== + ARADemoPluginAudioProcessorImpl() + : AudioProcessor (getBusesProperties()) + {} + + ~ARADemoPluginAudioProcessorImpl() override = default; + + //============================================================================== + void prepareToPlay (double sampleRate, int samplesPerBlock) override + { + prepareToPlayForARA (sampleRate, samplesPerBlock, getMainBusNumOutputChannels(), getProcessingPrecision()); + } + + void releaseResources() override + { + releaseResourcesForARA(); + } + + bool isBusesLayoutSupported (const BusesLayout& layouts) const override + { + if (layouts.getMainOutputChannelSet() != AudioChannelSet::mono() + && layouts.getMainOutputChannelSet() != AudioChannelSet::stereo()) + return false; + + return true; + } + + void processBlock (AudioBuffer& buffer, MidiBuffer& midiMessages) override + { + ignoreUnused (midiMessages); + + ScopedNoDenormals noDenormals; + + if (! processBlockForARA (buffer, isRealtime(), getPlayHead())) + processBlockBypassed (buffer, midiMessages); + } + + //============================================================================== + const String getName() const override { return "ARAPluginDemo"; } + bool acceptsMidi() const override { return true; } + bool producesMidi() const override { return true; } + double getTailLengthSeconds() const override { return 0.0; } + + //============================================================================== + int getNumPrograms() override { return 0; } + int getCurrentProgram() override { return 0; } + void setCurrentProgram (int) override {} + const String getProgramName (int) override { return "None"; } + void changeProgramName (int, const String&) override {} + + //============================================================================== + void getStateInformation (MemoryBlock&) override {} + void setStateInformation (const void*, int) override {} + +private: + //============================================================================== + static BusesProperties getBusesProperties() + { + return BusesProperties().withInput ("Input", AudioChannelSet::stereo(), true) + .withOutput ("Output", AudioChannelSet::stereo(), true); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARADemoPluginAudioProcessorImpl) +}; + +//============================================================================== +struct WaveformCache : private ARAAudioSource::Listener +{ + WaveformCache() : thumbnailCache (20) + { + } + + ~WaveformCache() override + { + for (const auto& entry : thumbnails) + { + entry.first->removeListener (this); + } + } + + //============================================================================== + void willDestroyAudioSource (ARAAudioSource* audioSource) override + { + removeAudioSource (audioSource); + } + + AudioThumbnail& getOrCreateThumbnail (ARAAudioSource* audioSource) + { + const auto iter = thumbnails.find (audioSource); + + if (iter != std::end (thumbnails)) + return *iter->second; + + auto thumb = std::make_unique (128, dummyManager, thumbnailCache); + auto& result = *thumb; + + ++hash; + thumb->setReader (new ARAAudioSourceReader (audioSource), hash); + + audioSource->addListener (this); + thumbnails.emplace (audioSource, std::move (thumb)); + return result; + } + +private: + void removeAudioSource (ARAAudioSource* audioSource) + { + audioSource->removeListener (this); + thumbnails.erase (audioSource); + } + + int64 hash = 0; + AudioFormatManager dummyManager; + AudioThumbnailCache thumbnailCache; + std::map> thumbnails; +}; + +class PlaybackRegionView : public Component, + public ChangeListener +{ +public: + PlaybackRegionView (ARAPlaybackRegion& region, WaveformCache& cache) + : playbackRegion (region), waveformCache (cache) + { + auto* audioSource = playbackRegion.getAudioModification()->getAudioSource(); + + waveformCache.getOrCreateThumbnail (audioSource).addChangeListener (this); + } + + ~PlaybackRegionView() override + { + waveformCache.getOrCreateThumbnail (playbackRegion.getAudioModification()->getAudioSource()) + .removeChangeListener (this); + } + + void mouseDown (const MouseEvent& m) override + { + const auto relativeTime = (double) m.getMouseDownX() / getLocalBounds().getWidth(); + const auto previewTime = playbackRegion.getStartInPlaybackTime() + + relativeTime * playbackRegion.getDurationInPlaybackTime(); + auto& previewState = ARADocumentControllerSpecialisation::getSpecialisedDocumentController (playbackRegion.getDocumentController())->previewState; + previewState.previewTime.store (previewTime); + previewState.previewedRegion.store (&playbackRegion); + } + + void mouseUp (const MouseEvent&) override + { + auto& previewState = ARADocumentControllerSpecialisation::getSpecialisedDocumentController (playbackRegion.getDocumentController())->previewState; + previewState.previewTime.store (0.0); + previewState.previewedRegion.store (nullptr); + } + + void changeListenerCallback (ChangeBroadcaster*) override + { + repaint(); + } + + void paint (Graphics& g) override + { + g.fillAll (Colours::white.darker()); + g.setColour (Colours::darkgrey.darker()); + auto& thumbnail = waveformCache.getOrCreateThumbnail (playbackRegion.getAudioModification()->getAudioSource()); + thumbnail.drawChannels (g, + getLocalBounds(), + playbackRegion.getStartInAudioModificationTime(), + playbackRegion.getEndInAudioModificationTime(), + 1.0f); + g.setColour (Colours::black); + g.drawRect (getLocalBounds()); + } + + void resized() override + { + repaint(); + } + +private: + ARAPlaybackRegion& playbackRegion; + WaveformCache& waveformCache; +}; + +class RegionSequenceView : public Component, + public ARARegionSequence::Listener, + public ChangeBroadcaster, + private ARAPlaybackRegion::Listener +{ +public: + RegionSequenceView (ARARegionSequence& rs, WaveformCache& cache, double pixelPerSec) + : regionSequence (rs), waveformCache (cache), zoomLevelPixelPerSecond (pixelPerSec) + { + regionSequence.addListener (this); + + for (auto* playbackRegion : regionSequence.getPlaybackRegions()) + createAndAddPlaybackRegionView (playbackRegion); + + updatePlaybackDuration(); + } + + ~RegionSequenceView() override + { + regionSequence.removeListener (this); + + for (const auto& it : playbackRegionViews) + it.first->removeListener (this); + } + + //============================================================================== + // ARA Document change callback overrides + void willRemovePlaybackRegionFromRegionSequence (ARARegionSequence*, + ARAPlaybackRegion* playbackRegion) override + { + playbackRegion->removeListener (this); + removeChildComponent (playbackRegionViews[playbackRegion].get()); + playbackRegionViews.erase (playbackRegion); + updatePlaybackDuration(); + } + + void didAddPlaybackRegionToRegionSequence (ARARegionSequence*, ARAPlaybackRegion* playbackRegion) override + { + createAndAddPlaybackRegionView (playbackRegion); + updatePlaybackDuration(); + } + + void willDestroyPlaybackRegion (ARAPlaybackRegion* playbackRegion) override + { + playbackRegion->removeListener (this); + removeChildComponent (playbackRegionViews[playbackRegion].get()); + playbackRegionViews.erase (playbackRegion); + updatePlaybackDuration(); + } + + void willUpdatePlaybackRegionProperties (ARAPlaybackRegion*, ARAPlaybackRegion::PropertiesPtr) override + { + } + + void didUpdatePlaybackRegionProperties (ARAPlaybackRegion*) override + { + updatePlaybackDuration(); + } + + void resized() override + { + for (auto& pbr : playbackRegionViews) + { + const auto playbackRegion = pbr.first; + pbr.second->setBounds ( + getLocalBounds() + .withTrimmedLeft (roundToInt (playbackRegion->getStartInPlaybackTime() * zoomLevelPixelPerSecond)) + .withWidth (roundToInt (playbackRegion->getDurationInPlaybackTime() * zoomLevelPixelPerSecond))); + } + } + + auto getPlaybackDuration() const noexcept + { + return playbackDuration; + } + + void setZoomLevel (double pixelPerSecond) + { + zoomLevelPixelPerSecond = pixelPerSecond; + resized(); + } + +private: + void createAndAddPlaybackRegionView (ARAPlaybackRegion* playbackRegion) + { + playbackRegionViews[playbackRegion] = std::make_unique (*playbackRegion, waveformCache); + playbackRegion->addListener (this); + addAndMakeVisible (*playbackRegionViews[playbackRegion]); + } + + void updatePlaybackDuration() + { + const auto iter = std::max_element ( + playbackRegionViews.begin(), + playbackRegionViews.end(), + [] (const auto& a, const auto& b) { return a.first->getEndInPlaybackTime() < b.first->getEndInPlaybackTime(); }); + + playbackDuration = iter != playbackRegionViews.end() ? iter->first->getEndInPlaybackTime() + : 0.0; + + sendChangeMessage(); + } + + ARARegionSequence& regionSequence; + WaveformCache& waveformCache; + std::unordered_map> playbackRegionViews; + double playbackDuration = 0.0; + double zoomLevelPixelPerSecond; +}; + +class ZoomControls : public Component +{ +public: + ZoomControls() + { + addAndMakeVisible (zoomInButton); + addAndMakeVisible (zoomOutButton); + } + + void setZoomInCallback (std::function cb) { zoomInButton.onClick = std::move (cb); } + void setZoomOutCallback (std::function cb) { zoomOutButton.onClick = std::move (cb); } + + void resized() override + { + FlexBox fb; + fb.justifyContent = FlexBox::JustifyContent::flexEnd; + + for (auto* button : { &zoomInButton, &zoomOutButton }) + fb.items.add (FlexItem (*button).withMinHeight (30.0f).withMinWidth (30.0f).withMargin ({ 5, 5, 5, 0 })); + + fb.performLayout (getLocalBounds()); + } + +private: + TextButton zoomInButton { "+" }, zoomOutButton { "-" }; +}; + +class TrackHeader : public Component +{ +public: + explicit TrackHeader (const ARARegionSequence& regionSequenceIn) : regionSequence (regionSequenceIn) + { + update(); + + addAndMakeVisible (trackNameLabel); + } + + void resized() override + { + trackNameLabel.setBounds (getLocalBounds().reduced (2)); + } + + void paint (Graphics& g) override + { + g.setColour (getLookAndFeel().findColour (ResizableWindow::backgroundColourId)); + g.fillRoundedRectangle (getLocalBounds().reduced (2).toType(), 6.0f); + g.setColour (getLookAndFeel().findColour (ResizableWindow::backgroundColourId).contrasting()); + g.drawRoundedRectangle (getLocalBounds().reduced (2).toType(), 6.0f, 1.0f); + } + +private: + void update() + { + const auto getWithDefaultValue = + [] (const ARA::PlugIn::OptionalProperty& optional, String defaultValue) + { + if (const ARA::ARAUtf8String value = optional) + return String (value); + + return defaultValue; + }; + + trackNameLabel.setText (getWithDefaultValue (regionSequence.getName(), "No track name"), + NotificationType::dontSendNotification); + } + + const ARARegionSequence& regionSequence; + Label trackNameLabel; +}; + +constexpr auto trackHeight = 60; + +class VerticalLayoutViewportContent : public Component +{ +public: + void resized() override + { + auto bounds = getLocalBounds(); + + for (auto* component : getChildren()) + { + component->setBounds (bounds.removeFromTop (trackHeight)); + component->resized(); + } + } + + void setOverlayComponent (Component* component) + { + if (overlayComponent != nullptr && overlayComponent != component) + removeChildComponent (overlayComponent); + + addChildComponent (component); + overlayComponent = component; + } + +private: + Component* overlayComponent = nullptr; +}; + +class VerticalLayoutViewport : public Viewport +{ +public: + VerticalLayoutViewport() + { + setViewedComponent (&content, false); + } + + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId).brighter()); + } + + std::function)> onVisibleAreaChanged; + + VerticalLayoutViewportContent content; + +private: + void visibleAreaChanged (const Rectangle& newVisibleArea) override + { + NullCheckedInvocation::invoke (onVisibleAreaChanged, newVisibleArea); + } +}; + +class OverlayComponent : public Component, + private Timer +{ +public: + class PlayheadMarkerComponent : public Component + { + void paint (Graphics& g) override { g.fillAll (juce::Colours::yellow.darker (0.2f)); } + }; + + OverlayComponent(std::function getAudioPlayheadIn) + : getAudioPlayhead (std::move (getAudioPlayheadIn)) + { + addChildComponent (playheadMarker); + setInterceptsMouseClicks (false, false); + startTimerHz (30); + } + + ~OverlayComponent() override + { + stopTimer(); + } + + void resized() override + { + doResize(); + } + + void setZoomLevel (double pixelPerSecondIn) + { + pixelPerSecond = pixelPerSecondIn; + } + + void setHorizontalOffset (int offset) + { + horizontalOffset = offset; + } + +private: + void doResize() + { + auto* aph = getAudioPlayhead(); + const auto info = aph->getPosition(); + + if (info.hasValue() && info->getIsPlaying()) + { + const auto markerX = info->getTimeInSeconds().orFallback (0) * pixelPerSecond; + const auto playheadLine = getLocalBounds().withTrimmedLeft ((int) (markerX - markerWidth / 2.0) - horizontalOffset) + .removeFromLeft ((int) markerWidth); + playheadMarker.setVisible (true); + playheadMarker.setBounds (playheadLine); + } + else + { + playheadMarker.setVisible (false); + } + } + + void timerCallback() override + { + doResize(); + } + + static constexpr double markerWidth = 2.0; + + std::function getAudioPlayhead; + double pixelPerSecond = 1.0; + int horizontalOffset = 0; + PlayheadMarkerComponent playheadMarker; +}; + +class DocumentView : public Component, + public ChangeListener, + private ARADocument::Listener, + private ARAEditorView::Listener +{ +public: + explicit DocumentView (ARADocument& document, std::function getAudioPlayhead) + : araDocument (document), + overlay (std::move (getAudioPlayhead)) + { + addAndMakeVisible (tracksBackground); + + viewport.onVisibleAreaChanged = [this] (const auto& r) + { + viewportHeightOffset = r.getY(); + overlay.setHorizontalOffset (r.getX()); + resized(); + }; + + addAndMakeVisible (viewport); + + overlay.setZoomLevel (zoomLevelPixelPerSecond); + addAndMakeVisible (overlay); + + zoomControls.setZoomInCallback ([this] { zoom (2.0); }); + zoomControls.setZoomOutCallback ([this] { zoom (0.5); }); + addAndMakeVisible (zoomControls); + + invalidateRegionSequenceViews(); + araDocument.addListener (this); + } + + ~DocumentView() override + { + araDocument.removeListener (this); + } + + //============================================================================== + // ARADocument::Listener overrides + void didReorderRegionSequencesInDocument (ARADocument*) override + { + invalidateRegionSequenceViews(); + } + + void didAddRegionSequenceToDocument (ARADocument*, ARARegionSequence*) override + { + invalidateRegionSequenceViews(); + } + + void willRemoveRegionSequenceFromDocument (ARADocument*, ARARegionSequence* regionSequence) override + { + removeRegionSequenceView (regionSequence); + } + + void didEndEditing (ARADocument*) override + { + rebuildRegionSequenceViews(); + update(); + } + + //============================================================================== + void changeListenerCallback (ChangeBroadcaster*) override + { + update(); + } + + //============================================================================== + // ARAEditorView::Listener overrides + void onNewSelection (const ARA::PlugIn::ViewSelection&) override + { + } + + void onHideRegionSequences (const std::vector&) override + { + } + + //============================================================================== + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId).darker()); + } + + void resized() override + { + auto bounds = getLocalBounds(); + const auto bottomControlsBounds = bounds.removeFromBottom (40); + const auto headerBounds = bounds.removeFromLeft (headerWidth).reduced (2); + + zoomControls.setBounds (bottomControlsBounds); + layOutVertically (headerBounds, trackHeaders, viewportHeightOffset); + tracksBackground.setBounds (bounds); + viewport.setBounds (bounds); + overlay.setBounds (bounds); + } + + //============================================================================== + void setZoomLevel (double pixelPerSecond) + { + zoomLevelPixelPerSecond = pixelPerSecond; + + for (const auto& view : regionSequenceViews) + view.second->setZoomLevel (zoomLevelPixelPerSecond); + + overlay.setZoomLevel (zoomLevelPixelPerSecond); + + update(); + } + + static constexpr int headerWidth = 120; + +private: + struct RegionSequenceViewKey + { + explicit RegionSequenceViewKey (ARARegionSequence* regionSequence) + : orderIndex (regionSequence->getOrderIndex()), sequence (regionSequence) + { + } + + bool operator< (const RegionSequenceViewKey& other) const + { + return std::tie (orderIndex, sequence) < std::tie (other.orderIndex, other.sequence); + } + + ARA::ARAInt32 orderIndex; + ARARegionSequence* sequence; + }; + + void zoom (double factor) + { + zoomLevelPixelPerSecond = jlimit (minimumZoom, minimumZoom * 32, zoomLevelPixelPerSecond * factor); + setZoomLevel (zoomLevelPixelPerSecond); + } + + template + void layOutVertically (Rectangle bounds, T& components, int verticalOffset = 0) + { + bounds = bounds.withY (bounds.getY() - verticalOffset).withHeight (bounds.getHeight() + verticalOffset); + + for (auto& component : components) + { + component.second->setBounds (bounds.removeFromTop (trackHeight)); + component.second->resized(); + } + } + + void update() + { + timelineLength = 0.0; + + for (const auto& view : regionSequenceViews) + timelineLength = std::max (timelineLength, view.second->getPlaybackDuration()); + + const Rectangle timelineSize (roundToInt (timelineLength * zoomLevelPixelPerSecond), + (int) regionSequenceViews.size() * trackHeight); + viewport.content.setSize (timelineSize.getWidth(), timelineSize.getHeight()); + viewport.content.resized(); + + resized(); + } + + void addTrackViews (ARARegionSequence* regionSequence) + { + const auto insertIntoMap = [](auto& map, auto key, auto value) -> auto& + { + auto it = map.insert ({ std::move (key), std::move (value) }); + return *(it.first->second); + }; + + auto& regionSequenceView = insertIntoMap ( + regionSequenceViews, + RegionSequenceViewKey { regionSequence }, + std::make_unique (*regionSequence, waveformCache, zoomLevelPixelPerSecond)); + + regionSequenceView.addChangeListener (this); + viewport.content.addAndMakeVisible (regionSequenceView); + + auto& trackHeader = insertIntoMap (trackHeaders, + RegionSequenceViewKey { regionSequence }, + std::make_unique (*regionSequence)); + + addAndMakeVisible (trackHeader); + } + + void removeRegionSequenceView (ARARegionSequence* regionSequence) + { + const auto& view = regionSequenceViews.find (RegionSequenceViewKey { regionSequence }); + + if (view != regionSequenceViews.cend()) + { + removeChildComponent (view->second.get()); + regionSequenceViews.erase (view); + } + + invalidateRegionSequenceViews(); + } + + void invalidateRegionSequenceViews() + { + regionSequenceViewsAreValid = false; + rebuildRegionSequenceViews(); + } + + void rebuildRegionSequenceViews() + { + if (! regionSequenceViewsAreValid && ! araDocument.getDocumentController()->isHostEditingDocument()) + { + for (auto& view : regionSequenceViews) + removeChildComponent (view.second.get()); + + regionSequenceViews.clear(); + + for (auto& view : trackHeaders) + removeChildComponent (view.second.get()); + + trackHeaders.clear(); + + for (auto* regionSequence : araDocument.getRegionSequences()) + { + addTrackViews (regionSequence); + } + + update(); + + regionSequenceViewsAreValid = true; + } + } + + class TracksBackgroundComponent : public Component + { + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId).brighter()); + } + }; + + static constexpr auto minimumZoom = 10.0; + static constexpr auto trackHeight = 60; + + ARADocument& araDocument; + + bool regionSequenceViewsAreValid = false; + double timelineLength = 0; + double zoomLevelPixelPerSecond = minimumZoom * 4; + + WaveformCache waveformCache; + TracksBackgroundComponent tracksBackground; + std::map> trackHeaders; + std::map> regionSequenceViews; + VerticalLayoutViewport viewport; + OverlayComponent overlay; + ZoomControls zoomControls; + + int viewportHeightOffset = 0; +}; + + +class ARADemoPluginProcessorEditor : public AudioProcessorEditor, + public AudioProcessorEditorARAExtension +{ +public: + explicit ARADemoPluginProcessorEditor (ARADemoPluginAudioProcessorImpl& p) + : AudioProcessorEditor (&p), + AudioProcessorEditorARAExtension (&p) + { + if (auto* editorView = getARAEditorView()) + { + auto* document = ARADocumentControllerSpecialisation::getSpecialisedDocumentController(editorView->getDocumentController())->getDocument(); + documentView = std::make_unique (*document, + [this]() { return getAudioProcessor()->getPlayHead(); }); + } + + addAndMakeVisible (documentView.get()); + + // ARA requires that plugin editors are resizable to support tight integration + // into the host UI + setResizable (true, false); + setSize (400, 300); + } + + //============================================================================== + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId)); + + if (! isARAEditorView()) + { + g.setColour (Colours::white); + g.setFont (15.0f); + g.drawFittedText ("ARA host isn't detected. This plugin only supports ARA mode", + getLocalBounds(), + Justification::centred, + 1); + } + } + + void resized() override + { + if (documentView != nullptr) + documentView->setBounds (getLocalBounds()); + } + +private: + std::unique_ptr documentView; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARADemoPluginProcessorEditor) +}; + +class ARADemoPluginAudioProcessor : public ARADemoPluginAudioProcessorImpl +{ +public: + bool hasEditor() const override { return true; } + AudioProcessorEditor* createEditor() override { return new ARADemoPluginProcessorEditor (*this); } +}; diff -Nru juce-6.1.5~ds0/examples/Plugins/ArpeggiatorPluginDemo.h juce-7.0.0~ds0/examples/Plugins/ArpeggiatorPluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/ArpeggiatorPluginDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/ArpeggiatorPluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019 + exporters: xcode_mac, vs2022 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -60,7 +60,7 @@ Arpeggiator() : AudioProcessor (BusesProperties()) // add no audio buses at all { - addParameter (speed = new AudioParameterFloat ("speed", "Arpeggiator Speed", 0.0, 1.0, 0.5)); + addParameter (speed = new AudioParameterFloat ({ "speed", 1 }, "Arpeggiator Speed", 0.0, 1.0, 0.5)); } //============================================================================== @@ -79,7 +79,7 @@ void processBlock (AudioBuffer& buffer, MidiBuffer& midi) override { - // the audio buffer in a midi effect will have zero channels! + // A pure MIDI plugin shouldn't be provided any audio data jassert (buffer.getNumChannels() == 0); // however we use the buffer to get timing information diff -Nru juce-6.1.5~ds0/examples/Plugins/AudioPluginDemo.h juce-7.0.0~ds0/examples/Plugins/AudioPluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/AudioPluginDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/AudioPluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2017, vs2019, linux_make, xcode_iphone, androidstudio + exporters: xcode_mac, vs2017, vs2022, linux_make, xcode_iphone, androidstudio moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -182,8 +182,8 @@ JuceDemoPluginAudioProcessor() : AudioProcessor (getBusesProperties()), state (*this, nullptr, "state", - { std::make_unique ("gain", "Gain", NormalisableRange (0.0f, 1.0f), 0.9f), - std::make_unique ("delay", "Delay Feedback", NormalisableRange (0.0f, 1.0f), 0.5f) }) + { std::make_unique (ParameterID { "gain", 1 }, "Gain", NormalisableRange (0.0f, 1.0f), 0.9f), + std::make_unique (ParameterID { "delay", 1 }, "Delay Feedback", NormalisableRange (0.0f, 1.0f), 0.5f) }) { // Add a sub-tree to store the state of our UI state.state.addChild ({ "uiState", { { "width", 400 }, { "height", 200 } }, {} }, -1, nullptr); @@ -321,12 +321,10 @@ class SpinLockedPosInfo { public: - SpinLockedPosInfo() { info.resetToDefault(); } - // Wait-free, but setting new info may fail if the main thread is currently // calling `get`. This is unlikely to matter in practice because // we'll be calling `set` much more frequently than `get`. - void set (const AudioPlayHead::CurrentPositionInfo& newInfo) + void set (const AudioPlayHead::PositionInfo& newInfo) { const juce::SpinLock::ScopedTryLockType lock (mutex); @@ -334,7 +332,7 @@ info = newInfo; } - AudioPlayHead::CurrentPositionInfo get() const noexcept + AudioPlayHead::PositionInfo get() const noexcept { const juce::SpinLock::ScopedLockType lock (mutex); return info; @@ -342,7 +340,7 @@ private: juce::SpinLock mutex; - AudioPlayHead::CurrentPositionInfo info; + AudioPlayHead::PositionInfo info; }; //============================================================================== @@ -510,13 +508,13 @@ } // quick-and-dirty function to format a bars/beats string - static String quarterNotePositionToBarsBeatsString (double quarterNotes, int numerator, int denominator) + static String quarterNotePositionToBarsBeatsString (double quarterNotes, AudioPlayHead::TimeSignature sig) { - if (numerator == 0 || denominator == 0) + if (sig.numerator == 0 || sig.denominator == 0) return "1|1|000"; - auto quarterNotesPerBar = (numerator * 4 / denominator); - auto beats = (fmod (quarterNotes, quarterNotesPerBar) / quarterNotesPerBar) * numerator; + auto quarterNotesPerBar = (sig.numerator * 4 / sig.denominator); + auto beats = (fmod (quarterNotes, quarterNotesPerBar) / quarterNotesPerBar) * sig.numerator; auto bar = ((int) quarterNotes) / quarterNotesPerBar + 1; auto beat = ((int) beats) + 1; @@ -526,21 +524,21 @@ } // Updates the text in our position label. - void updateTimecodeDisplay (AudioPlayHead::CurrentPositionInfo pos) + void updateTimecodeDisplay (const AudioPlayHead::PositionInfo& pos) { MemoryOutputStream displayText; + const auto sig = pos.getTimeSignature().orFallback (AudioPlayHead::TimeSignature{}); + displayText << "[" << SystemStats::getJUCEVersion() << "] " - << String (pos.bpm, 2) << " bpm, " - << pos.timeSigNumerator << '/' << pos.timeSigDenominator - << " - " << timeToTimecodeString (pos.timeInSeconds) - << " - " << quarterNotePositionToBarsBeatsString (pos.ppqPosition, - pos.timeSigNumerator, - pos.timeSigDenominator); + << String (pos.getBpm().orFallback (120.0), 2) << " bpm, " + << sig.numerator << '/' << sig.denominator + << " - " << timeToTimecodeString (pos.getTimeInSeconds().orFallback (0.0)) + << " - " << quarterNotePositionToBarsBeatsString (pos.getPpqPosition().orFallback (0.0), sig); - if (pos.isRecording) + if (pos.getIsRecording()) displayText << " (recording)"; - else if (pos.isPlaying) + else if (pos.getIsPlaying()) displayText << " (playing)"; timecodeDisplayLabel.setText (displayText.toString(), dontSendNotification); @@ -647,17 +645,11 @@ const auto newInfo = [&] { if (auto* ph = getPlayHead()) - { - AudioPlayHead::CurrentPositionInfo result; - - if (ph->getCurrentPosition (result)) - return result; - } + if (auto result = ph->getPosition()) + return *result; // If the host fails to provide the current time, we'll just use default values - AudioPlayHead::CurrentPositionInfo result; - result.resetToDefault(); - return result; + return AudioPlayHead::PositionInfo{}; }(); lastPosInfo.set (newInfo); diff -Nru juce-6.1.5~ds0/examples/Plugins/AUv3SynthPluginDemo.h juce-7.0.0~ds0/examples/Plugins/AUv3SynthPluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/AUv3SynthPluginDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/AUv3SynthPluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -317,8 +317,8 @@ currentRecording (1, 1), currentProgram (0) { // initialize parameters - addParameter (isRecordingParam = new AudioParameterBool ("isRecording", "Is Recording", false)); - addParameter (roomSizeParam = new AudioParameterFloat ("roomSize", "Room Size", 0.0f, 1.0f, 0.5f)); + addParameter (isRecordingParam = new AudioParameterBool ({ "isRecording", 1 }, "Is Recording", false)); + addParameter (roomSizeParam = new AudioParameterFloat ({ "roomSize", 1 }, "Room Size", 0.0f, 1.0f, 0.5f)); formatManager.registerBasicFormats(); diff -Nru juce-6.1.5~ds0/examples/Plugins/CMakeLists.txt juce-7.0.0~ds0/examples/Plugins/CMakeLists.txt --- juce-6.1.5~ds0/examples/Plugins/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/Plugins/DSPModulePluginDemo.h juce-7.0.0~ds0/examples/Plugins/DSPModulePluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/DSPModulePluginDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/DSPModulePluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -240,6 +240,7 @@ int getCurrentIRSize() const { return irSize; } using Parameter = AudioProcessorValueTreeState::Parameter; + using Attributes = AudioProcessorValueTreeStateParameterAttributes; // This struct holds references to the raw parameters, so that we don't have to search // the APVTS (involving string comparisons and map lookups!) every time a parameter @@ -261,45 +262,52 @@ template static Param& addToLayout (Group& layout, Ts&&... ts) { - auto param = std::make_unique (std::forward (ts)...); + auto param = new Param (std::forward (ts)...); auto& ref = *param; - add (layout, std::move (param)); + add (layout, rawToUniquePtr (param)); return ref; } - static String valueToTextFunction (float x) { return String (x, 2); } + static String valueToTextFunction (float x, int) { return String (x, 2); } static float textToValueFunction (const String& str) { return str.getFloatValue(); } - static String valueToTextPanFunction (float x) { return getPanningTextForValue ((x + 100.0f) / 200.0f); } + static auto getBasicAttributes() + { + return Attributes().withStringFromValueFunction (valueToTextFunction) + .withValueFromStringFunction (textToValueFunction); + } + + static auto getDbAttributes() { return getBasicAttributes().withLabel ("dB"); } + static auto getMsAttributes() { return getBasicAttributes().withLabel ("ms"); } + static auto getHzAttributes() { return getBasicAttributes().withLabel ("Hz"); } + static auto getPercentageAttributes() { return getBasicAttributes().withLabel ("%"); } + static auto getRatioAttributes() { return getBasicAttributes().withLabel (":1"); } + + static String valueToTextPanFunction (float x, int) { return getPanningTextForValue ((x + 100.0f) / 200.0f); } static float textToValuePanFunction (const String& str) { return getPanningValueForText (str) * 200.0f - 100.0f; } struct MainGroup { explicit MainGroup (AudioProcessorParameterGroup& layout) : inputGain (addToLayout (layout, - ID::inputGain, + ParameterID { ID::inputGain, 1 }, "Input", - "dB", NormalisableRange (-40.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), outputGain (addToLayout (layout, - ID::outputGain, + ParameterID { ID::outputGain, 1 }, "Output", - "dB", NormalisableRange (-40.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), pan (addToLayout (layout, - ID::pan, + ParameterID { ID::pan, 1 }, "Panning", - "", NormalisableRange (-100.0f, 100.0f), 0.0f, - valueToTextPanFunction, - textToValuePanFunction)) {} + Attributes().withStringFromValueFunction (valueToTextPanFunction) + .withValueFromStringFunction (textToValuePanFunction))) {} Parameter& inputGain; Parameter& outputGain; @@ -310,57 +318,46 @@ { explicit DistortionGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::distortionEnabled, + ParameterID { ID::distortionEnabled, 1 }, "Distortion", - true, - "")), + true)), type (addToLayout (layout, - ID::distortionType, + ParameterID { ID::distortionType, 1 }, "Waveshaper", StringArray { "std::tanh", "Approx. tanh" }, 0)), inGain (addToLayout (layout, - ID::distortionInGain, + ParameterID { ID::distortionInGain, 1 }, "Gain", - "dB", NormalisableRange (-40.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), lowpass (addToLayout (layout, - ID::distortionLowpass, + ParameterID { ID::distortionLowpass, 1 }, "Post Low-pass", - "Hz", NormalisableRange (20.0f, 22000.0f, 0.0f, 0.25f), 22000.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), highpass (addToLayout (layout, - ID::distortionHighpass, + ParameterID { ID::distortionHighpass, 1 }, "Pre High-pass", - "Hz", NormalisableRange (20.0f, 22000.0f, 0.0f, 0.25f), 20.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), compGain (addToLayout (layout, - ID::distortionCompGain, + ParameterID { ID::distortionCompGain, 1 }, "Compensat.", - "dB", NormalisableRange (-40.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), mix (addToLayout (layout, - ID::distortionMix, + ParameterID { ID::distortionMix, 1 }, "Mix", - "%", NormalisableRange (0.0f, 100.0f), 100.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), oversampler (addToLayout (layout, - ID::distortionOversampler, + ParameterID { ID::distortionOversampler, 1 }, "Oversampling", StringArray { "2X", "4X", @@ -384,34 +381,27 @@ { explicit MultiBandGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::multiBandEnabled, + ParameterID { ID::multiBandEnabled, 1 }, "Multi-band", - false, - "")), + false)), freq (addToLayout (layout, - ID::multiBandFreq, + ParameterID { ID::multiBandFreq, 1 }, "Sep. Freq.", - "Hz", NormalisableRange (20.0f, 22000.0f, 0.0f, 0.25f), 2000.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), lowVolume (addToLayout (layout, - ID::multiBandLowVolume, + ParameterID { ID::multiBandLowVolume, 1 }, "Low volume", - "dB", NormalisableRange (-40.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), highVolume (addToLayout (layout, - ID::multiBandHighVolume, + ParameterID { ID::multiBandHighVolume, 1 }, "High volume", - "dB", NormalisableRange (-40.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)) {} + getDbAttributes())) {} AudioParameterBool& enabled; Parameter& freq; @@ -423,23 +413,19 @@ { explicit ConvolutionGroup (AudioProcessorParameterGroup& layout) : cabEnabled (addToLayout (layout, - ID::convolutionCabEnabled, + ParameterID { ID::convolutionCabEnabled, 1 }, "Cabinet", - false, - "")), + false)), reverbEnabled (addToLayout (layout, - ID::convolutionReverbEnabled, + ParameterID { ID::convolutionReverbEnabled, 1 }, "Reverb", - false, - "")), + false)), reverbMix (addToLayout (layout, - ID::convolutionReverbMix, + ParameterID { ID::convolutionReverbMix, 1 }, "Reverb Mix", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)) {} + getPercentageAttributes())) {} AudioParameterBool& cabEnabled; AudioParameterBool& reverbEnabled; @@ -450,42 +436,33 @@ { explicit CompressorGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::compressorEnabled, + ParameterID { ID::compressorEnabled, 1 }, "Comp.", - false, - "")), + false)), threshold (addToLayout (layout, - ID::compressorThreshold, + ParameterID { ID::compressorThreshold, 1 }, "Threshold", - "dB", NormalisableRange (-100.0f, 0.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), ratio (addToLayout (layout, - ID::compressorRatio, + ParameterID { ID::compressorRatio, 1 }, "Ratio", - ":1", NormalisableRange (1.0f, 100.0f, 0.0f, 0.25f), 1.0f, - valueToTextFunction, - textToValueFunction)), + getRatioAttributes())), attack (addToLayout (layout, - ID::compressorAttack, + ParameterID { ID::compressorAttack, 1 }, "Attack", - "ms", NormalisableRange (0.01f, 1000.0f, 0.0f, 0.25f), 1.0f, - valueToTextFunction, - textToValueFunction)), + getMsAttributes())), release (addToLayout (layout, - ID::compressorRelease, + ParameterID { ID::compressorRelease, 1 }, "Release", - "ms", NormalisableRange (10.0f, 10000.0f, 0.0f, 0.25f), 100.0f, - valueToTextFunction, - textToValueFunction)) {} + getMsAttributes())) {} AudioParameterBool& enabled; Parameter& threshold; @@ -498,42 +475,33 @@ { explicit NoiseGateGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::noiseGateEnabled, + ParameterID { ID::noiseGateEnabled, 1 }, "Gate", - false, - "")), + false)), threshold (addToLayout (layout, - ID::noiseGateThreshold, + ParameterID { ID::noiseGateThreshold, 1 }, "Threshold", - "dB", NormalisableRange (-100.0f, 0.0f), -100.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), ratio (addToLayout (layout, - ID::noiseGateRatio, + ParameterID { ID::noiseGateRatio, 1 }, "Ratio", - ":1", NormalisableRange (1.0f, 100.0f, 0.0f, 0.25f), 10.0f, - valueToTextFunction, - textToValueFunction)), + getRatioAttributes())), attack (addToLayout (layout, - ID::noiseGateAttack, + ParameterID { ID::noiseGateAttack, 1 }, "Attack", - "ms", NormalisableRange (0.01f, 1000.0f, 0.0f, 0.25f), 1.0f, - valueToTextFunction, - textToValueFunction)), + getMsAttributes())), release (addToLayout (layout, - ID::noiseGateRelease, + ParameterID { ID::noiseGateRelease, 1 }, "Release", - "ms", NormalisableRange (10.0f, 10000.0f, 0.0f, 0.25f), 100.0f, - valueToTextFunction, - textToValueFunction)) {} + getMsAttributes())) {} AudioParameterBool& enabled; Parameter& threshold; @@ -546,26 +514,21 @@ { explicit LimiterGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::limiterEnabled, + ParameterID { ID::limiterEnabled, 1 }, "Limiter", - false, - "")), + false)), threshold (addToLayout (layout, - ID::limiterThreshold, + ParameterID { ID::limiterThreshold, 1 }, "Threshold", - "dB", NormalisableRange (-40.0f, 0.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), release (addToLayout (layout, - ID::limiterRelease, + ParameterID { ID::limiterRelease, 1 }, "Release", - "ms", NormalisableRange (10.0f, 10000.0f, 0.0f, 0.25f), 100.0f, - valueToTextFunction, - textToValueFunction)) {} + getMsAttributes())) {} AudioParameterBool& enabled; Parameter& threshold; @@ -576,39 +539,32 @@ { explicit DirectDelayGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::directDelayEnabled, + ParameterID { ID::directDelayEnabled, 1 }, "DL Dir.", - false, - "")), + false)), type (addToLayout (layout, - ID::directDelayType, + ParameterID { ID::directDelayType, 1 }, "DL Type", StringArray { "None", "Linear", "Lagrange", "Thiran" }, 1)), value (addToLayout (layout, - ID::directDelayValue, + ParameterID { ID::directDelayValue, 1 }, "Delay", - "smps", NormalisableRange (0.0f, 44100.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getBasicAttributes().withLabel ("smps"))), smoothing (addToLayout (layout, - ID::directDelaySmoothing, + ParameterID { ID::directDelaySmoothing, 1 }, "Smooth", - "ms", NormalisableRange (20.0f, 10000.0f, 0.0f, 0.25f), 200.0f, - valueToTextFunction, - textToValueFunction)), + getMsAttributes())), mix (addToLayout (layout, - ID::directDelayMix, + ParameterID { ID::directDelayMix, 1 }, "Delay Mix", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)) {} + getPercentageAttributes())) {} AudioParameterBool& enabled; AudioParameterChoice& type; @@ -621,55 +577,44 @@ { explicit DelayEffectGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::delayEffectEnabled, + ParameterID { ID::delayEffectEnabled, 1 }, "DL Effect", - false, - "")), + false)), type (addToLayout (layout, - ID::delayEffectType, + ParameterID { ID::delayEffectType, 1 }, "DL Type", StringArray { "None", "Linear", "Lagrange", "Thiran" }, 1)), value (addToLayout (layout, - ID::delayEffectValue, + ParameterID { ID::delayEffectValue, 1 }, "Delay", - "ms", NormalisableRange (0.01f, 1000.0f), 100.0f, - valueToTextFunction, - textToValueFunction)), + getMsAttributes())), smoothing (addToLayout (layout, - ID::delayEffectSmoothing, + ParameterID { ID::delayEffectSmoothing, 1 }, "Smooth", - "ms", NormalisableRange (20.0f, 10000.0f, 0.0f, 0.25f), 400.0f, - valueToTextFunction, - textToValueFunction)), + getMsAttributes())), lowpass (addToLayout (layout, - ID::delayEffectLowpass, + ParameterID { ID::delayEffectLowpass, 1 }, "Low-pass", - "Hz", NormalisableRange (20.0f, 22000.0f, 0.0f, 0.25f), 22000.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), mix (addToLayout (layout, - ID::delayEffectMix, + ParameterID { ID::delayEffectMix, 1 }, "Delay Mix", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), feedback (addToLayout (layout, - ID::delayEffectFeedback, + ParameterID { ID::delayEffectFeedback, 1 }, "Feedback", - "dB", NormalisableRange (-100.0f, 0.0f), -100.0f, - valueToTextFunction, - textToValueFunction)) {} + getDbAttributes())) {} AudioParameterBool& enabled; AudioParameterChoice& type; @@ -684,50 +629,39 @@ { explicit PhaserGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::phaserEnabled, + ParameterID { ID::phaserEnabled, 1 }, "Phaser", - false, - "")), + false)), rate (addToLayout (layout, - ID::phaserRate, + ParameterID { ID::phaserRate, 1 }, "Rate", - "Hz", NormalisableRange (0.05f, 20.0f, 0.0f, 0.25f), 1.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), depth (addToLayout (layout, - ID::phaserDepth, + ParameterID { ID::phaserDepth, 1 }, "Depth", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), centreFrequency (addToLayout (layout, - ID::phaserCentreFrequency, + ParameterID { ID::phaserCentreFrequency, 1 }, "Center", - "Hz", NormalisableRange (20.0f, 20000.0f, 0.0f, 0.25f), 600.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), feedback (addToLayout (layout, - ID::phaserFeedback, + ParameterID { ID::phaserFeedback, 1 }, "Feedback", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), mix (addToLayout (layout, - ID::phaserMix, + ParameterID { ID::phaserMix, 1 }, "Mix", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)) {} + getPercentageAttributes())) {} AudioParameterBool& enabled; Parameter& rate; @@ -741,50 +675,39 @@ { explicit ChorusGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::chorusEnabled, + ParameterID { ID::chorusEnabled, 1 }, "Chorus", - false, - "")), + false)), rate (addToLayout (layout, - ID::chorusRate, + ParameterID { ID::chorusRate, 1 }, "Rate", - "Hz", NormalisableRange (0.05f, 20.0f, 0.0f, 0.25f), 1.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), depth (addToLayout (layout, - ID::chorusDepth, + ParameterID { ID::chorusDepth, 1 }, "Depth", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), centreDelay (addToLayout (layout, - ID::chorusCentreDelay, + ParameterID { ID::chorusCentreDelay, 1 }, "Center", - "ms", NormalisableRange (1.0f, 100.0f, 0.0f, 0.25f), 7.0f, - valueToTextFunction, - textToValueFunction)), + getMsAttributes())), feedback (addToLayout (layout, - ID::chorusFeedback, + ParameterID { ID::chorusFeedback, 1 }, "Feedback", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), mix (addToLayout (layout, - ID::chorusMix, + ParameterID { ID::chorusMix, 1 }, "Mix", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)) {} + getPercentageAttributes())) {} AudioParameterBool& enabled; Parameter& rate; @@ -798,39 +721,32 @@ { explicit LadderGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::ladderEnabled, + ParameterID { ID::ladderEnabled, 1 }, "Ladder", - false, - "")), + false)), mode (addToLayout (layout, - ID::ladderMode, + ParameterID { ID::ladderMode, 1 }, "Mode", StringArray { "LP12", "LP24", "HP12", "HP24", "BP12", "BP24" }, 1)), cutoff (addToLayout (layout, - ID::ladderCutoff, + ParameterID { ID::ladderCutoff, 1 }, "Frequency", - "Hz", NormalisableRange (10.0f, 22000.0f, 0.0f, 0.25f), 1000.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), resonance (addToLayout (layout, - ID::ladderResonance, + ParameterID { ID::ladderResonance, 1 }, "Resonance", - "%", NormalisableRange (0.0f, 100.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), drive (addToLayout (layout, - ID::ladderDrive, + ParameterID { ID::ladderDrive, 1 }, "Drive", - "dB", NormalisableRange (0.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)) {} + getDbAttributes())) {} AudioParameterBool& enabled; AudioParameterChoice& mode; @@ -1712,7 +1628,7 @@ { if (e.mods.isRightButtonDown()) if (auto* c = editor.getHostContext()) - if (auto menuInfo = c->getContextMenuForParameterIndex (¶m)) + if (auto menuInfo = c->getContextMenuForParameter (¶m)) menuInfo->getEquivalentPopupMenu().showMenuAsync (PopupMenu::Options{}.withTargetComponent (this) .withMousePosition()); } diff -Nru juce-6.1.5~ds0/examples/Plugins/GainPluginDemo.h juce-7.0.0~ds0/examples/Plugins/GainPluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/GainPluginDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/GainPluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019 + exporters: xcode_mac, vs2022 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -59,7 +59,7 @@ : AudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::stereo()) .withOutput ("Output", AudioChannelSet::stereo())) { - addParameter (gain = new AudioParameterFloat ("gain", "Gain", 0.0f, 1.0f, 0.5f)); + addParameter (gain = new AudioParameterFloat ({ "gain", 1 }, "Gain", 0.0f, 1.0f, 0.5f)); } //============================================================================== diff -Nru juce-6.1.5~ds0/examples/Plugins/HostPluginDemo.h juce-7.0.0~ds0/examples/Plugins/HostPluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/HostPluginDemo.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/HostPluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,588 @@ +/* + ============================================================================== + + This file is part of the JUCE examples. + Copyright (c) 2022 - Raw Material Software Limited + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. + + THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, + WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR + PURPOSE, ARE DISCLAIMED. + + ============================================================================== +*/ + +/******************************************************************************* + The block below describes the properties of this PIP. A PIP is a short snippet + of code that can be read by the Projucer and used to generate a JUCE project. + + BEGIN_JUCE_PIP_METADATA + + name: HostPluginDemo + version: 1.0.0 + vendor: JUCE + website: http://juce.com + description: Plugin that can host other plugins + + dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, + juce_audio_plugin_client, juce_audio_processors, + juce_audio_utils, juce_core, juce_data_structures, + juce_events, juce_graphics, juce_gui_basics, juce_gui_extra + exporters: xcode_mac, vs2022, linux_make + + moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 + JUCE_PLUGINHOST_LV2=1 + JUCE_PLUGINHOST_VST3=1 + JUCE_PLUGINHOST_VST=0 + JUCE_PLUGINHOST_AU=1 + + type: AudioProcessor + mainClass: HostAudioProcessor + + useLocalCopy: 1 + + pluginCharacteristics: pluginIsSynth, pluginWantsMidiIn, pluginProducesMidiOut, + pluginEditorRequiresKeys + + END_JUCE_PIP_METADATA + +*******************************************************************************/ + +#pragma once + +//============================================================================== +enum class EditorStyle { thisWindow, newWindow }; + +class HostAudioProcessorImpl : public AudioProcessor, + private ChangeListener +{ +public: + HostAudioProcessorImpl() + : AudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::stereo(), true) + .withOutput ("Output", AudioChannelSet::stereo(), true)) + { + appProperties.setStorageParameters ([&] + { + PropertiesFile::Options opt; + opt.applicationName = getName(); + opt.commonToAllUsers = false; + opt.doNotSave = false; + opt.filenameSuffix = ".props"; + opt.ignoreCaseOfKeyNames = false; + opt.storageFormat = PropertiesFile::StorageFormat::storeAsXML; + opt.osxLibrarySubFolder = "Application Support"; + return opt; + }()); + + pluginFormatManager.addDefaultFormats(); + + if (auto savedPluginList = appProperties.getUserSettings()->getXmlValue ("pluginList")) + pluginList.recreateFromXml (*savedPluginList); + + MessageManagerLock lock; + pluginList.addChangeListener (this); + } + + bool isBusesLayoutSupported (const BusesLayout& layouts) const override + { + const auto& mainOutput = layouts.getMainOutputChannelSet(); + const auto& mainInput = layouts.getMainInputChannelSet(); + + if (! mainInput.isDisabled() && mainInput != mainOutput) + return false; + + if (mainOutput.size() > 2) + return false; + + return true; + } + + void prepareToPlay (double sr, int bs) override + { + const ScopedLock sl (innerMutex); + + active = true; + + if (inner != nullptr) + { + inner->setRateAndBufferSizeDetails (sr, bs); + inner->prepareToPlay (sr, bs); + } + } + + void releaseResources() override + { + const ScopedLock sl (innerMutex); + + active = false; + + if (inner != nullptr) + inner->releaseResources(); + } + + void reset() override + { + const ScopedLock sl (innerMutex); + + if (inner != nullptr) + inner->reset(); + } + + // In this example, we don't actually pass any audio through the inner processor. + // In a 'real' plugin, we'd need to add some synchronisation to ensure that the inner + // plugin instance was never modified (deleted, replaced etc.) during a call to processBlock. + void processBlock (AudioBuffer&, MidiBuffer&) override + { + jassert (! isUsingDoublePrecision()); + } + + void processBlock (AudioBuffer&, MidiBuffer&) override + { + jassert (isUsingDoublePrecision()); + } + + bool hasEditor() const override { return false; } + AudioProcessorEditor* createEditor() override { return nullptr; } + + const String getName() const override { return "HostPluginDemo"; } + bool acceptsMidi() const override { return true; } + bool producesMidi() const override { return true; } + double getTailLengthSeconds() const override { return 0.0; } + + int getNumPrograms() override { return 0; } + int getCurrentProgram() override { return 0; } + void setCurrentProgram (int) override {} + const String getProgramName (int) override { return "None"; } + void changeProgramName (int, const String&) override {} + + void getStateInformation (MemoryBlock& destData) override + { + const ScopedLock sl (innerMutex); + + XmlElement xml ("state"); + + if (inner != nullptr) + { + xml.setAttribute (editorStyleTag, (int) editorStyle); + xml.addChildElement (inner->getPluginDescription().createXml().release()); + xml.addChildElement ([this] + { + MemoryBlock innerState; + inner->getStateInformation (innerState); + + auto stateNode = std::make_unique (innerStateTag); + stateNode->addTextElement (innerState.toBase64Encoding()); + return stateNode.release(); + }()); + } + + const auto text = xml.toString(); + destData.replaceAll (text.toRawUTF8(), text.getNumBytesAsUTF8()); + } + + void setStateInformation (const void* data, int sizeInBytes) override + { + const ScopedLock sl (innerMutex); + + auto xml = XmlDocument::parse (String (CharPointer_UTF8 (static_cast (data)), (size_t) sizeInBytes)); + + if (auto* pluginNode = xml->getChildByName ("PLUGIN")) + { + PluginDescription pd; + pd.loadFromXml (*pluginNode); + + MemoryBlock innerState; + innerState.fromBase64Encoding (xml->getChildElementAllSubText (innerStateTag, {})); + + setNewPlugin (pd, + (EditorStyle) xml->getIntAttribute (editorStyleTag, 0), + innerState); + } + } + + void setNewPlugin (const PluginDescription& pd, EditorStyle where, const MemoryBlock& mb = {}) + { + const ScopedLock sl (innerMutex); + + const auto callback = [this, where, mb] (std::unique_ptr instance, const String& error) + { + if (error.isNotEmpty()) + { + NativeMessageBox::showMessageBoxAsync (MessageBoxIconType::WarningIcon, + "Plugin Load Failed", + error, + nullptr, + nullptr); + return; + } + + inner = std::move (instance); + editorStyle = where; + + if (inner != nullptr && ! mb.isEmpty()) + inner->setStateInformation (mb.getData(), (int) mb.getSize()); + + // In a 'real' plugin, we'd also need to set the bus configuration of the inner plugin. + // One possibility would be to match the bus configuration of the wrapper plugin, but + // the inner plugin isn't guaranteed to support the same layout. Alternatively, we + // could try to apply a reasonably similar layout, and maintain a mapping between the + // inner/outer channel layouts. + // + // In any case, it is essential that the inner plugin is told about the bus + // configuration that will be used. The AudioBuffer passed to the inner plugin must also + // exactly match this layout. + + if (active) + { + inner->setRateAndBufferSizeDetails (getSampleRate(), getBlockSize()); + inner->prepareToPlay (getSampleRate(), getBlockSize()); + } + + NullCheckedInvocation::invoke (pluginChanged); + }; + + pluginFormatManager.createPluginInstanceAsync (pd, getSampleRate(), getBlockSize(), callback); + } + + void clearPlugin() + { + const ScopedLock sl (innerMutex); + + inner = nullptr; + NullCheckedInvocation::invoke (pluginChanged); + } + + bool isPluginLoaded() const + { + const ScopedLock sl (innerMutex); + return inner != nullptr; + } + + std::unique_ptr createInnerEditor() const + { + const ScopedLock sl (innerMutex); + return rawToUniquePtr (inner->hasEditor() ? inner->createEditorIfNeeded() : nullptr); + } + + EditorStyle getEditorStyle() const noexcept { return editorStyle; } + + ApplicationProperties appProperties; + AudioPluginFormatManager pluginFormatManager; + KnownPluginList pluginList; + std::function pluginChanged; + +private: + CriticalSection innerMutex; + std::unique_ptr inner; + EditorStyle editorStyle = EditorStyle{}; + bool active = false; + + static constexpr const char* innerStateTag = "inner_state"; + static constexpr const char* editorStyleTag = "editor_style"; + + void changeListenerCallback (ChangeBroadcaster* source) override + { + if (source != &pluginList) + return; + + if (auto savedPluginList = pluginList.createXml()) + { + appProperties.getUserSettings()->setValue ("pluginList", savedPluginList.get()); + appProperties.saveIfNeeded(); + } + } +}; + + +constexpr const char* HostAudioProcessorImpl::innerStateTag; +constexpr const char* HostAudioProcessorImpl::editorStyleTag; + +//============================================================================== +constexpr auto margin = 10; + +static void doLayout (Component* main, Component& bottom, int bottomHeight, Rectangle bounds) +{ + Grid grid; + grid.setGap (Grid::Px { margin }); + grid.templateColumns = { Grid::TrackInfo { Grid::Fr { 1 } } }; + grid.templateRows = { Grid::TrackInfo { Grid::Fr { 1 } }, + Grid::TrackInfo { Grid::Px { bottomHeight }} }; + grid.items = { GridItem { main }, GridItem { bottom }.withMargin ({ 0, margin, margin, margin }) }; + grid.performLayout (bounds); +} + +class PluginLoaderComponent : public Component +{ +public: + template + PluginLoaderComponent (AudioPluginFormatManager& manager, + KnownPluginList& list, + Callback&& callback) + : pluginListComponent (manager, list, {}, {}) + { + pluginListComponent.getTableListBox().setMultipleSelectionEnabled (false); + + addAndMakeVisible (pluginListComponent); + addAndMakeVisible (buttons); + + const auto getCallback = [this, &list, callback = std::forward (callback)] (EditorStyle style) + { + return [this, &list, callback, style] + { + const auto index = pluginListComponent.getTableListBox().getSelectedRow(); + const auto& types = list.getTypes(); + + if (isPositiveAndBelow (index, types.size())) + NullCheckedInvocation::invoke (callback, types.getReference (index), style); + }; + }; + + buttons.thisWindowButton.onClick = getCallback (EditorStyle::thisWindow); + buttons.newWindowButton .onClick = getCallback (EditorStyle::newWindow); + } + + void resized() override + { + doLayout (&pluginListComponent, buttons, 80, getLocalBounds()); + } + +private: + struct Buttons : public Component + { + Buttons() + { + label.setJustificationType (Justification::centred); + + addAndMakeVisible (label); + addAndMakeVisible (thisWindowButton); + addAndMakeVisible (newWindowButton); + } + + void resized() override + { + Grid vertical; + vertical.autoFlow = Grid::AutoFlow::row; + vertical.setGap (Grid::Px { margin }); + vertical.autoRows = vertical.autoColumns = Grid::TrackInfo { Grid::Fr { 1 } }; + vertical.items.insertMultiple (0, GridItem{}, 2); + vertical.performLayout (getLocalBounds()); + + label.setBounds (vertical.items[0].currentBounds.toNearestInt()); + + Grid grid; + grid.autoFlow = Grid::AutoFlow::column; + grid.setGap (Grid::Px { margin }); + grid.autoRows = grid.autoColumns = Grid::TrackInfo { Grid::Fr { 1 } }; + grid.items = { GridItem { thisWindowButton }, + GridItem { newWindowButton } }; + + grid.performLayout (vertical.items[1].currentBounds.toNearestInt()); + } + + Label label { "", "Select a plugin from the list, then display it using the buttons below." }; + TextButton thisWindowButton { "Open In This Window" }; + TextButton newWindowButton { "Open In New Window" }; + }; + + PluginListComponent pluginListComponent; + Buttons buttons; +}; + +//============================================================================== +class PluginEditorComponent : public Component +{ +public: + template + PluginEditorComponent (std::unique_ptr editorIn, Callback&& onClose) + : editor (std::move (editorIn)) + { + addAndMakeVisible (editor.get()); + addAndMakeVisible (closeButton); + + childBoundsChanged (editor.get()); + + closeButton.onClick = std::forward (onClose); + } + + void setScaleFactor (float scale) + { + if (editor != nullptr) + editor->setScaleFactor (scale); + } + + void resized() override + { + doLayout (editor.get(), closeButton, buttonHeight, getLocalBounds()); + } + + void childBoundsChanged (Component* child) override + { + if (child != editor.get()) + return; + + const auto size = editor != nullptr ? editor->getLocalBounds() + : Rectangle(); + + setSize (size.getWidth(), margin + buttonHeight + size.getHeight()); + } + +private: + static constexpr auto buttonHeight = 40; + + std::unique_ptr editor; + TextButton closeButton { "Close Plugin" }; +}; + +//============================================================================== +class ScaledDocumentWindow : public DocumentWindow +{ +public: + ScaledDocumentWindow (Colour bg, float scale) + : DocumentWindow ("Editor", bg, 0), desktopScale (scale) {} + + float getDesktopScaleFactor() const override { return Desktop::getInstance().getGlobalScaleFactor() * desktopScale; } + +private: + float desktopScale = 1.0f; +}; + +//============================================================================== +class HostAudioProcessorEditor : public AudioProcessorEditor +{ +public: + explicit HostAudioProcessorEditor (HostAudioProcessorImpl& owner) + : AudioProcessorEditor (owner), + hostProcessor (owner), + loader (owner.pluginFormatManager, + owner.pluginList, + [&owner] (const PluginDescription& pd, + EditorStyle editorStyle) + { + owner.setNewPlugin (pd, editorStyle); + }), + scopedCallback (owner.pluginChanged, [this] { pluginChanged(); }) + { + setSize (500, 500); + setResizable (false, false); + addAndMakeVisible (closeButton); + addAndMakeVisible (loader); + + hostProcessor.pluginChanged(); + + closeButton.onClick = [this] { clearPlugin(); }; + } + + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId).darker()); + } + + void resized() override + { + closeButton.setBounds (getLocalBounds().withSizeKeepingCentre (200, buttonHeight)); + loader.setBounds (getLocalBounds()); + } + + void childBoundsChanged (Component* child) override + { + if (child != editor.get()) + return; + + const auto size = editor != nullptr ? editor->getLocalBounds() + : Rectangle(); + + setSize (size.getWidth(), size.getHeight()); + } + + void setScaleFactor (float scale) override + { + currentScaleFactor = scale; + AudioProcessorEditor::setScaleFactor (scale); + + const auto posted = MessageManager::callAsync ([ref = SafePointer (this), scale] + { + if (auto* r = ref.getComponent()) + if (auto* e = r->currentEditorComponent) + e->setScaleFactor (scale); + }); + + jassertquiet (posted); + } + +private: + void pluginChanged() + { + loader.setVisible (! hostProcessor.isPluginLoaded()); + closeButton.setVisible (hostProcessor.isPluginLoaded()); + + if (hostProcessor.isPluginLoaded()) + { + auto editorComponent = std::make_unique (hostProcessor.createInnerEditor(), [this] + { + const auto posted = MessageManager::callAsync ([this] { clearPlugin(); }); + jassertquiet (posted); + }); + + editorComponent->setScaleFactor (currentScaleFactor); + currentEditorComponent = editorComponent.get(); + + editor = [&]() -> std::unique_ptr + { + switch (hostProcessor.getEditorStyle()) + { + case EditorStyle::thisWindow: + addAndMakeVisible (editorComponent.get()); + setSize (editorComponent->getWidth(), editorComponent->getHeight()); + return std::move (editorComponent); + + case EditorStyle::newWindow: + const auto bg = getLookAndFeel().findColour (ResizableWindow::backgroundColourId).darker(); + auto window = std::make_unique (bg, currentScaleFactor); + window->setAlwaysOnTop (true); + window->setContentOwned (editorComponent.release(), true); + window->centreAroundComponent (this, window->getWidth(), window->getHeight()); + window->setVisible (true); + return window; + } + + jassertfalse; + return nullptr; + }(); + } + else + { + editor = nullptr; + setSize (500, 500); + } + } + + void clearPlugin() + { + currentEditorComponent = nullptr; + editor = nullptr; + hostProcessor.clearPlugin(); + } + + static constexpr auto buttonHeight = 30; + + HostAudioProcessorImpl& hostProcessor; + PluginLoaderComponent loader; + std::unique_ptr editor; + PluginEditorComponent* currentEditorComponent = nullptr; + ScopedValueSetter> scopedCallback; + TextButton closeButton { "Close Plugin" }; + float currentScaleFactor = 1.0f; +}; + +//============================================================================== +class HostAudioProcessor : public HostAudioProcessorImpl +{ +public: + bool hasEditor() const override { return true; } + AudioProcessorEditor* createEditor() override { return new HostAudioProcessorEditor (*this); } +}; diff -Nru juce-6.1.5~ds0/examples/Plugins/InterAppAudioEffectPluginDemo.h juce-7.0.0~ds0/examples/Plugins/InterAppAudioEffectPluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/InterAppAudioEffectPluginDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/InterAppAudioEffectPluginDemo.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,529 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited - - The code included in this file is provided under the terms of the ISC license - http://www.isc.org/downloads/software-support-policy/isc-license. 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. - - THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, - WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR - PURPOSE, ARE DISCLAIMED. - - ============================================================================== -*/ - -/******************************************************************************* - The block below describes the properties of this PIP. A PIP is a short snippet - of code that can be read by the Projucer and used to generate a JUCE project. - - BEGIN_JUCE_PIP_METADATA - - name: InterAppAudioEffectPlugin - version: 1.0.0 - vendor: JUCE - website: http://juce.com - description: Inter-app audio effect plugin. - - dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, - juce_audio_plugin_client, juce_audio_processors, - juce_audio_utils, juce_core, juce_data_structures, - juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_iphone - - moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 - - type: AudioProcessor - mainClass: IAAEffectProcessor - - useLocalCopy: 1 - - extraPluginFormats: IAA - - END_JUCE_PIP_METADATA - -*******************************************************************************/ - -#pragma once - -#include - -//============================================================================== -// A very simple decaying meter. -class SimpleMeter : public Component, - private Timer -{ -public: - SimpleMeter() - { - startTimerHz (30); - } - - //============================================================================== - void paint (Graphics& g) override - { - g.fillAll (Colours::transparentBlack); - - auto area = g.getClipBounds(); - g.setColour (getLookAndFeel().findColour (Slider::thumbColourId)); - g.fillRoundedRectangle (area.toFloat(), 6.0); - - auto unfilledHeight = area.getHeight() * (1.0 - level); - g.reduceClipRegion (area.getX(), area.getY(), - area.getWidth(), (int) unfilledHeight); - g.setColour (getLookAndFeel().findColour (Slider::trackColourId)); - g.fillRoundedRectangle (area.toFloat(), 6.0); - } - - //============================================================================== - // Called from the audio thread. - void update (float newLevel) - { - // We don't care if maxLevel gets set to zero (in timerCallback) between the - // load and the assignment. - maxLevel = jmax (maxLevel.load(), newLevel); - } - -private: - //============================================================================== - void timerCallback() override - { - auto callbackLevel = maxLevel.exchange (0.0); - - float decayFactor = 0.95f; - - if (callbackLevel > level) - level = callbackLevel; - else if (level > 0.001) - level *= decayFactor; - else - level = 0; - - repaint(); - } - - std::atomic maxLevel {0.0}; - float level = 0; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SimpleMeter) -}; - -//============================================================================== -// A simple Inter-App Audio plug-in with a gain control and some meters. -class IAAEffectProcessor : public AudioProcessor -{ -public: - IAAEffectProcessor() - : AudioProcessor (BusesProperties() - .withInput ("Input", AudioChannelSet::stereo(), true) - .withOutput ("Output", AudioChannelSet::stereo(), true)), - parameters (*this, nullptr, "InterAppAudioEffect", - { std::make_unique ("gain", "Gain", NormalisableRange (0.0f, 1.0f), 1.0f / 3.14f) }) - { - } - - //============================================================================== - void prepareToPlay (double, int) override - { - previousGain = *parameters.getRawParameterValue ("gain"); - } - - void releaseResources() override {} - - bool isBusesLayoutSupported (const BusesLayout& layouts) const override - { - if (layouts.getMainInputChannels() > 2) - return false; - - if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet()) - return false; - - return true; - } - - using AudioProcessor::processBlock; - - void processBlock (AudioBuffer& buffer, MidiBuffer&) override - { - float gain = *parameters.getRawParameterValue ("gain"); - - auto totalNumInputChannels = getTotalNumInputChannels(); - auto totalNumOutputChannels = getTotalNumOutputChannels(); - - auto numSamples = buffer.getNumSamples(); - - for (auto i = totalNumInputChannels; i < totalNumOutputChannels; ++i) - buffer.clear (i, 0, buffer.getNumSamples()); - - // Apply the gain to the samples using a ramp to avoid discontinuities in - // the audio between processed buffers. - for (auto channel = 0; channel < totalNumInputChannels; ++channel) - { - buffer.applyGainRamp (channel, 0, numSamples, previousGain, gain); - auto newLevel = buffer.getMagnitude (channel, 0, numSamples); - - meterListeners.call ([=] (MeterListener& l) { l.handleNewMeterValue (channel, newLevel); }); - } - - previousGain = gain; - - // Now ask the host for the current time so we can store it to be displayed later. - updateCurrentTimeInfoFromHost (lastPosInfo); - } - - //============================================================================== - AudioProcessorEditor* createEditor() override - { - return new IAAEffectEditor (*this, parameters); - } - - bool hasEditor() const override { return true; } - - //============================================================================== - const String getName() const override { return "InterAppAudioEffectPlugin"; } - bool acceptsMidi() const override { return false; } - bool producesMidi() const override { return false; } - double getTailLengthSeconds() const override { return 0.0; } - - //============================================================================== - int getNumPrograms() override { return 1; } - int getCurrentProgram() override { return 0; } - void setCurrentProgram (int) override {} - const String getProgramName (int) override { return "None"; } - void changeProgramName (int, const String&) override {} - - //============================================================================== - void getStateInformation (MemoryBlock& destData) override - { - if (auto xml = parameters.state.createXml()) - copyXmlToBinary (*xml, destData); - } - - void setStateInformation (const void* data, int sizeInBytes) override - { - if (auto xmlState = getXmlFromBinary (data, sizeInBytes)) - if (xmlState->hasTagName (parameters.state.getType())) - parameters.state = ValueTree::fromXml (*xmlState); - } - - //============================================================================== - bool updateCurrentTimeInfoFromHost (AudioPlayHead::CurrentPositionInfo& posInfo) - { - if (auto* ph = getPlayHead()) - { - AudioPlayHead::CurrentPositionInfo newTime; - - if (ph->getCurrentPosition (newTime)) - { - posInfo = newTime; // Successfully got the current time from the host. - return true; - } - } - - // If the host fails to provide the current time, we'll just reset our copy to a default. - lastPosInfo.resetToDefault(); - - return false; - } - - // Allow an IAAAudioProcessorEditor to register as a listener to receive new - // meter values directly from the audio thread. - struct MeterListener - { - virtual ~MeterListener() {} - - virtual void handleNewMeterValue (int, float) = 0; - }; - - void addMeterListener (MeterListener& listener) { meterListeners.add (&listener); } - void removeMeterListener (MeterListener& listener) { meterListeners.remove (&listener); } - - -private: - //============================================================================== - class IAAEffectEditor : public AudioProcessorEditor, - private IAAEffectProcessor::MeterListener, - private Timer - { - public: - IAAEffectEditor (IAAEffectProcessor& p, - AudioProcessorValueTreeState& vts) - : AudioProcessorEditor (p), - iaaEffectProcessor (p), - parameters (vts) - { - // Register for meter value updates. - iaaEffectProcessor.addMeterListener (*this); - - gainSlider.setSliderStyle (Slider::SliderStyle::LinearVertical); - gainSlider.setTextBoxStyle (Slider::TextEntryBoxPosition::TextBoxAbove, false, 60, 20); - addAndMakeVisible (gainSlider); - - for (auto& meter : meters) - addAndMakeVisible (meter); - - // Configure all the graphics for the transport control. - - transportText.setFont (Font (Font::getDefaultMonospacedFontName(), 18.0f, Font::plain)); - transportText.setJustificationType (Justification::topLeft); - addChildComponent (transportText); - - Path rewindShape; - rewindShape.addRectangle (0.0, 0.0, 5.0, buttonSize); - rewindShape.addTriangle (0.0, buttonSize * 0.5f, buttonSize, 0.0, buttonSize, buttonSize); - rewindButton.setShape (rewindShape, true, true, false); - rewindButton.onClick = [this] - { - if (transportControllable()) - iaaEffectProcessor.getPlayHead()->transportRewind(); - }; - addChildComponent (rewindButton); - - Path playShape; - playShape.addTriangle (0.0, 0.0, 0.0, buttonSize, buttonSize, buttonSize / 2); - playButton.setShape (playShape, true, true, false); - playButton.onClick = [this] - { - if (transportControllable()) - iaaEffectProcessor.getPlayHead()->transportPlay (! lastPosInfo.isPlaying); - }; - addChildComponent (playButton); - - Path recordShape; - recordShape.addEllipse (0.0, 0.0, buttonSize, buttonSize); - recordButton.setShape (recordShape, true, true, false); - recordButton.onClick = [this] - { - if (transportControllable()) - iaaEffectProcessor.getPlayHead()->transportRecord (! lastPosInfo.isRecording); - }; - addChildComponent (recordButton); - - // Configure the switch to host button. - - switchToHostButtonLabel.setFont (Font (Font::getDefaultMonospacedFontName(), 18.0f, Font::plain)); - switchToHostButtonLabel.setJustificationType (Justification::centredRight); - switchToHostButtonLabel.setText ("Switch to\nhost app:", dontSendNotification); - addChildComponent (switchToHostButtonLabel); - - switchToHostButton.onClick = [this] - { - if (transportControllable()) - { - PluginHostType hostType; - hostType.switchToHostApplication(); - } - }; - addChildComponent (switchToHostButton); - - auto screenSize = Desktop::getInstance().getDisplays().getPrimaryDisplay()->userArea; - setSize (screenSize.getWidth(), screenSize.getHeight()); - - resized(); - - startTimerHz (60); - } - - ~IAAEffectEditor() override - { - iaaEffectProcessor.removeMeterListener (*this); - } - - //============================================================================== - void paint (Graphics& g) override - { - g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId)); - } - - void resized() override - { - auto area = getBounds().reduced (20); - - gainSlider.setBounds (area.removeFromLeft (60)); - - for (auto& meter : meters) - { - area.removeFromLeft (10); - meter.setBounds (area.removeFromLeft (20)); - } - - area.removeFromLeft (20); - transportText.setBounds (area.removeFromTop (120)); - - auto navigationArea = area.removeFromTop ((int) buttonSize); - rewindButton.setTopLeftPosition (navigationArea.getPosition()); - navigationArea.removeFromLeft ((int) buttonSize + 10); - playButton.setTopLeftPosition (navigationArea.getPosition()); - navigationArea.removeFromLeft ((int) buttonSize + 10); - recordButton.setTopLeftPosition (navigationArea.getPosition()); - - area.removeFromTop (30); - - auto appSwitchArea = area.removeFromTop ((int) buttonSize); - switchToHostButtonLabel.setBounds (appSwitchArea.removeFromLeft (100)); - appSwitchArea.removeFromLeft (5); - switchToHostButton.setBounds (appSwitchArea.removeFromLeft ((int) buttonSize)); - } - - private: - //============================================================================== - // Called from the audio thread. - void handleNewMeterValue (int channel, float value) override - { - meters[(size_t) channel].update (value); - } - - //============================================================================== - void timerCallback () override - { - auto timeInfoSuccess = iaaEffectProcessor.updateCurrentTimeInfoFromHost (lastPosInfo); - transportText.setVisible (timeInfoSuccess); - - if (timeInfoSuccess) - updateTransportTextDisplay(); - - updateTransportButtonsDisplay(); - - updateSwitchToHostDisplay(); - } - - //============================================================================== - bool transportControllable() - { - auto processorPlayHead = iaaEffectProcessor.getPlayHead(); - return processorPlayHead != nullptr && processorPlayHead->canControlTransport(); - } - - //============================================================================== - // quick-and-dirty function to format a timecode string - String timeToTimecodeString (double seconds) - { - auto millisecs = roundToInt (seconds * 1000.0); - auto absMillisecs = std::abs (millisecs); - - return String::formatted ("%02d:%02d:%02d.%03d", - millisecs / 360000, - (absMillisecs / 60000) % 60, - (absMillisecs / 1000) % 60, - absMillisecs % 1000); - } - - // A quick-and-dirty function to format a bars/beats string. - String quarterNotePositionToBarsBeatsString (double quarterNotes, int numerator, int denominator) - { - if (numerator == 0 || denominator == 0) - return "1|1|000"; - - auto quarterNotesPerBar = (numerator * 4 / denominator); - auto beats = (fmod (quarterNotes, quarterNotesPerBar) / quarterNotesPerBar) * numerator; - - auto bar = ((int) quarterNotes) / quarterNotesPerBar + 1; - auto beat = ((int) beats) + 1; - auto ticks = ((int) (fmod (beats, 1.0) * 960.0 + 0.5)); - - return String::formatted ("%d|%d|%03d", bar, beat, ticks); - } - - void updateTransportTextDisplay() - { - MemoryOutputStream displayText; - - displayText << "[" << SystemStats::getJUCEVersion() << "]\n" - << String (lastPosInfo.bpm, 2) << " bpm\n" - << lastPosInfo.timeSigNumerator << '/' << lastPosInfo.timeSigDenominator << "\n" - << timeToTimecodeString (lastPosInfo.timeInSeconds) << "\n" - << quarterNotePositionToBarsBeatsString (lastPosInfo.ppqPosition, - lastPosInfo.timeSigNumerator, - lastPosInfo.timeSigDenominator) << "\n"; - - if (lastPosInfo.isRecording) - displayText << "(recording)"; - else if (lastPosInfo.isPlaying) - displayText << "(playing)"; - - transportText.setText (displayText.toString(), dontSendNotification); - } - - void updateTransportButtonsDisplay() - { - auto visible = iaaEffectProcessor.getPlayHead() != nullptr - && iaaEffectProcessor.getPlayHead()->canControlTransport(); - - if (rewindButton.isVisible() != visible) - { - rewindButton.setVisible (visible); - playButton.setVisible (visible); - recordButton.setVisible (visible); - } - - if (visible) - { - auto playColour = lastPosInfo.isPlaying ? Colours::green : defaultButtonColour; - playButton.setColours (playColour, playColour, playColour); - playButton.repaint(); - - auto recordColour = lastPosInfo.isRecording ? Colours::red : defaultButtonColour; - recordButton.setColours (recordColour, recordColour, recordColour); - recordButton.repaint(); - } - } - - void updateSwitchToHostDisplay() - { - PluginHostType hostType; - auto visible = hostType.isInterAppAudioConnected(); - - if (switchToHostButtonLabel.isVisible() != visible) - { - switchToHostButtonLabel.setVisible (visible); - switchToHostButton.setVisible (visible); - - if (visible) - { - auto icon = hostType.getHostIcon ((int) buttonSize); - switchToHostButton.setImages(false, true, true, - icon, 1.0, Colours::transparentBlack, - icon, 1.0, Colours::transparentBlack, - icon, 1.0, Colours::transparentBlack); - } - } - } - - IAAEffectProcessor& iaaEffectProcessor; - AudioProcessorValueTreeState& parameters; - - const float buttonSize = 30.0f; - const Colour defaultButtonColour = Colours::darkgrey; - ShapeButton rewindButton {"Rewind", defaultButtonColour, defaultButtonColour, defaultButtonColour}; - ShapeButton playButton {"Play", defaultButtonColour, defaultButtonColour, defaultButtonColour}; - ShapeButton recordButton {"Record", defaultButtonColour, defaultButtonColour, defaultButtonColour}; - - Slider gainSlider; - AudioProcessorValueTreeState::SliderAttachment gainAttachment = { parameters, "gain", gainSlider }; - - std::array meters; - - ImageButton switchToHostButton; - Label transportText, switchToHostButtonLabel; - - AudioPlayHead::CurrentPositionInfo lastPosInfo; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IAAEffectEditor) - }; - - //============================================================================== - AudioProcessorValueTreeState parameters; - float previousGain = 0.0f; - - // This keeps a copy of the last set of timing info that was acquired during an - // audio callback - the UI component will display this. - AudioPlayHead::CurrentPositionInfo lastPosInfo; - - ListenerList meterListeners; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IAAEffectProcessor) -}; diff -Nru juce-6.1.5~ds0/examples/Plugins/MidiLoggerPluginDemo.h juce-7.0.0~ds0/examples/Plugins/MidiLoggerPluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/MidiLoggerPluginDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/MidiLoggerPluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -80,6 +80,9 @@ template void addMessages (It begin, It end) { + if (begin == end) + return; + const auto numNewMessages = (int) std::distance (begin, end); const auto numToAdd = juce::jmin (numToStore, numNewMessages); const auto numToRemove = jmax (0, (int) messages.size() + numToAdd - numToStore); diff -Nru juce-6.1.5~ds0/examples/Plugins/MultiOutSynthPluginDemo.h juce-7.0.0~ds0/examples/Plugins/MultiOutSynthPluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/MultiOutSynthPluginDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/MultiOutSynthPluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019 + exporters: xcode_mac, vs2022 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -123,6 +123,10 @@ auto midiChannelBuffer = filterMidiMessagesForChannel (midiBuffer, busNr + 1); auto audioBusBuffer = getBusBuffer (buffer, false, busNr); + // Voices add to the contents of the buffer. Make sure the buffer is clear before + // rendering, just in case the host left old data in the buffer. + audioBusBuffer.clear(); + synth [busNr]->renderNextBlock (audioBusBuffer, midiChannelBuffer, 0, audioBusBuffer.getNumSamples()); } } @@ -146,11 +150,14 @@ bool isBusesLayoutSupported (const BusesLayout& layout) const override { - for (const auto& bus : layout.outputBuses) - if (bus != AudioChannelSet::stereo()) - return false; + const auto& outputs = layout.outputBuses; - return layout.inputBuses.isEmpty() && 1 <= layout.outputBuses.size(); + return layout.inputBuses.isEmpty() + && 1 <= outputs.size() + && std::all_of (outputs.begin(), outputs.end(), [] (const auto& bus) + { + return bus == AudioChannelSet::stereo(); + }); } //============================================================================== diff -Nru juce-6.1.5~ds0/examples/Plugins/NoiseGatePluginDemo.h juce-7.0.0~ds0/examples/Plugins/NoiseGatePluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/NoiseGatePluginDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/NoiseGatePluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019 + exporters: xcode_mac, vs2022 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -59,8 +59,8 @@ .withOutput ("Output", AudioChannelSet::stereo()) .withInput ("Sidechain", AudioChannelSet::stereo())) { - addParameter (threshold = new AudioParameterFloat ("threshold", "Threshold", 0.0f, 1.0f, 0.5f)); - addParameter (alpha = new AudioParameterFloat ("alpha", "Alpha", 0.0f, 1.0f, 0.8f)); + addParameter (threshold = new AudioParameterFloat ({ "threshold", 1 }, "Threshold", 0.0f, 1.0f, 0.5f)); + addParameter (alpha = new AudioParameterFloat ({ "alpha", 1 }, "Alpha", 0.0f, 1.0f, 0.8f)); } //============================================================================== diff -Nru juce-6.1.5~ds0/examples/Plugins/ReaperEmbeddedViewPluginDemo.h juce-7.0.0~ds0/examples/Plugins/ReaperEmbeddedViewPluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/ReaperEmbeddedViewPluginDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/ReaperEmbeddedViewPluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -34,7 +34,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -190,7 +190,7 @@ public: ReaperEmbeddedViewDemo() { - addParameter (gain = new AudioParameterFloat ("gain", "Gain", 0.0f, 1.0f, 0.5f)); + addParameter (gain = new AudioParameterFloat ({ "gain", 1 }, "Gain", 0.0f, 1.0f, 0.5f)); startTimerHz (60); } diff -Nru juce-6.1.5~ds0/examples/Plugins/SamplerPluginDemo.h juce-7.0.0~ds0/examples/Plugins/SamplerPluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/SamplerPluginDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/SamplerPluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019 + exporters: xcode_mac, vs2022 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -551,7 +551,14 @@ class AudioFormatReaderFactory { public: + AudioFormatReaderFactory() = default; + AudioFormatReaderFactory (const AudioFormatReaderFactory&) = default; + AudioFormatReaderFactory (AudioFormatReaderFactory&&) = default; + AudioFormatReaderFactory& operator= (const AudioFormatReaderFactory&) = default; + AudioFormatReaderFactory& operator= (AudioFormatReaderFactory&&) = default; + virtual ~AudioFormatReaderFactory() noexcept = default; + virtual std::unique_ptr make (AudioFormatManager&) const = 0; virtual std::unique_ptr clone() const = 0; }; diff -Nru juce-6.1.5~ds0/examples/Plugins/SurroundPluginDemo.h juce-7.0.0~ds0/examples/Plugins/SurroundPluginDemo.h --- juce-6.1.5~ds0/examples/Plugins/SurroundPluginDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Plugins/SurroundPluginDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -50,288 +50,412 @@ //============================================================================== -class ChannelClickListener +class ProcessorWithLevels : public AudioProcessor, + private AsyncUpdater, + private Timer { public: - virtual ~ChannelClickListener() {} - virtual void channelButtonClicked (int channelIndex) = 0; - virtual bool isChannelActive (int channelIndex) = 0; -}; - -class SurroundEditor : public AudioProcessorEditor, - private Timer -{ -public: - SurroundEditor (AudioProcessor& parent) - : AudioProcessorEditor (parent), - currentChannelLayout (AudioChannelSet::disabled()), - layoutTitle ("LayoutTitleLabel", getLayoutName()) + ProcessorWithLevels() + : AudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::stereo()) + .withInput ("Aux", AudioChannelSet::stereo(), false) + .withOutput ("Output", AudioChannelSet::stereo()) + .withOutput ("Aux", AudioChannelSet::stereo(), false)) { - layoutTitle.setJustificationType (Justification::centred); - addAndMakeVisible (layoutTitle); - addAndMakeVisible (noChannelsLabel); - - setSize (600, 100); - - lastSuspended = ! getAudioProcessor()->isSuspended(); - timerCallback(); - startTimer (500); + startTimerHz (60); + applyBusLayouts (getBusesLayout()); } - void resized() override + ~ProcessorWithLevels() override { - auto r = getLocalBounds(); + stopTimer(); + cancelPendingUpdate(); + } - layoutTitle.setBounds (r.removeFromBottom (16)); + void prepareToPlay (double, int) override + { + samplesToPlay = (int) getSampleRate(); + reset(); + } - noChannelsLabel.setBounds (r); + void processBlock (AudioBuffer& audio, MidiBuffer&) override { processAudio (audio); } + void processBlock (AudioBuffer& audio, MidiBuffer&) override { processAudio (audio); } - if (channelButtons.size() > 0) - { - auto buttonWidth = r.getWidth() / channelButtons.size(); - for (auto channelButton : channelButtons) - channelButton->setBounds (r.removeFromLeft (buttonWidth)); - } - } + void releaseResources() override { reset(); } - void paint (Graphics& g) override + float getLevel (int bus, int channel) const { - g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId)); + return readableLevels[(size_t) getChannelIndexInProcessBlockBuffer (true, bus, channel)]; } - void updateButton (Button* btn) + bool isBusesLayoutSupported (const BusesLayout& layouts) const override { - if (auto* textButton = dynamic_cast (btn)) + const auto isSetValid = [] (const AudioChannelSet& set) { - auto channelIndex = channelButtons.indexOf (textButton); + return ! set.isDisabled() + && ! (set.isDiscreteLayout() && set.getChannelIndexForType (AudioChannelSet::discreteChannel0) == -1); + }; - if (auto* listener = dynamic_cast (getAudioProcessor())) - listener->channelButtonClicked (channelIndex); - } + return isSetValid (layouts.getMainOutputChannelSet()) + && isSetValid (layouts.getMainInputChannelSet()); } - void updateGUI() + void reset() override { - const auto& channelSet = getAudioProcessor()->getChannelLayoutOfBus (false, 0); + channelClicked = 0; + samplesPlayed = samplesToPlay; + } - if (channelSet != currentChannelLayout) - { - currentChannelLayout = channelSet; + bool applyBusLayouts (const BusesLayout& layouts) override + { + // Some very badly-behaved hosts will call this during processing! + const SpinLock::ScopedLockType lock (levelMutex); - layoutTitle.setText (currentChannelLayout.getDescription(), NotificationType::dontSendNotification); - channelButtons.clear(); - activeChannels.resize (currentChannelLayout.size()); + const auto result = AudioProcessor::applyBusLayouts (layouts); - if (currentChannelLayout == AudioChannelSet::disabled()) - { - noChannelsLabel.setVisible (true); - } - else - { - auto numChannels = currentChannelLayout.size(); + size_t numInputChannels = 0; - for (auto i = 0; i < numChannels; ++i) - { - auto channelName = - AudioChannelSet::getAbbreviatedChannelTypeName (currentChannelLayout.getTypeOfChannel (i)); + for (auto i = 0; i < getBusCount (true); ++i) + numInputChannels += (size_t) getBus (true, i)->getLastEnabledLayout().size(); - TextButton* newButton; - channelButtons.add (newButton = new TextButton (channelName, channelName)); + incomingLevels = readableLevels = std::vector (numInputChannels, 0.0f); - newButton->onClick = [this, newButton] { updateButton (newButton); }; - addAndMakeVisible (newButton); - } + triggerAsyncUpdate(); + return result; + } - noChannelsLabel.setVisible (false); - resized(); - } + //============================================================================== + const String getName() const override { return "Surround PlugIn"; } + bool acceptsMidi() const override { return false; } + bool producesMidi() const override { return false; } + double getTailLengthSeconds() const override { return 0; } - if (auto* listener = dynamic_cast (getAudioProcessor())) - { - auto activeColour = getLookAndFeel().findColour (Slider::thumbColourId); - auto inactiveColour = getLookAndFeel().findColour (Slider::trackColourId); + //============================================================================== + int getNumPrograms() override { return 1; } + int getCurrentProgram() override { return 0; } + void setCurrentProgram (int) override {} + const String getProgramName (int) override { return "None"; } + void changeProgramName (int, const String&) override {} - for (auto i = 0; i < activeChannels.size(); ++i) - { - auto isActive = listener->isChannelActive (i); - activeChannels.getReference (i) = isActive; - channelButtons[i]->setColour (TextButton::buttonColourId, isActive ? activeColour : inactiveColour); - channelButtons[i]->repaint(); - } - } - } + //============================================================================== + void getStateInformation (MemoryBlock&) override {} + void setStateInformation (const void*, int) override {} + + void channelButtonClicked (int bus, int channelIndex) + { + channelClicked = getChannelIndexInProcessBlockBuffer (false, bus, channelIndex); + samplesPlayed = 0; } + std::function updateEditor; + private: - String getLayoutName() const + void handleAsyncUpdate() override { - if (auto* p = getAudioProcessor()) - return p->getChannelLayoutOfBus (false, 0).getDescription(); - - return "Unknown"; + NullCheckedInvocation::invoke (updateEditor); } - void timerCallback() override + template + void processAudio (AudioBuffer& audio) { - if (getAudioProcessor()->isSuspended() != lastSuspended) { - lastSuspended = getAudioProcessor()->isSuspended(); - updateGUI(); - } + SpinLock::ScopedTryLockType lock (levelMutex); - if (! lastSuspended) - { - if (auto* listener = dynamic_cast (getAudioProcessor())) + if (lock.isLocked()) { - auto activeColour = getLookAndFeel().findColour (Slider::thumbColourId); - auto inactiveColour = getLookAndFeel().findColour (Slider::trackColourId); + const auto numInputChannels = (size_t) getTotalNumInputChannels(); - for (auto i = 0; i < activeChannels.size(); ++i) + for (size_t i = 0; i < numInputChannels; ++i) { - auto isActive = listener->isChannelActive (i); - if (activeChannels.getReference (i) != isActive) - { - activeChannels.getReference (i) = isActive; - channelButtons[i]->setColour (TextButton::buttonColourId, isActive ? activeColour : inactiveColour); - channelButtons[i]->repaint(); - } + const auto minMax = audio.findMinMax ((int) i, 0, audio.getNumSamples()); + const auto newMax = (float) std::max (std::abs (minMax.getStart()), std::abs (minMax.getEnd())); + + auto& toUpdate = incomingLevels[i]; + toUpdate = jmax (toUpdate, newMax); } } } + + audio.clear (0, audio.getNumSamples()); + + auto fillSamples = jmin (samplesToPlay - samplesPlayed, audio.getNumSamples()); + + if (isPositiveAndBelow (channelClicked, audio.getNumChannels())) + { + auto* channelBuffer = audio.getWritePointer (channelClicked); + auto freq = (float) (440.0 / getSampleRate()); + + for (auto i = 0; i < fillSamples; ++i) + channelBuffer[i] += std::sin (MathConstants::twoPi * freq * (float) samplesPlayed++); + } + } + + void timerCallback() override + { + const SpinLock::ScopedLockType lock (levelMutex); + + for (size_t i = 0; i < readableLevels.size(); ++i) + readableLevels[i] = std::max (readableLevels[i] * 0.95f, std::exchange (incomingLevels[i], 0.0f)); } - AudioChannelSet currentChannelLayout; - Label noChannelsLabel { "noChannelsLabel", "Input disabled" }, - layoutTitle; - OwnedArray channelButtons; - Array activeChannels; + SpinLock levelMutex; + std::vector incomingLevels; + std::vector readableLevels; - bool lastSuspended; + int channelClicked; + int samplesPlayed; + int samplesToPlay; }; //============================================================================== -class SurroundProcessor : public AudioProcessor, - public ChannelClickListener, - private AsyncUpdater +const Colour textColour = Colours::white.withAlpha (0.8f); + +inline void drawBackground (Component& comp, Graphics& g) +{ + g.setColour (comp.getLookAndFeel().findColour (ResizableWindow::backgroundColourId).darker (0.8f)); + g.fillRoundedRectangle (comp.getLocalBounds().toFloat(), 4.0f); +} + +inline void configureLabel (Label& label, const AudioProcessor::Bus* layout) +{ + const auto text = layout != nullptr + ? (layout->getName() + ": " + layout->getCurrentLayout().getDescription()) + : ""; + label.setText (text, dontSendNotification); + label.setJustificationType (Justification::centred); + label.setColour (Label::textColourId, textColour); +} + +class InputBusViewer : public Component, + private Timer { public: - SurroundProcessor() - : AudioProcessor(BusesProperties().withInput ("Input", AudioChannelSet::stereo()) - .withOutput ("Output", AudioChannelSet::stereo())) - {} + InputBusViewer (ProcessorWithLevels& proc, int busNumber) + : processor (proc), + bus (busNumber) + { + configureLabel (layoutName, processor.getBus (true, bus)); + addAndMakeVisible (layoutName); - //============================================================================== - void prepareToPlay (double sampleRate, int samplesPerBlock) override + startTimerHz (60); + } + + ~InputBusViewer() override { - channelClicked = 0; - sampleOffset = static_cast (std::ceil (sampleRate)); + stopTimer(); + } - auto numChannels = getChannelCountOfBus (true, 0); - channelActive.resize (numChannels); - alphaCoeffs .resize (numChannels); - reset(); + void paint (Graphics& g) override + { + drawBackground (*this, g); - triggerAsyncUpdate(); + auto* layout = processor.getBus (true, bus); + + if (layout == nullptr) + return; + + const auto channelSet = layout->getCurrentLayout(); + const auto numChannels = channelSet.size(); + + Grid grid; + + grid.autoFlow = Grid::AutoFlow::column; + grid.autoColumns = grid.autoRows = Grid::TrackInfo (Grid::Fr (1)); + grid.items.insertMultiple (0, GridItem(), numChannels); + grid.performLayout (getLocalBounds()); + + const auto minDb = -50.0f; + const auto maxDb = 6.0f; - ignoreUnused (samplesPerBlock); + for (auto i = 0; i < numChannels; ++i) + { + g.setColour (Colours::orange.darker()); + + const auto levelInDb = Decibels::gainToDecibels (processor.getLevel (bus, i), minDb); + const auto fractionOfHeight = jmap (levelInDb, minDb, maxDb, 0.0f, 1.0f); + const auto bounds = grid.items[i].currentBounds; + const auto trackBounds = bounds.withSizeKeepingCentre (16, bounds.getHeight() - 10).toFloat(); + g.fillRect (trackBounds.withHeight (trackBounds.proportionOfHeight (fractionOfHeight)).withBottomY (trackBounds.getBottom())); + + g.setColour (textColour); + + g.drawText (channelSet.getAbbreviatedChannelTypeName (channelSet.getTypeOfChannel (i)), + bounds, + Justification::centredBottom); + } } - void releaseResources() override { reset(); } + void resized() override + { + layoutName.setBounds (getLocalBounds().removeFromTop (20)); + } - void processBlock (AudioBuffer& buffer, MidiBuffer&) override + int getNumChannels() const { - for (auto ch = 0; ch < buffer.getNumChannels(); ++ch) - { - auto& channelTime = channelActive.getReference (ch); - auto& alpha = alphaCoeffs .getReference (ch); + if (auto* b = processor.getBus (true, bus)) + return b->getCurrentLayout().size(); - for (auto j = 0; j < buffer.getNumSamples(); ++j) - { - auto sample = buffer.getReadPointer (ch)[j]; - alpha = (0.8f * alpha) + (0.2f * sample); + return 0; + } - if (std::abs (alpha) >= 0.1f) - channelTime = static_cast (getSampleRate() / 2.0); - } +private: + void timerCallback() override { repaint(); } - channelTime = jmax (0, channelTime - buffer.getNumSamples()); - } + ProcessorWithLevels& processor; + int bus = 0; + Label layoutName; +}; + +//============================================================================== +class OutputBusViewer : public Component +{ +public: + OutputBusViewer (ProcessorWithLevels& proc, int busNumber) + : processor (proc), + bus (busNumber) + { + auto* layout = processor.getBus (false, bus); - auto fillSamples = jmin (static_cast (std::ceil (getSampleRate())) - sampleOffset, - buffer.getNumSamples()); + configureLabel (layoutName, layout); + addAndMakeVisible (layoutName); - if (isPositiveAndBelow (channelClicked, buffer.getNumChannels())) + if (layout == nullptr) + return; + + const auto& channelSet = layout->getCurrentLayout(); + + const auto numChannels = channelSet.size(); + + for (auto i = 0; i < numChannels; ++i) { - auto* channelBuffer = buffer.getWritePointer (channelClicked); - auto freq = (float) (440.0 / getSampleRate()); + const auto channelName = channelSet.getAbbreviatedChannelTypeName (channelSet.getTypeOfChannel (i)); - for (auto i = 0; i < fillSamples; ++i) - channelBuffer[i] += std::sin (MathConstants::twoPi * freq * static_cast (sampleOffset++)); - } - } + channelButtons.emplace_back (channelName, channelName); - using AudioProcessor::processBlock; + auto& newButton = channelButtons.back(); + newButton.onClick = [&proc = processor, bus = bus, i] { proc.channelButtonClicked (bus, i); }; + addAndMakeVisible (newButton); + } - //============================================================================== - AudioProcessorEditor* createEditor() override { return new SurroundEditor (*this); } - bool hasEditor() const override { return true; } + resized(); + } - //============================================================================== - bool isBusesLayoutSupported (const BusesLayout& layouts) const override + void paint (Graphics& g) override { - return ((! layouts.getMainInputChannelSet() .isDiscreteLayout()) - && (! layouts.getMainOutputChannelSet().isDiscreteLayout()) - && (layouts.getMainInputChannelSet() == layouts.getMainOutputChannelSet()) - && (! layouts.getMainInputChannelSet().isDisabled())); + drawBackground (*this, g); } - void reset() override + void resized() override { - for (auto& channel : channelActive) - channel = 0; + auto b = getLocalBounds(); + + layoutName.setBounds (b.removeFromBottom (20)); + + Grid grid; + grid.autoFlow = Grid::AutoFlow::column; + grid.autoColumns = grid.autoRows = Grid::TrackInfo (Grid::Fr (1)); + + for (auto& channelButton : channelButtons) + grid.items.add (GridItem (channelButton)); + + grid.performLayout (b.reduced (2)); } - //============================================================================== - const String getName() const override { return "Surround PlugIn"; } - bool acceptsMidi() const override { return false; } - bool producesMidi() const override { return false; } - double getTailLengthSeconds() const override { return 0; } + int getNumChannels() const + { + if (auto* b = processor.getBus (false, bus)) + return b->getCurrentLayout().size(); - //============================================================================== - int getNumPrograms() override { return 1; } - int getCurrentProgram() override { return 0; } - void setCurrentProgram (int) override {} - const String getProgramName (int) override { return "None"; } - void changeProgramName (int, const String&) override {} + return 0; + } - //============================================================================== - void getStateInformation (MemoryBlock&) override {} - void setStateInformation (const void*, int) override {} +private: + ProcessorWithLevels& processor; + int bus = 0; + Label layoutName; + std::list channelButtons; +}; - void channelButtonClicked (int channelIndex) override +//============================================================================== +class SurroundEditor : public AudioProcessorEditor +{ +public: + explicit SurroundEditor (ProcessorWithLevels& parent) + : AudioProcessorEditor (parent), + customProcessor (parent), + scopedUpdateEditor (customProcessor.updateEditor, [this] { updateGUI(); }) { - channelClicked = channelIndex; - sampleOffset = 0; + updateGUI(); + setResizable (true, true); } - bool isChannelActive (int channelIndex) override + void resized() override { - return channelActive[channelIndex] > 0; + auto r = getLocalBounds(); + doLayout (inputViewers, r.removeFromTop (proportionOfHeight (0.5f))); + doLayout (outputViewers, r); } - void handleAsyncUpdate() override + void paint (Graphics& g) override { - if (auto* editor = getActiveEditor()) - if (auto* surroundEditor = dynamic_cast (editor)) - surroundEditor->updateGUI(); + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId)); } private: - Array channelActive; - Array alphaCoeffs; - int channelClicked; - int sampleOffset; + template + void doLayout (Range& range, Rectangle bounds) const + { + FlexBox fb; - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SurroundProcessor) + for (auto& viewer : range) + { + if (viewer.getNumChannels() != 0) + { + fb.items.add (FlexItem (viewer) + .withFlex ((float) viewer.getNumChannels()) + .withMargin (4.0f)); + } + } + + fb.performLayout (bounds); + } + + void updateGUI() + { + inputViewers.clear(); + outputViewers.clear(); + + const auto inputBuses = getAudioProcessor()->getBusCount (true); + + for (auto i = 0; i < inputBuses; ++i) + { + inputViewers.emplace_back (customProcessor, i); + addAndMakeVisible (inputViewers.back()); + } + + const auto outputBuses = getAudioProcessor()->getBusCount (false); + + for (auto i = 0; i < outputBuses; ++i) + { + outputViewers.emplace_back (customProcessor, i); + addAndMakeVisible (outputViewers.back()); + } + + const auto channels = jmax (processor.getTotalNumInputChannels(), + processor.getTotalNumOutputChannels()); + setSize (jmax (150, channels * 40), 200); + + resized(); + } + + ProcessorWithLevels& customProcessor; + ScopedValueSetter> scopedUpdateEditor; + std::list inputViewers; + std::list outputViewers; +}; + +//============================================================================== +struct SurroundProcessor : public ProcessorWithLevels +{ + AudioProcessorEditor* createEditor() override { return new SurroundEditor (*this); } + bool hasEditor() const override { return true; } }; diff -Nru juce-6.1.5~ds0/examples/Utilities/AnalyticsCollectionDemo.h juce-7.0.0~ds0/examples/Utilities/AnalyticsCollectionDemo.h --- juce-6.1.5~ds0/examples/Utilities/AnalyticsCollectionDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/AnalyticsCollectionDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_analytics, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, xcode_iphone, androidstudio + exporters: xcode_mac, vs2022, linux_make, xcode_iphone, androidstudio moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Utilities/Box2DDemo.h juce-7.0.0~ds0/examples/Utilities/Box2DDemo.h --- juce-6.1.5~ds0/examples/Utilities/Box2DDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/Box2DDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_box2d, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Utilities/ChildProcessDemo.h juce-7.0.0~ds0/examples/Utilities/ChildProcessDemo.h --- juce-6.1.5~ds0/examples/Utilities/ChildProcessDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/ChildProcessDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -98,7 +98,12 @@ testResultsBox.setFont ({ Font::getDefaultMonospacedFontName(), 12.0f, Font::plain }); logMessage (String ("This demo uses the ChildProcessCoordinator and ChildProcessWorker classes to launch and communicate " - "with a child process, sending messages in the form of serialised ValueTree objects.") + newLine); + "with a child process, sending messages in the form of serialised ValueTree objects.") + newLine + + String ("In this demo, the child process will automatically quit if it fails to receive a ping message at least every ") + + String (timeoutSeconds) + + String (" seconds. To keep the process alive, press the \"") + + pingButton.getButtonText() + + String ("\" button periodically.") + newLine); setSize (500, 500); } @@ -136,10 +141,14 @@ { if (coordinatorProcess.get() == nullptr) { - coordinatorProcess.reset (new DemoCoordinatorProcess (*this)); + coordinatorProcess = std::make_unique (*this); - if (coordinatorProcess->launchWorkerProcess (File::getSpecialLocation (File::currentExecutableFile), demoCommandLineUID)) + if (coordinatorProcess->launchWorkerProcess (File::getSpecialLocation (File::currentExecutableFile), + demoCommandLineUID, + timeoutMillis)) + { logMessage ("Child process started"); + } } } @@ -166,11 +175,14 @@ // This class is used by the main process, acting as the coordinator and receiving messages // from the worker process. class DemoCoordinatorProcess : public ChildProcessCoordinator, - private DeletedAtShutdown + private DeletedAtShutdown, + private AsyncUpdater { public: DemoCoordinatorProcess (ChildProcessDemo& d) : demo (d) {} + ~DemoCoordinatorProcess() override { cancelPendingUpdate(); } + // This gets called when a message arrives from the worker process.. void handleMessageFromWorker (const MemoryBlock& mb) override { @@ -183,6 +195,11 @@ void handleConnectionLost() override { demo.logMessage ("Connection lost to child process!"); + triggerAsyncUpdate(); + } + + void handleAsyncUpdate() override + { demo.killChildProcess(); } @@ -203,7 +220,11 @@ //============================================================================== std::unique_ptr coordinatorProcess; + static constexpr auto timeoutSeconds = 10; + static constexpr auto timeoutMillis = timeoutSeconds * 1000; + private: + TextButton launchButton { "Launch Child Process" }; TextButton pingButton { "Send Ping" }; TextButton killButton { "Kill Child Process" }; @@ -268,8 +289,8 @@ } /* If no pings are received from the coordinator process for a number of seconds, then this will get invoked. - Typically you'll want to use this as a signal to kill the process as quickly as possible, as you - don't want to leave it hanging around as a zombie.. + Typically, you'll want to use this as a signal to kill the process as quickly as possible, as you + don't want to leave it hanging around as a zombie. */ void handleConnectionLost() override { @@ -280,13 +301,13 @@ //============================================================================== /* The JUCEApplication::initialise method calls this function to allow the child process to launch when the command line parameters indicate that we're - being asked to run as a child process.. + being asked to run as a child process. */ bool invokeChildProcessDemo (const String& commandLine) { - std::unique_ptr worker (new DemoWorkerProcess()); + auto worker = std::make_unique(); - if (worker->initialiseFromCommandLine (commandLine, demoCommandLineUID)) + if (worker->initialiseFromCommandLine (commandLine, demoCommandLineUID, ChildProcessDemo::timeoutMillis)) { worker.release(); // allow the worker object to stay alive - it'll handle its own deletion. return true; @@ -316,7 +337,7 @@ if (invokeChildProcessDemo (commandLine)) return; - mainWindow.reset (new MainWindow ("ChildProcessDemo", new ChildProcessDemo())); + mainWindow = std::make_unique ("ChildProcessDemo", std::make_unique()); } void shutdown() override { mainWindow = nullptr; } @@ -325,13 +346,14 @@ class MainWindow : public DocumentWindow { public: - MainWindow (const String& name, Component* c) : DocumentWindow (name, - Desktop::getInstance().getDefaultLookAndFeel() - .findColour (ResizableWindow::backgroundColourId), - DocumentWindow::allButtons) + MainWindow (const String& name, std::unique_ptr c) + : DocumentWindow (name, + Desktop::getInstance().getDefaultLookAndFeel() + .findColour (ResizableWindow::backgroundColourId), + DocumentWindow::allButtons) { setUsingNativeTitleBar (true); - setContentOwned (c, true); + setContentOwned (c.release(), true); centreWithSize (getWidth(), getHeight()); diff -Nru juce-6.1.5~ds0/examples/Utilities/CMakeLists.txt juce-7.0.0~ds0/examples/Utilities/CMakeLists.txt --- juce-6.1.5~ds0/examples/Utilities/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/examples/Utilities/CryptographyDemo.h juce-7.0.0~ds0/examples/Utilities/CryptographyDemo.h --- juce-6.1.5~ds0/examples/Utilities/CryptographyDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/CryptographyDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_cryptography, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Utilities/InAppPurchasesDemo.h juce-7.0.0~ds0/examples/Utilities/InAppPurchasesDemo.h --- juce-6.1.5~ds0/examples/Utilities/InAppPurchasesDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/InAppPurchasesDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -192,20 +192,23 @@ { purchaseInProgress = false; - auto idx = findVoiceIndexFromIdentifier (info.purchase.productId); - - if (isPositiveAndBelow (idx, voiceProducts.size())) + for (const auto productId : info.purchase.productIds) { - auto& voiceProduct = voiceProducts.getReference (idx); + auto idx = findVoiceIndexFromIdentifier (productId); - voiceProduct.isPurchased = success; - voiceProduct.purchaseInProgress = false; - } - else - { - // On failure Play Store will not tell us which purchase failed - for (auto& voiceProduct : voiceProducts) + if (isPositiveAndBelow (idx, voiceProducts.size())) + { + auto& voiceProduct = voiceProducts.getReference (idx); + + voiceProduct.isPurchased = success; voiceProduct.purchaseInProgress = false; + } + else + { + // On failure Play Store will not tell us which purchase failed + for (auto& voiceProduct : voiceProducts) + voiceProduct.purchaseInProgress = false; + } } guiUpdater.triggerAsyncUpdate(); @@ -217,13 +220,16 @@ { for (auto& info : infos) { - auto idx = findVoiceIndexFromIdentifier (info.purchase.productId); - - if (isPositiveAndBelow (idx, voiceProducts.size())) + for (const auto productId : info.purchase.productIds) { - auto& voiceProduct = voiceProducts.getReference (idx); + auto idx = findVoiceIndexFromIdentifier (productId); - voiceProduct.isPurchased = true; + if (isPositiveAndBelow (idx, voiceProducts.size())) + { + auto& voiceProduct = voiceProducts.getReference (idx); + + voiceProduct.isPurchased = true; + } } } @@ -442,15 +448,17 @@ Component* refreshComponentForRow (int row, bool selected, Component* existing) override { + auto safePtr = rawToUniquePtr (existing); + if (isPositiveAndBelow (row, voiceProducts.size())) { - if (existing == nullptr) - existing = new VoiceRow (purchases); + if (safePtr == nullptr) + safePtr = std::make_unique (purchases); - if (auto* voiceRow = dynamic_cast (existing)) + if (auto* voiceRow = dynamic_cast (safePtr.get())) voiceRow->update (row, selected); - return existing; + return safePtr.release(); } return nullptr; @@ -499,7 +507,6 @@ voiceListBox.setRowHeight (66); voiceListBox.selectRow (0); voiceListBox.updateContent(); - voiceListBox.getViewport()->setScrollOnDragEnabled (true); addAndMakeVisible (phraseLabel); addAndMakeVisible (phraseListBox); diff -Nru juce-6.1.5~ds0/examples/Utilities/JavaScriptDemo.h juce-7.0.0~ds0/examples/Utilities/JavaScriptDemo.h --- juce-6.1.5~ds0/examples/Utilities/JavaScriptDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/JavaScriptDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Utilities/LiveConstantDemo.h juce-7.0.0~ds0/examples/Utilities/LiveConstantDemo.h --- juce-6.1.5~ds0/examples/Utilities/LiveConstantDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/LiveConstantDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -86,8 +86,9 @@ descriptionLabel.setMinimumHorizontalScale (1.0f); descriptionLabel.setText ("This demonstrates the JUCE_LIVE_CONSTANT macro, which allows you to quickly " "adjust primitive values at runtime by just wrapping them in a macro.\n\n" + "Editing JUCE_LIVE_CONSTANT values is only enabled in debug builds.\n\n" "To understand what's going on in this demo, you should have a look at the " - "LiveConstantDemoComponent class, where you can see the code that's invoking the demo below...", + "LiveConstantDemoComponent class, where you can see the code that's invoking the demo below.", dontSendNotification); addAndMakeVisible (descriptionLabel); diff -Nru juce-6.1.5~ds0/examples/Utilities/MultithreadingDemo.h juce-7.0.0~ds0/examples/Utilities/MultithreadingDemo.h --- juce-6.1.5~ds0/examples/Utilities/MultithreadingDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/MultithreadingDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Utilities/NetworkingDemo.h juce-7.0.0~ds0/examples/Utilities/NetworkingDemo.h --- juce-6.1.5~ds0/examples/Utilities/NetworkingDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/NetworkingDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Utilities/OSCDemo.h juce-7.0.0~ds0/examples/Utilities/OSCDemo.h --- juce-6.1.5~ds0/examples/Utilities/OSCDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/OSCDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_osc - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Utilities/PushNotificationsDemo.h juce-7.0.0~ds0/examples/Utilities/PushNotificationsDemo.h --- juce-6.1.5~ds0/examples/Utilities/PushNotificationsDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/PushNotificationsDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/examples/Utilities/SystemInfoDemo.h juce-7.0.0~ds0/examples/Utilities/SystemInfoDemo.h --- juce-6.1.5~ds0/examples/Utilities/SystemInfoDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/SystemInfoDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Utilities/TimersAndEventsDemo.h juce-7.0.0~ds0/examples/Utilities/TimersAndEventsDemo.h --- juce-6.1.5~ds0/examples/Utilities/TimersAndEventsDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/TimersAndEventsDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Utilities/UnitTestsDemo.h juce-7.0.0~ds0/examples/Utilities/UnitTestsDemo.h --- juce-6.1.5~ds0/examples/Utilities/UnitTestsDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/UnitTestsDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -34,9 +34,9 @@ juce_core, juce_cryptography, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_opengl, juce_osc, juce_product_unlocking, juce_video - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone - moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 + moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1,JUCE_PLUGINHOST_VST3=1 defines: JUCE_UNIT_TESTS=1 type: Component diff -Nru juce-6.1.5~ds0/examples/Utilities/ValueTreesDemo.h juce-7.0.0~ds0/examples/Utilities/ValueTreesDemo.h --- juce-6.1.5~ds0/examples/Utilities/ValueTreesDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/ValueTreesDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/examples/Utilities/XMLandJSONDemo.h juce-7.0.0~ds0/examples/Utilities/XMLandJSONDemo.h --- juce-6.1.5~ds0/examples/Utilities/XMLandJSONDemo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/examples/Utilities/XMLandJSONDemo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff -Nru juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt --- juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -23,9 +23,9 @@ enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) else() message( FATAL_ERROR "No matching build-configuration found." ) endif() @@ -47,6 +47,7 @@ "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" @@ -61,7 +62,6 @@ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" - "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" @@ -98,6 +98,7 @@ "../../../../../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/native/juce_mac_CoreAudioTimeConversions.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" @@ -140,9 +141,9 @@ "../../../../../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_SampleRateHelpers.cpp" "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" - "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" @@ -436,6 +437,8 @@ "../../../../../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_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.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" @@ -460,6 +463,116 @@ "../../../../../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/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" "../../../../../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" @@ -557,16 +670,27 @@ "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.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_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.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_VST3PluginFormat_test.cpp" "../../../../../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" @@ -595,6 +719,17 @@ "../../../../../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/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.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" @@ -608,6 +743,9 @@ "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" "../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" @@ -618,6 +756,8 @@ "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" @@ -669,9 +809,12 @@ "../../../../../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.cpp" "../../../../../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_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.h" "../../../../../modules/juce_core/containers/juce_PropertySet.cpp" @@ -685,6 +828,9 @@ "../../../../../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_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.h" "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" "../../../../../modules/juce_core/files/juce_DirectoryIterator.h" "../../../../../modules/juce_core/files/juce_File.cpp" @@ -751,6 +897,7 @@ "../../../../../modules/juce_core/misc/juce_Uuid.h" "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" "../../../../../modules/juce_core/native/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" "../../../../../modules/juce_core/native/juce_android_Files.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" @@ -963,6 +1110,7 @@ "../../../../../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_EventLoopInternal.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" @@ -1340,10 +1488,12 @@ "../../../../../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_PointerState.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/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" @@ -1375,13 +1525,13 @@ "../../../../../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_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" "../../../../../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" @@ -1524,8 +1674,8 @@ "../../../../../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_NSViewFrameWatcher.h" "../../../../../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" @@ -1540,6 +1690,8 @@ "../../../JuceLibraryCode/include_juce_audio_devices.cpp" "../../../JuceLibraryCode/include_juce_audio_formats.cpp" "../../../JuceLibraryCode/include_juce_audio_processors.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_ara.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp" "../../../JuceLibraryCode/include_juce_audio_utils.cpp" "../../../JuceLibraryCode/include_juce_core.cpp" "../../../JuceLibraryCode/include_juce_data_structures.cpp" @@ -1550,1508 +1702,1660 @@ "../../../JuceLibraryCode/JuceHeader.h" ) -set_source_files_properties("../../../Source/MainComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Bela.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/assert.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/callback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/compat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/export.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_MathsFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_NormalisableRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Range.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Reservoir.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Functional.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/java/README.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Misc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_curl_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_intel_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_CFHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Files.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Network.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Strings.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Registry.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerSupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerWarnings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_PlatformDefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_StandardHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_TargetPlatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_NewLine.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringRef.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_CriticalSection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_InterProcessLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Process.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_SpinLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTestCategories.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/adler32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/compress.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/infback.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/uncompr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.in.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zlib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Initialisation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Message.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_NotificationType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_android_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_EventLoop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Line.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Parallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Point.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ScaledImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_Justification.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_common_MimeTypes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_MessageBoxOptions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_HWNDComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../JuceLibraryCode/JuceHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties( + "../../../Source/MainComponent.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_AudioProcessLoadMeasurer.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.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/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.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/native/juce_mac_CoreAudioTimeConversions.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_ADSR_test.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" + "../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" + "../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" + "../../../../../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_basics/utilities/juce_WindowedSincInterpolator.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.mm" + "../../../../../modules/juce_audio_basics/juce_audio_basics.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_SampleRateHelpers.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" + "../../../../../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/oboe/include/oboe/AudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" + "../../../../../modules/juce_audio_devices/native/oboe/README.md" + "../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" + "../../../../../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.mm" + "../../../../../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_audio_devices/juce_audio_devices.cpp" + "../../../../../modules/juce_audio_devices/juce_audio_devices.mm" + "../../../../../modules/juce_audio_devices/juce_audio_devices.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/assert.h" + "../../../../../modules/juce_audio_formats/codecs/flac/callback.h" + "../../../../../modules/juce_audio_formats/codecs/flac/compat.h" + "../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" + "../../../../../modules/juce_audio_formats/codecs/flac/export.h" + "../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/flac/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.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_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.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/sampler/juce_Sampler.cpp" + "../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" + "../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" + "../../../../../modules/juce_audio_formats/juce_audio_formats.mm" + "../../../../../modules/juce_audio_formats/juce_audio_formats.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/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" + "../../../../../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/base/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/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/ivstparameterfunctionname.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/ivsttestplugprovider.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/vstspeaker.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" + "../../../../../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" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.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_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.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_VST3PluginFormat_test.cpp" + "../../../../../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/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_AudioProcessorEditorHostContext.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_HostedAudioProcessorParameter.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/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.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_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" + "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.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_KeyboardComponentBase.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" + "../../../../../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_win_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.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_audio_utils/juce_audio_utils.cpp" + "../../../../../modules/juce_audio_utils/juce_audio_utils.mm" + "../../../../../modules/juce_audio_utils/juce_audio_utils.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.cpp" + "../../../../../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_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" + "../../../../../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_SingleThreadedAbstractFifo.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_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.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_RangedDirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.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_Javascript.cpp" + "../../../../../modules/juce_core/javascript/juce_Javascript.h" + "../../../../../modules/juce_core/javascript/juce_JSON.cpp" + "../../../../../modules/juce_core/javascript/juce_JSON.h" + "../../../../../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_AllocationHooks.cpp" + "../../../../../modules/juce_core/memory/juce_AllocationHooks.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_Reservoir.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_Functional.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/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" + "../../../../../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_BasicNativeHeaders.h" + "../../../../../modules/juce_core/native/juce_curl_Network.cpp" + "../../../../../modules/juce_core/native/juce_intel_SharedCode.h" + "../../../../../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_CFHelpers.h" + "../../../../../modules/juce_core/native/juce_mac_Files.mm" + "../../../../../modules/juce_core/native/juce_mac_Network.mm" + "../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" + "../../../../../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_posix_IPAddress.h" + "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" + "../../../../../modules/juce_core/native/juce_posix_SharedCode.h" + "../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" + "../../../../../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_CompilerWarnings.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_CharacterFunctions.cpp" + "../../../../../modules/juce_core/text/juce_CharacterFunctions.h" + "../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF32.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.cpp" + "../../../../../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/zlib/adler32.c" + "../../../../../modules/juce_core/zip/zlib/compress.c" + "../../../../../modules/juce_core/zip/zlib/crc32.c" + "../../../../../modules/juce_core/zip/zlib/crc32.h" + "../../../../../modules/juce_core/zip/zlib/deflate.c" + "../../../../../modules/juce_core/zip/zlib/deflate.h" + "../../../../../modules/juce_core/zip/zlib/infback.c" + "../../../../../modules/juce_core/zip/zlib/inffast.c" + "../../../../../modules/juce_core/zip/zlib/inffast.h" + "../../../../../modules/juce_core/zip/zlib/inffixed.h" + "../../../../../modules/juce_core/zip/zlib/inflate.c" + "../../../../../modules/juce_core/zip/zlib/inflate.h" + "../../../../../modules/juce_core/zip/zlib/inftrees.c" + "../../../../../modules/juce_core/zip/zlib/inftrees.h" + "../../../../../modules/juce_core/zip/zlib/trees.c" + "../../../../../modules/juce_core/zip/zlib/trees.h" + "../../../../../modules/juce_core/zip/zlib/uncompr.c" + "../../../../../modules/juce_core/zip/zlib/zconf.h" + "../../../../../modules/juce_core/zip/zlib/zconf.in.h" + "../../../../../modules/juce_core/zip/zlib/zlib.h" + "../../../../../modules/juce_core/zip/zlib/zutil.c" + "../../../../../modules/juce_core/zip/zlib/zutil.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_core/juce_core.cpp" + "../../../../../modules/juce_core/juce_core.mm" + "../../../../../modules/juce_core/juce_core.h" + "../../../../../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/undomanager/juce_UndoableAction.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.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_ValueTreePropertyWithDefault.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" + "../../../../../modules/juce_data_structures/juce_data_structures.cpp" + "../../../../../modules/juce_data_structures/juce_data_structures.mm" + "../../../../../modules/juce_data_structures/juce_data_structures.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/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_EventLoopInternal.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_ScopedLowPowerModeDisabler.cpp" + "../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.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_events/juce_events.cpp" + "../../../../../modules/juce_events/juce_events.mm" + "../../../../../modules/juce_events/juce_events.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_Rectangle_test.cpp" + "../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" + "../../../../../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/images/juce_ScaledImage.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_RenderingHelpers.h" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.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_graphics/juce_graphics.cpp" + "../../../../../modules/juce_graphics/juce_graphics.mm" + "../../../../../modules/juce_graphics/juce_graphics.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.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_ComponentTraverser.h" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.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_FilenameComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.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_ImagePreviewComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.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_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_FocusOutline.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.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_PointerState.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/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.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_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_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" + "../../../../../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_MultiTouchMapper.h" + "../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" + "../../../../../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_ScopedThreadDPIAwarenessSetter.h" + "../../../../../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_MessageBoxOptions.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_basics/juce_gui_basics.cpp" + "../../../../../modules/juce_gui_basics/juce_gui_basics.mm" + "../../../../../modules/juce_gui_basics/juce_gui_basics.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_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_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_HWNDComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" + "../../../../../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_android_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.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_NSViewComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" + "../../../../../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_HWNDComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.mm" + "../../../../../modules/juce_gui_extra/juce_gui_extra.h" + "../../../JuceLibraryCode/JuceHeader.h" + PROPERTIES HEADER_FILE_ONLY TRUE) target_compile_options( ${BINARY_NAME} PRIVATE "-fsigned-char" [[-mfpu=neon]] [[-mfloat-abi=hard]] [[-ffast-math]] [[-funroll-loops]] [[--param]] [[max-unroll-times=8]] [[-mhard-float]] [[-D_NDK_MATH_NO_SOFTFP=1]] [[-DJUCE_DISABLE_ASSERTIONS=1]] ) diff -Nru juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml --- juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml 2022-06-21 07:56:28.000000000 +0000 @@ -1,10 +1,10 @@ + package="com.juce.audioperformancetest"> - + diff -Nru juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj --- juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj 2022-06-21 07:56:28.000000000 +0000 @@ -10,6 +10,7 @@ 01C9BC9A0A0F54B693CDA31A /* include_juce_audio_devices.mm */ = {isa = PBXBuildFile; fileRef = 322D3066DCD98A8D0542236A; }; 06735FD618809C6823B18CFA /* CoreServices.framework */ = {isa = PBXBuildFile; fileRef = 5622D2E05ACA8C4395206C56; }; 07451DA87757F9EF80E31BE8 /* Main.cpp */ = {isa = PBXBuildFile; fileRef = 0564535EEA7E4462926EA0C9; }; + 2028993D80CFDE5A0ABA4A52 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 932123993B04597421D5C406; }; 2BAED5B831BB736E77A718AE /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 89B3243200BAA6BD72905DBB; }; 30BE30F31D1AAED9FC893AA5 /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = 18C1CCE5684F9FA0478F27AD; }; 3C0CA1E555411B8B5B8F8FF0 /* LaunchScreen.storyboard */ = {isa = PBXBuildFile; fileRef = C8D9488DE9A88E4FBF28D417; }; @@ -20,6 +21,7 @@ 65FC2E13B65977FED63BDDE3 /* include_juce_graphics.mm */ = {isa = PBXBuildFile; fileRef = 7E951216B6138C76653B1460; }; 699954AF666E644C7B688381 /* include_juce_gui_basics.mm */ = {isa = PBXBuildFile; fileRef = 0BC3C6A4F4FC1DD30DD8E17C; }; 71863EE98034AB7C3CBCAA81 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = 24D90B40648CC05A9B1AA55B; }; + 7BB1EEA0BB910DD93C1DBAD5 /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = CBD298606CB4777F17CFCC2F; }; 7E870C094BAE67D7EB149F1C /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 248FAA119A4FC24C522165EF; }; 893A86EF99F57B81286E58A1 /* CoreImage.framework */ = {isa = PBXBuildFile; fileRef = F40C1815F7E7E4FBAF3A3091; }; 8A0F71A4EEC7FE694352DD94 /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 9EADBF913B7A454B6BE93A4A; }; @@ -65,6 +67,7 @@ 8693552B5FA53C2003A66302 /* Images.xcassets */ /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AudioPerformanceTest/Images.xcassets; sourceTree = SOURCE_ROOT; }; 89B3243200BAA6BD72905DBB /* include_juce_audio_basics.mm */ /* include_juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_basics.mm; path = ../../JuceLibraryCode/include_juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; 920FF34D4A00A5AD433EE5F4 /* juce_audio_basics */ /* juce_audio_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_basics; path = ../../../../modules/juce_audio_basics; sourceTree = SOURCE_ROOT; }; + 932123993B04597421D5C406 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 9516A19EE58DED8326DD0306 /* Info-App.plist */ /* Info-App.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = SOURCE_ROOT; }; 9E05B63699A307598B66F829 /* include_juce_audio_formats.mm */ /* include_juce_audio_formats.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_formats.mm; path = ../../JuceLibraryCode/include_juce_audio_formats.mm; sourceTree = SOURCE_ROOT; }; 9EADBF913B7A454B6BE93A4A /* Accelerate.framework */ /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; @@ -77,6 +80,7 @@ C8D9488DE9A88E4FBF28D417 /* LaunchScreen.storyboard */ /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = LaunchScreen.storyboard; sourceTree = SOURCE_ROOT; }; C8EE61FDD1F06817A014B881 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; CBBC98B7CD350A07F5145FB4 /* juce_audio_utils */ /* juce_audio_utils */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_utils; path = ../../../../modules/juce_audio_utils; sourceTree = SOURCE_ROOT; }; + CBD298606CB4777F17CFCC2F /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; D03C9A859FB4DBA8268D7FBA /* juce_audio_processors */ /* juce_audio_processors */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_processors; path = ../../../../modules/juce_audio_processors; sourceTree = SOURCE_ROOT; }; E1BB9D521BF6C055F5B88628 /* Foundation.framework */ /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; E575FE2AD2F19FA6AEB536C2 /* juce_core */ /* juce_core */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_core; path = ../../../../modules/juce_core; sourceTree = SOURCE_ROOT; }; @@ -137,6 +141,8 @@ 322D3066DCD98A8D0542236A, 9E05B63699A307598B66F829, 18E39207A0F5F9B8BC7EE94F, + CBD298606CB4777F17CFCC2F, + 932123993B04597421D5C406, BAFDA8DE51E7A69E477439EB, 24425FFB0BCC7E54CADAA013, EDD11E2CC0B18196ADA0C87B, @@ -241,7 +247,7 @@ 9CE2A44801B5B4BE7A9667DA = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { @@ -306,6 +312,8 @@ 01C9BC9A0A0F54B693CDA31A, 48ADBEF873A610909D727C97, D145903EE5DBFD1BD98423F3, + 7BB1EEA0BB910DD93C1DBAD5, + 2028993D80CFDE5A0ABA4A52, C7B090C29D8DE4D2503204B1, FFAF94080FF4A9995B33151E, D2CECF93178A1738DA02CA4A, @@ -338,7 +346,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -359,10 +367,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -374,6 +382,7 @@ INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest; PRODUCT_NAME = "AudioPerformanceTest"; USE_HEADERMAP = NO; @@ -399,7 +408,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -420,10 +429,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -436,6 +445,7 @@ INSTALL_PATH = "$(HOME)/Applications"; LLVM_LTO = YES; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest; PRODUCT_NAME = "AudioPerformanceTest"; USE_HEADERMAP = NO; diff -Nru juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile --- juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile 2022-06-21 07:56:28.000000000 +0000 @@ -11,6 +11,10 @@ # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := AudioPerformanceTest JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,13 +60,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := AudioPerformanceTest JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -73,6 +77,8 @@ $(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \ $(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o \ $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o \ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \ $(JUCE_OBJDIR)/include_juce_data_structures_7471b1e3.o \ @@ -86,8 +92,8 @@ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors alsa freetype2 libcurl + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors alsa freetype2 libcurl @echo Linking "AudioPerformanceTest - App" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) @@ -119,6 +125,16 @@ @echo "Compiling include_juce_audio_processors.cpp" $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" +$(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o: ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_ara.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o: ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_lv2_libs.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o: ../../JuceLibraryCode/include_juce_audio_utils.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling include_juce_audio_utils.cpp" diff -Nru juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj --- juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj 2022-06-21 07:56:28.000000000 +0000 @@ -10,6 +10,7 @@ 01C9BC9A0A0F54B693CDA31A /* include_juce_audio_devices.mm */ = {isa = PBXBuildFile; fileRef = 322D3066DCD98A8D0542236A; }; 0319B40AD2FD96007FFA928B /* Cocoa.framework */ = {isa = PBXBuildFile; fileRef = 453777CEB7099A5D61901D13; }; 07451DA87757F9EF80E31BE8 /* Main.cpp */ = {isa = PBXBuildFile; fileRef = 0564535EEA7E4462926EA0C9; }; + 2028993D80CFDE5A0ABA4A52 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 932123993B04597421D5C406; }; 2BAED5B831BB736E77A718AE /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 89B3243200BAA6BD72905DBB; }; 30BE30F31D1AAED9FC893AA5 /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = 18C1CCE5684F9FA0478F27AD; }; 3825E8984D8F6AA00DDC6BAC /* DiscRecording.framework */ = {isa = PBXBuildFile; fileRef = EE758AD71415EB31BD3E82F3; }; @@ -20,10 +21,10 @@ 65FC2E13B65977FED63BDDE3 /* include_juce_graphics.mm */ = {isa = PBXBuildFile; fileRef = 7E951216B6138C76653B1460; }; 699954AF666E644C7B688381 /* include_juce_gui_basics.mm */ = {isa = PBXBuildFile; fileRef = 0BC3C6A4F4FC1DD30DD8E17C; }; 71863EE98034AB7C3CBCAA81 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = 24D90B40648CC05A9B1AA55B; }; + 7BB1EEA0BB910DD93C1DBAD5 /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = CBD298606CB4777F17CFCC2F; }; 7E870C094BAE67D7EB149F1C /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 248FAA119A4FC24C522165EF; }; 8A0F71A4EEC7FE694352DD94 /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 9EADBF913B7A454B6BE93A4A; }; 9031C69145EE085B60904363 /* IOKit.framework */ = {isa = PBXBuildFile; fileRef = 43775DC3D9F7917846EA5327; }; - 9B19A6655FCC8086134C8656 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = 1DA5C6A474916745AFEC6DA5; }; 9D47995A33BBA693ED435B31 /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = B06AE97C86D27E7FEBCB4631; }; C7B090C29D8DE4D2503204B1 /* include_juce_audio_utils.mm */ = {isa = PBXBuildFile; fileRef = BAFDA8DE51E7A69E477439EB; }; CC782AABFA20787BABBCED90 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = E1BB9D521BF6C055F5B88628; }; @@ -42,7 +43,6 @@ 12C680C68A15B9A590264B18 /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; 18C1CCE5684F9FA0478F27AD /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 18E39207A0F5F9B8BC7EE94F /* include_juce_audio_processors.mm */ /* include_juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_processors.mm; path = ../../JuceLibraryCode/include_juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; - 1DA5C6A474916745AFEC6DA5 /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; 24425FFB0BCC7E54CADAA013 /* include_juce_core.mm */ /* include_juce_core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_core.mm; path = ../../JuceLibraryCode/include_juce_core.mm; sourceTree = SOURCE_ROOT; }; 248FAA119A4FC24C522165EF /* include_juce_events.mm */ /* include_juce_events.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_events.mm; path = ../../JuceLibraryCode/include_juce_events.mm; sourceTree = SOURCE_ROOT; }; 24D90B40648CC05A9B1AA55B /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; @@ -60,6 +60,7 @@ 81017699F857F5BBFCA6E055 /* juce_events */ /* juce_events */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_events; path = ../../../../modules/juce_events; sourceTree = SOURCE_ROOT; }; 89B3243200BAA6BD72905DBB /* include_juce_audio_basics.mm */ /* include_juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_basics.mm; path = ../../JuceLibraryCode/include_juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; 920FF34D4A00A5AD433EE5F4 /* juce_audio_basics */ /* juce_audio_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_basics; path = ../../../../modules/juce_audio_basics; sourceTree = SOURCE_ROOT; }; + 932123993B04597421D5C406 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 9516A19EE58DED8326DD0306 /* Info-App.plist */ /* Info-App.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = SOURCE_ROOT; }; 9E05B63699A307598B66F829 /* include_juce_audio_formats.mm */ /* include_juce_audio_formats.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_formats.mm; path = ../../JuceLibraryCode/include_juce_audio_formats.mm; sourceTree = SOURCE_ROOT; }; 9EADBF913B7A454B6BE93A4A /* Accelerate.framework */ /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; @@ -70,6 +71,7 @@ BAFDA8DE51E7A69E477439EB /* include_juce_audio_utils.mm */ /* include_juce_audio_utils.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_utils.mm; path = ../../JuceLibraryCode/include_juce_audio_utils.mm; sourceTree = SOURCE_ROOT; }; C8EE61FDD1F06817A014B881 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; CBBC98B7CD350A07F5145FB4 /* juce_audio_utils */ /* juce_audio_utils */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_utils; path = ../../../../modules/juce_audio_utils; sourceTree = SOURCE_ROOT; }; + CBD298606CB4777F17CFCC2F /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; D03C9A859FB4DBA8268D7FBA /* juce_audio_processors */ /* juce_audio_processors */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_processors; path = ../../../../modules/juce_audio_processors; sourceTree = SOURCE_ROOT; }; E1BB9D521BF6C055F5B88628 /* Foundation.framework */ /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; E575FE2AD2F19FA6AEB536C2 /* juce_core */ /* juce_core */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_core; path = ../../../../modules/juce_core; sourceTree = SOURCE_ROOT; }; @@ -85,7 +87,6 @@ files = ( 8A0F71A4EEC7FE694352DD94, 30BE30F31D1AAED9FC893AA5, - 9B19A6655FCC8086134C8656, 0319B40AD2FD96007FFA928B, 5AFD011031C266431687C922, 71863EE98034AB7C3CBCAA81, @@ -106,7 +107,6 @@ children = ( 9EADBF913B7A454B6BE93A4A, 18C1CCE5684F9FA0478F27AD, - 1DA5C6A474916745AFEC6DA5, 453777CEB7099A5D61901D13, 9F28F179EF6B90EB9F4DBEE9, 24D90B40648CC05A9B1AA55B, @@ -127,6 +127,8 @@ 322D3066DCD98A8D0542236A, 9E05B63699A307598B66F829, 18E39207A0F5F9B8BC7EE94F, + CBD298606CB4777F17CFCC2F, + 932123993B04597421D5C406, BAFDA8DE51E7A69E477439EB, 24425FFB0BCC7E54CADAA013, EDD11E2CC0B18196ADA0C87B, @@ -230,7 +232,7 @@ 9CE2A44801B5B4BE7A9667DA = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { @@ -294,6 +296,8 @@ 01C9BC9A0A0F54B693CDA31A, 48ADBEF873A610909D727C97, D145903EE5DBFD1BD98423F3, + 7BB1EEA0BB910DD93C1DBAD5, + 2028993D80CFDE5A0ABA4A52, C7B090C29D8DE4D2503204B1, FFAF94080FF4A9995B33151E, D2CECF93178A1738DA02CA4A, @@ -325,7 +329,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -346,10 +350,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -362,6 +366,7 @@ INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest; PRODUCT_NAME = "AudioPerformanceTest"; USE_HEADERMAP = NO; @@ -387,7 +392,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -408,10 +413,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -425,6 +430,7 @@ LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest; PRODUCT_NAME = "AudioPerformanceTest"; USE_HEADERMAP = NO; diff -Nru juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj --- juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -77,7 +77,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPerformanceTest.exe @@ -105,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -118,7 +119,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPerformanceTest.exe @@ -152,13 +154,13 @@ true - + true - + true - + true @@ -269,7 +271,7 @@ true - + true @@ -638,6 +640,9 @@ true + + true + true @@ -671,6 +676,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -740,15 +862,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -782,6 +922,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -800,6 +958,9 @@ true + + true + true @@ -812,6 +973,12 @@ true + + true + + + true + true @@ -878,9 +1045,15 @@ true + + true + true + + true + true @@ -896,6 +1069,9 @@ true + + true + true @@ -962,6 +1138,9 @@ true + + true + true @@ -1829,6 +2008,9 @@ true + + true + true @@ -1856,9 +2038,6 @@ true - - true - true @@ -2084,7 +2263,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2135,6 +2318,7 @@ + @@ -2323,6 +2507,7 @@ + @@ -2335,6 +2520,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2400,9 +2655,14 @@ + + + + + @@ -2423,6 +2683,11 @@ + + + + + @@ -2430,6 +2695,8 @@ + + @@ -2461,6 +2728,7 @@ + @@ -2469,6 +2737,8 @@ + + @@ -2623,6 +2893,7 @@ + @@ -2797,6 +3068,7 @@ + @@ -2820,6 +3092,7 @@ + @@ -2890,7 +3163,7 @@ - + @@ -2900,6 +3173,7 @@ + diff -Nru juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters --- juce-6.1.5~ds0/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -140,6 +140,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -194,6 +320,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -454,13 +583,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -574,8 +703,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -949,6 +1078,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -985,6 +1117,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1054,6 +1303,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1063,9 +1318,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1099,6 +1366,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1117,6 +1402,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1132,6 +1420,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1213,9 +1507,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1231,6 +1531,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1297,6 +1600,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2203,6 +2509,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2239,9 +2548,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2518,6 +2824,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -2658,6 +2970,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3222,6 +3537,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3258,6 +3576,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3453,6 +3981,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3462,6 +3996,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3522,6 +4065,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3543,6 +4101,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -3636,6 +4200,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -3660,6 +4227,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4122,6 +4695,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -4644,6 +5220,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -4713,6 +5292,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -4923,7 +5505,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -4949,6 +5531,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff -Nru juce-6.1.5~ds0/extras/AudioPerformanceTest/CMakeLists.txt juce-7.0.0~ds0/extras/AudioPerformanceTest/CMakeLists.txt --- juce-6.1.5~ds0/extras/AudioPerformanceTest/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPerformanceTest/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_ara.cpp juce-7.0.0~ds0/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_ara.cpp --- juce-6.1.5~ds0/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_ara.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_ara.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff -Nru juce-6.1.5~ds0/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp juce-7.0.0~ds0/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp --- juce-6.1.5~ds0/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff -Nru juce-6.1.5~ds0/extras/AudioPerformanceTest/Source/MainComponent.h juce-7.0.0~ds0/extras/AudioPerformanceTest/Source/MainComponent.h --- juce-6.1.5~ds0/extras/AudioPerformanceTest/Source/MainComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPerformanceTest/Source/MainComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/AudioPerformanceTest/Source/Main.cpp juce-7.0.0~ds0/extras/AudioPerformanceTest/Source/Main.cpp --- juce-6.1.5~ds0/extras/AudioPerformanceTest/Source/Main.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPerformanceTest/Source/Main.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/AudioPluginHost.jucer juce-7.0.0~ds0/extras/AudioPluginHost/AudioPluginHost.jucer --- juce-6.1.5~ds0/extras/AudioPluginHost/AudioPluginHost.jucer 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/AudioPluginHost.jucer 2022-06-21 07:56:28.000000000 +0000 @@ -54,29 +54,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -203,6 +180,8 @@ + + + JUCE_PLUGINHOST_VST3="1" JUCE_PLUGINHOST_LADSPA="1" JUCE_PLUGINHOST_LV2="1"/> @@ -260,5 +239,7 @@ + + diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt juce-7.0.0~ds0/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -15,6 +15,14 @@ add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]]) include_directories( AFTER + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK" "../../../JuceLibraryCode" "../../../../../modules" @@ -24,9 +32,9 @@ enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) if(NOT (ANDROID_ABI STREQUAL "mips" OR ANDROID_ABI STREQUAL "mips64")) set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto") @@ -40,6 +48,8 @@ SHARED + "../../../Source/Plugins/ARAPlugin.cpp" + "../../../Source/Plugins/ARAPlugin.h" "../../../Source/Plugins/InternalPlugins.cpp" "../../../Source/Plugins/InternalPlugins.h" "../../../Source/Plugins/IOConfigurationWindow.cpp" @@ -70,6 +80,7 @@ "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" @@ -84,7 +95,6 @@ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" - "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" @@ -121,6 +131,7 @@ "../../../../../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/native/juce_mac_CoreAudioTimeConversions.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" @@ -163,9 +174,9 @@ "../../../../../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_SampleRateHelpers.cpp" "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" - "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" @@ -459,6 +470,8 @@ "../../../../../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_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.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" @@ -483,6 +496,116 @@ "../../../../../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/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" "../../../../../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" @@ -580,16 +703,27 @@ "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.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_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.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_VST3PluginFormat_test.cpp" "../../../../../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" @@ -618,6 +752,17 @@ "../../../../../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/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.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" @@ -631,6 +776,9 @@ "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" "../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" @@ -641,6 +789,8 @@ "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" @@ -692,9 +842,12 @@ "../../../../../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.cpp" "../../../../../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_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.h" "../../../../../modules/juce_core/containers/juce_PropertySet.cpp" @@ -708,6 +861,9 @@ "../../../../../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_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.h" "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" "../../../../../modules/juce_core/files/juce_DirectoryIterator.h" "../../../../../modules/juce_core/files/juce_File.cpp" @@ -774,6 +930,7 @@ "../../../../../modules/juce_core/misc/juce_Uuid.h" "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" "../../../../../modules/juce_core/native/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" "../../../../../modules/juce_core/native/juce_android_Files.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" @@ -1085,6 +1242,7 @@ "../../../../../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_EventLoopInternal.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" @@ -1462,10 +1620,12 @@ "../../../../../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_PointerState.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/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" @@ -1497,13 +1657,13 @@ "../../../../../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_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" "../../../../../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" @@ -1646,8 +1806,8 @@ "../../../../../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_NSViewFrameWatcher.h" "../../../../../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" @@ -1702,6 +1862,8 @@ "../../../JuceLibraryCode/include_juce_audio_devices.cpp" "../../../JuceLibraryCode/include_juce_audio_formats.cpp" "../../../JuceLibraryCode/include_juce_audio_processors.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_ara.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp" "../../../JuceLibraryCode/include_juce_audio_utils.cpp" "../../../JuceLibraryCode/include_juce_core.cpp" "../../../JuceLibraryCode/include_juce_cryptography.cpp" @@ -1715,1667 +1877,1820 @@ "../../../JuceLibraryCode/JuceHeader.h" ) -set_source_files_properties("../../../Source/Plugins/InternalPlugins.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/Plugins/IOConfigurationWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/Plugins/PluginGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/UI/GraphEditorPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/UI/MainHostWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/UI/PluginWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/JUCEAppIcon.png" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../examples/Assets/cassette_recorder.wav" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../examples/Assets/cello.wav" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../examples/Assets/guitar_amp.wav" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../examples/Assets/proaudio.path" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../examples/Assets/reverb_ir.wav" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../examples/Assets/singing.ogg" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Bela.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/assert.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/callback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/compat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/export.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_MathsFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_NormalisableRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Range.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Reservoir.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Functional.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/java/README.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Misc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_curl_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_intel_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_CFHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Files.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Network.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Strings.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Registry.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerSupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerWarnings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_PlatformDefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_StandardHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_TargetPlatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_NewLine.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringRef.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_CriticalSection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_InterProcessLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Process.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_SpinLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTestCategories.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/adler32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/compress.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/infback.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/uncompr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.in.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zlib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_BlowFish.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_BlowFish.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_Primes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_Primes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_RSAKey.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_RSAKey.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_MD5.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_MD5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_SHA256.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_SHA256.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_AudioBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_AudioBlock_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister_Impl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Windowing.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_FastMathApproximations.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LogRampedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LogRampedValue_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LookupTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LookupTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Phase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Polynomial.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DelayLine.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DelayLine.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DryWetMixer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DryWetMixer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter_Impl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Panner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Panner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Bias.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Chorus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Chorus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Compressor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Compressor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Gain.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_LadderFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_LadderFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Limiter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Limiter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_NoiseGate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_NoiseGate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Oscillator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Phaser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Phaser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_WaveShaper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Initialisation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Message.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_NotificationType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_android_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_EventLoop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Line.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Parallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Point.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ScaledImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_Justification.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_common_MimeTypes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_MessageBoxOptions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_HWNDComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Draggable3DOrientation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Matrix3D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Quaternion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Vector3D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_android.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_ios.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_linux_X11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_osx.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_win32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGLExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gl.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gles2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gles2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_khrplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_wgl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../JuceLibraryCode/BinaryData.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../JuceLibraryCode/JuceHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties( + "../../../Source/Plugins/ARAPlugin.h" + "../../../Source/Plugins/InternalPlugins.h" + "../../../Source/Plugins/IOConfigurationWindow.h" + "../../../Source/Plugins/PluginGraph.h" + "../../../Source/UI/GraphEditorPanel.h" + "../../../Source/UI/MainHostWindow.h" + "../../../Source/UI/PluginWindow.h" + "../../../Source/JUCEAppIcon.png" + "../../../../../examples/Assets/cassette_recorder.wav" + "../../../../../examples/Assets/cello.wav" + "../../../../../examples/Assets/guitar_amp.wav" + "../../../../../examples/Assets/proaudio.path" + "../../../../../examples/Assets/reverb_ir.wav" + "../../../../../examples/Assets/singing.ogg" + "../../../../../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_AudioProcessLoadMeasurer.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.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/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.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/native/juce_mac_CoreAudioTimeConversions.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_ADSR_test.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" + "../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" + "../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" + "../../../../../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_basics/utilities/juce_WindowedSincInterpolator.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.mm" + "../../../../../modules/juce_audio_basics/juce_audio_basics.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_SampleRateHelpers.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" + "../../../../../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/oboe/include/oboe/AudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" + "../../../../../modules/juce_audio_devices/native/oboe/README.md" + "../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" + "../../../../../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.mm" + "../../../../../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_audio_devices/juce_audio_devices.cpp" + "../../../../../modules/juce_audio_devices/juce_audio_devices.mm" + "../../../../../modules/juce_audio_devices/juce_audio_devices.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/assert.h" + "../../../../../modules/juce_audio_formats/codecs/flac/callback.h" + "../../../../../modules/juce_audio_formats/codecs/flac/compat.h" + "../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" + "../../../../../modules/juce_audio_formats/codecs/flac/export.h" + "../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/flac/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.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_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.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/sampler/juce_Sampler.cpp" + "../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" + "../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" + "../../../../../modules/juce_audio_formats/juce_audio_formats.mm" + "../../../../../modules/juce_audio_formats/juce_audio_formats.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/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" + "../../../../../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/base/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/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/ivstparameterfunctionname.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/ivsttestplugprovider.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/vstspeaker.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" + "../../../../../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" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.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_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.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_VST3PluginFormat_test.cpp" + "../../../../../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/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_AudioProcessorEditorHostContext.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_HostedAudioProcessorParameter.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/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.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_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" + "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.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_KeyboardComponentBase.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" + "../../../../../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_win_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.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_audio_utils/juce_audio_utils.cpp" + "../../../../../modules/juce_audio_utils/juce_audio_utils.mm" + "../../../../../modules/juce_audio_utils/juce_audio_utils.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.cpp" + "../../../../../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_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" + "../../../../../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_SingleThreadedAbstractFifo.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_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.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_RangedDirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.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_Javascript.cpp" + "../../../../../modules/juce_core/javascript/juce_Javascript.h" + "../../../../../modules/juce_core/javascript/juce_JSON.cpp" + "../../../../../modules/juce_core/javascript/juce_JSON.h" + "../../../../../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_AllocationHooks.cpp" + "../../../../../modules/juce_core/memory/juce_AllocationHooks.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_Reservoir.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_Functional.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/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" + "../../../../../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_BasicNativeHeaders.h" + "../../../../../modules/juce_core/native/juce_curl_Network.cpp" + "../../../../../modules/juce_core/native/juce_intel_SharedCode.h" + "../../../../../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_CFHelpers.h" + "../../../../../modules/juce_core/native/juce_mac_Files.mm" + "../../../../../modules/juce_core/native/juce_mac_Network.mm" + "../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" + "../../../../../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_posix_IPAddress.h" + "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" + "../../../../../modules/juce_core/native/juce_posix_SharedCode.h" + "../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" + "../../../../../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_CompilerWarnings.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_CharacterFunctions.cpp" + "../../../../../modules/juce_core/text/juce_CharacterFunctions.h" + "../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF32.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.cpp" + "../../../../../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/zlib/adler32.c" + "../../../../../modules/juce_core/zip/zlib/compress.c" + "../../../../../modules/juce_core/zip/zlib/crc32.c" + "../../../../../modules/juce_core/zip/zlib/crc32.h" + "../../../../../modules/juce_core/zip/zlib/deflate.c" + "../../../../../modules/juce_core/zip/zlib/deflate.h" + "../../../../../modules/juce_core/zip/zlib/infback.c" + "../../../../../modules/juce_core/zip/zlib/inffast.c" + "../../../../../modules/juce_core/zip/zlib/inffast.h" + "../../../../../modules/juce_core/zip/zlib/inffixed.h" + "../../../../../modules/juce_core/zip/zlib/inflate.c" + "../../../../../modules/juce_core/zip/zlib/inflate.h" + "../../../../../modules/juce_core/zip/zlib/inftrees.c" + "../../../../../modules/juce_core/zip/zlib/inftrees.h" + "../../../../../modules/juce_core/zip/zlib/trees.c" + "../../../../../modules/juce_core/zip/zlib/trees.h" + "../../../../../modules/juce_core/zip/zlib/uncompr.c" + "../../../../../modules/juce_core/zip/zlib/zconf.h" + "../../../../../modules/juce_core/zip/zlib/zconf.in.h" + "../../../../../modules/juce_core/zip/zlib/zlib.h" + "../../../../../modules/juce_core/zip/zlib/zutil.c" + "../../../../../modules/juce_core/zip/zlib/zutil.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_core/juce_core.cpp" + "../../../../../modules/juce_core/juce_core.mm" + "../../../../../modules/juce_core/juce_core.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.mm" + "../../../../../modules/juce_cryptography/juce_cryptography.h" + "../../../../../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/undomanager/juce_UndoableAction.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.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_ValueTreePropertyWithDefault.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" + "../../../../../modules/juce_data_structures/juce_data_structures.cpp" + "../../../../../modules/juce_data_structures/juce_data_structures.mm" + "../../../../../modules/juce_data_structures/juce_data_structures.h" + "../../../../../modules/juce_dsp/containers/juce_AudioBlock.h" + "../../../../../modules/juce_dsp/containers/juce_AudioBlock_test.cpp" + "../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction.h" + "../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp" + "../../../../../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_Convolution_test.cpp" + "../../../../../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/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_BallisticsFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.h" + "../../../../../modules/juce_dsp/processors/juce_DelayLine.cpp" + "../../../../../modules/juce_dsp/processors/juce_DelayLine.h" + "../../../../../modules/juce_dsp/processors/juce_DryWetMixer.cpp" + "../../../../../modules/juce_dsp/processors/juce_DryWetMixer.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_FirstOrderTPTFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.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_LinkwitzRileyFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h" + "../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp" + "../../../../../modules/juce_dsp/processors/juce_Oversampling.h" + "../../../../../modules/juce_dsp/processors/juce_Panner.cpp" + "../../../../../modules/juce_dsp/processors/juce_Panner.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessContext.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp" + "../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h" + "../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h" + "../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.h" + "../../../../../modules/juce_dsp/widgets/juce_Bias.h" + "../../../../../modules/juce_dsp/widgets/juce_Chorus.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Chorus.h" + "../../../../../modules/juce_dsp/widgets/juce_Compressor.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Compressor.h" + "../../../../../modules/juce_dsp/widgets/juce_Gain.h" + "../../../../../modules/juce_dsp/widgets/juce_LadderFilter.cpp" + "../../../../../modules/juce_dsp/widgets/juce_LadderFilter.h" + "../../../../../modules/juce_dsp/widgets/juce_Limiter.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Limiter.h" + "../../../../../modules/juce_dsp/widgets/juce_NoiseGate.cpp" + "../../../../../modules/juce_dsp/widgets/juce_NoiseGate.h" + "../../../../../modules/juce_dsp/widgets/juce_Oscillator.h" + "../../../../../modules/juce_dsp/widgets/juce_Phaser.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Phaser.h" + "../../../../../modules/juce_dsp/widgets/juce_Reverb.h" + "../../../../../modules/juce_dsp/widgets/juce_WaveShaper.h" + "../../../../../modules/juce_dsp/juce_dsp.cpp" + "../../../../../modules/juce_dsp/juce_dsp.mm" + "../../../../../modules/juce_dsp/juce_dsp.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/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_EventLoopInternal.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_ScopedLowPowerModeDisabler.cpp" + "../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.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_events/juce_events.cpp" + "../../../../../modules/juce_events/juce_events.mm" + "../../../../../modules/juce_events/juce_events.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_Rectangle_test.cpp" + "../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" + "../../../../../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/images/juce_ScaledImage.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_RenderingHelpers.h" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.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_graphics/juce_graphics.cpp" + "../../../../../modules/juce_graphics/juce_graphics.mm" + "../../../../../modules/juce_graphics/juce_graphics.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.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_ComponentTraverser.h" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.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_FilenameComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.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_ImagePreviewComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.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_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_FocusOutline.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.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_PointerState.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/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.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_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_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" + "../../../../../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_MultiTouchMapper.h" + "../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" + "../../../../../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_ScopedThreadDPIAwarenessSetter.h" + "../../../../../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_MessageBoxOptions.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_basics/juce_gui_basics.cpp" + "../../../../../modules/juce_gui_basics/juce_gui_basics.mm" + "../../../../../modules/juce_gui_basics/juce_gui_basics.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_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_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_HWNDComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" + "../../../../../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_android_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.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_NSViewComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" + "../../../../../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_HWNDComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.mm" + "../../../../../modules/juce_gui_extra/juce_gui_extra.h" + "../../../../../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/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/native/juce_OpenGLExtensions.h" + "../../../../../modules/juce_opengl/opengl/juce_gl.cpp" + "../../../../../modules/juce_opengl/opengl/juce_gl.h" + "../../../../../modules/juce_opengl/opengl/juce_gles2.cpp" + "../../../../../modules/juce_opengl/opengl/juce_gles2.h" + "../../../../../modules/juce_opengl/opengl/juce_khrplatform.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/opengl/juce_wgl.h" + "../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp" + "../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h" + "../../../../../modules/juce_opengl/juce_opengl.cpp" + "../../../../../modules/juce_opengl/juce_opengl.mm" + "../../../../../modules/juce_opengl/juce_opengl.h" + "../../../JuceLibraryCode/BinaryData.h" + "../../../JuceLibraryCode/JuceHeader.h" + PROPERTIES HEADER_FILE_ONLY TRUE) target_compile_options( ${BINARY_NAME} PRIVATE "-fsigned-char" ) if( JUCE_BUILD_CONFIGURATION MATCHES "DEBUG" ) - target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) + target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) endif() if( JUCE_BUILD_CONFIGURATION MATCHES "RELEASE" ) - target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) + target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) endif() find_library(log "log") diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml juce-7.0.0~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml 2022-06-21 07:56:28.000000000 +0000 @@ -4,7 +4,7 @@ package="com.juce.pluginhost"> - + diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h juce-7.0.0~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h juce-7.0.0~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h juce-7.0.0~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/WavefrontObjParser.h juce-7.0.0~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/WavefrontObjParser.h --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/WavefrontObjParser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/Android/app/src/main/assets/WavefrontObjParser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj juce-7.0.0~ds0/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj 2022-06-21 07:56:28.000000000 +0000 @@ -23,6 +23,7 @@ 50AFD116DCA6EC228EFB322D /* UIKit.framework */ = {isa = PBXBuildFile; fileRef = F9EDC54DFBCF3A63E0AA5D73; }; 59F4F23BFFDAB414B4801F85 /* Images.xcassets */ = {isa = PBXBuildFile; fileRef = 29E0972229FB44D969035B4E; }; 5C4D406B924230F83E3580AD /* include_juce_audio_devices.mm */ = {isa = PBXBuildFile; fileRef = 65968EA1B476D71F14DE1D58; }; + 60BBD03840ABDD719FED194F /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 5183A94449F6317518C48B0C; }; 70580743C3D5695F065FF698 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = E68018DE199135B7F738FB17; }; 73E371F1B912FCCAE0CD7E5D /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 86CA337014D3F67E906FFD28; }; 76A80851698FC773D2479B4E /* include_juce_core.mm */ = {isa = PBXBuildFile; fileRef = 683CEE986A2467C850FE99E6; }; @@ -31,6 +32,7 @@ 851C1165C9E4ACDD19C56A96 /* AVFoundation.framework */ = {isa = PBXBuildFile; fileRef = 942A0F04EFB8D0B2FF9780BA; }; 9056B642BEF870098DE344E5 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = 03FA420AACDD03D50AA16E4A; }; 92EE84159C7027A137F06204 /* CoreText.framework */ = {isa = PBXBuildFile; fileRef = 66643EDF46AE8C5B7956B91D; }; + 970A893BD34180916C9D01C4 /* ARAPlugin.cpp */ = {isa = PBXBuildFile; fileRef = 6A01D5F304346E0332264056; }; A0144A682BF4843C8CF53FE4 /* BinaryData.cpp */ = {isa = PBXBuildFile; fileRef = 6D107D7946DC5976B766345B; }; A02C9F4C4B840C27B6CAFEBD /* QuartzCore.framework */ = {isa = PBXBuildFile; fileRef = 89309C0C5F3269BD06BE7F27; }; A09E93F1B354E1FF8B3E9ABE /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = 5EF1D381F42AA8764597F189; }; @@ -39,6 +41,7 @@ B0D5475F716126465FCE1586 /* CoreImage.framework */ = {isa = PBXBuildFile; fileRef = CFFA8E9A7820C5A27B4393C9; }; C38D14DC58F1941DD5E4BF60 /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = 2BE6C2DFD6EBB9A89109AEB5; }; C81D59C798F9F1F1A549FF07 /* CoreServices.framework */ = {isa = PBXBuildFile; fileRef = 7D924E83DABA5B54205C52F4; }; + CAC10E4345428CAEE6F0DA1B /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = A43CE79CB190C2D69E17E1E3; }; CAF0DE157C8F7D9F168AA3B6 /* include_juce_audio_processors.mm */ = {isa = PBXBuildFile; fileRef = 5FBD6C402617272052BB4D81; }; E092A70431B046BF1F50A482 /* CoreMIDI.framework */ = {isa = PBXBuildFile; fileRef = 5AF0CA7CDFCA90B4DE1F55C3; }; E283262A07376A7EDFCEAF6F /* LaunchScreen.storyboard */ = {isa = PBXBuildFile; fileRef = F58EBA72DA53F75945B91321; }; @@ -70,6 +73,7 @@ 45098BAF7E088D41A4E69E42 /* singing.ogg */ /* singing.ogg */ = {isa = PBXFileReference; lastKnownFileType = file.ogg; name = singing.ogg; path = ../../../../examples/Assets/singing.ogg; sourceTree = SOURCE_ROOT; }; 46C3C2CD301CD59C51FD02D6 /* PluginGraph.h */ /* PluginGraph.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginGraph.h; path = ../../Source/Plugins/PluginGraph.h; sourceTree = SOURCE_ROOT; }; 4C7D82F9274A4F9DBF11235C /* include_juce_audio_basics.mm */ /* include_juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_basics.mm; path = ../../JuceLibraryCode/include_juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; + 5183A94449F6317518C48B0C /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 5313EB852E41EE58B199B9A2 /* juce_audio_devices */ /* juce_audio_devices */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_devices; path = ../../../../modules/juce_audio_devices; sourceTree = SOURCE_ROOT; }; 57DF618F1DE781556B7AFC32 /* Info-App.plist */ /* Info-App.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = SOURCE_ROOT; }; 59842A98E5EBBC54B50C04CD /* juce_events */ /* juce_events */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_events; path = ../../../../modules/juce_events; sourceTree = SOURCE_ROOT; }; @@ -81,6 +85,7 @@ 65968EA1B476D71F14DE1D58 /* include_juce_audio_devices.mm */ /* include_juce_audio_devices.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_devices.mm; path = ../../JuceLibraryCode/include_juce_audio_devices.mm; sourceTree = SOURCE_ROOT; }; 66643EDF46AE8C5B7956B91D /* CoreText.framework */ /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 683CEE986A2467C850FE99E6 /* include_juce_core.mm */ /* include_juce_core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_core.mm; path = ../../JuceLibraryCode/include_juce_core.mm; sourceTree = SOURCE_ROOT; }; + 6A01D5F304346E0332264056 /* ARAPlugin.cpp */ /* ARAPlugin.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ARAPlugin.cpp; path = ../../Source/Plugins/ARAPlugin.cpp; sourceTree = SOURCE_ROOT; }; 6A71B2BCAC4239072BC2BD7E /* juce_audio_basics */ /* juce_audio_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_basics; path = ../../../../modules/juce_audio_basics; sourceTree = SOURCE_ROOT; }; 6D107D7946DC5976B766345B /* BinaryData.cpp */ /* BinaryData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = SOURCE_ROOT; }; 7D924E83DABA5B54205C52F4 /* CoreServices.framework */ /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; }; @@ -99,6 +104,7 @@ 97918AB43AD460AFA8FA2FFE /* PluginWindow.h */ /* PluginWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginWindow.h; path = ../../Source/UI/PluginWindow.h; sourceTree = SOURCE_ROOT; }; 97E63C295843A1E665E70473 /* cello.wav */ /* cello.wav */ = {isa = PBXFileReference; lastKnownFileType = file.wav; name = cello.wav; path = ../../../../examples/Assets/cello.wav; sourceTree = SOURCE_ROOT; }; 9F9B445E6755CAA19E4344ED /* CoreAudio.framework */ /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + A43CE79CB190C2D69E17E1E3 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; A5DFC13E4F09134B0D226A3E /* MainHostWindow.h */ /* MainHostWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainHostWindow.h; path = ../../Source/UI/MainHostWindow.h; sourceTree = SOURCE_ROOT; }; A5E7CA8A71D049BE2BD33861 /* JuceHeader.h */ /* JuceHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = SOURCE_ROOT; }; A66EFAC64B1B67B536C73415 /* HostStartup.cpp */ /* HostStartup.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HostStartup.cpp; path = ../../Source/HostStartup.cpp; sourceTree = SOURCE_ROOT; }; @@ -111,6 +117,7 @@ B8E24A5CEE6B7055537725CF /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; B95B9D6774059DBB19F2B4E2 /* InternalPlugins.h */ /* InternalPlugins.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InternalPlugins.h; path = ../../Source/Plugins/InternalPlugins.h; sourceTree = SOURCE_ROOT; }; C37B2E77AAB6C9E13729BF99 /* IOConfigurationWindow.cpp */ /* IOConfigurationWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = IOConfigurationWindow.cpp; path = ../../Source/Plugins/IOConfigurationWindow.cpp; sourceTree = SOURCE_ROOT; }; + CA726B9AA0EC87B58D005C8D /* ARAPlugin.h */ /* ARAPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ARAPlugin.h; path = ../../Source/Plugins/ARAPlugin.h; sourceTree = SOURCE_ROOT; }; CFFA8E9A7820C5A27B4393C9 /* CoreImage.framework */ /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; }; D0026F0A29B486D87E92BB8B /* OpenGLES.framework */ /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; D4EBC17BDB7F88CCBC76730B /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; @@ -185,6 +192,8 @@ 65968EA1B476D71F14DE1D58, 5D250A57C7DEA80248F30EED, 5FBD6C402617272052BB4D81, + A43CE79CB190C2D69E17E1E3, + 5183A94449F6317518C48B0C, B285CAB91AE928C476CA4F9C, 683CEE986A2467C850FE99E6, B8E24A5CEE6B7055537725CF, @@ -233,6 +242,8 @@ 9F51E92D8C77FA9DDD1F7B10 /* Plugins */ = { isa = PBXGroup; children = ( + 6A01D5F304346E0332264056, + CA726B9AA0EC87B58D005C8D, 87A7AAB053051C49EAF4EE88, B95B9D6774059DBB19F2B4E2, C37B2E77AAB6C9E13729BF99, @@ -334,7 +345,7 @@ ADE6E539DB98A302483A82D0 = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { @@ -396,6 +407,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 970A893BD34180916C9D01C4, 7FF8A938915488310A7F5921, 025B22813EA4E34CE3630B9A, 09309BD494A05931864B6730, @@ -407,6 +419,8 @@ 5C4D406B924230F83E3580AD, F4DD98B9310B679D50A2C8A6, CAF0DE157C8F7D9F168AA3B6, + CAC10E4345428CAEE6F0DA1B, + 60BBD03840ABDD719FED194F, 0F20A4AE04736634F097F5A6, 76A80851698FC773D2479B4E, E4A926EF695823F0F13268FF, @@ -442,7 +456,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -466,6 +480,7 @@ "JUCE_PLUGINHOST_VST3=1", "JUCE_PLUGINHOST_AU=1", "JUCE_PLUGINHOST_LADSPA=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_USE_CDREADER=0", "JUCE_USE_CDBURNER=0", "JUCE_WEB_BROWSER=0", @@ -477,13 +492,21 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", @@ -493,9 +516,10 @@ INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; LLVM_LTO = YES; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost; PRODUCT_NAME = "Plugin Host"; USE_HEADERMAP = NO; @@ -573,7 +597,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -597,6 +621,7 @@ "JUCE_PLUGINHOST_VST3=1", "JUCE_PLUGINHOST_AU=1", "JUCE_PLUGINHOST_LADSPA=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_USE_CDREADER=0", "JUCE_USE_CDBURNER=0", "JUCE_WEB_BROWSER=0", @@ -608,13 +633,21 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", @@ -623,9 +656,10 @@ INFOPLIST_FILE = Info-App.plist; INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost; PRODUCT_NAME = "Plugin Host"; USE_HEADERMAP = NO; diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile juce-7.0.0~ds0/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile 2022-06-21 07:56:28.000000000 +0000 @@ -11,6 +11,10 @@ # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := AudioPluginHost JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,18 +60,19 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := AudioPluginHost JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -Os $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif OBJECTS_APP := \ + $(JUCE_OBJDIR)/ARAPlugin_e9864935.o \ $(JUCE_OBJDIR)/InternalPlugins_8278e3f5.o \ $(JUCE_OBJDIR)/IOConfigurationWindow_d71a5732.o \ $(JUCE_OBJDIR)/PluginGraph_6bd15e2d.o \ @@ -79,6 +84,8 @@ $(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \ $(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o \ $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o \ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \ $(JUCE_OBJDIR)/include_juce_cryptography_8cb807a8.o \ @@ -95,14 +102,19 @@ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors alsa freetype2 libcurl + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors alsa freetype2 libcurl @echo Linking "AudioPluginHost - App" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) -$(V_AT)mkdir -p $(JUCE_OUTDIR) $(V_AT)$(CXX) -o $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(OBJECTS_APP) $(JUCE_LDFLAGS) $(JUCE_LDFLAGS_APP) $(RESOURCES) $(TARGET_ARCH) +$(JUCE_OBJDIR)/ARAPlugin_e9864935.o: ../../Source/Plugins/ARAPlugin.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling ARAPlugin.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/InternalPlugins_8278e3f5.o: ../../Source/Plugins/InternalPlugins.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling InternalPlugins.cpp" @@ -158,6 +170,16 @@ @echo "Compiling include_juce_audio_processors.cpp" $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" +$(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o: ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_ara.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o: ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_lv2_libs.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o: ../../JuceLibraryCode/include_juce_audio_utils.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling include_juce_audio_utils.cpp" diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj juce-7.0.0~ds0/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj 2022-06-21 07:56:28.000000000 +0000 @@ -14,12 +14,12 @@ 15CCE43D7DCFC649638919D4 /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 4C7D82F9274A4F9DBF11235C; }; 21D330A5B13178B12BEAFC3C /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = D4EBC17BDB7F88CCBC76730B; }; 2727A191DB1BAAC9C04B9081 /* include_juce_opengl.mm */ = {isa = PBXBuildFile; fileRef = 37E4D5C341406B7072120006; }; - 2B4B9CF71F94BDD1E3AC89AE /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = B0935EBBA4F6E2B05F3D1C0A; }; 2C3D221D2AA87F07B3F1044D /* include_juce_gui_basics.mm */ = {isa = PBXBuildFile; fileRef = 8FE7B37CDE0818DB27BDDEBD; }; 3E1689E23B9C85F03209DCEF /* GraphEditorPanel.cpp */ = {isa = PBXBuildFile; fileRef = 3D78A731234A833CA112AE45; }; 443244451A0F2064D4767337 /* Icon.icns */ = {isa = PBXBuildFile; fileRef = 2A6983F82B13F9E8B10299AE; }; 4DB15177DDC357F4503F88CF /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = B457EE687507BF1DEEA7581F; }; 5C4D406B924230F83E3580AD /* include_juce_audio_devices.mm */ = {isa = PBXBuildFile; fileRef = 65968EA1B476D71F14DE1D58; }; + 60BBD03840ABDD719FED194F /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 5183A94449F6317518C48B0C; }; 68FBFDA1FE637B3EDA09A592 /* IOKit.framework */ = {isa = PBXBuildFile; fileRef = 4DF6E6E41E10965AD169143B; }; 70580743C3D5695F065FF698 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = E68018DE199135B7F738FB17; }; 73E371F1B912FCCAE0CD7E5D /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 86CA337014D3F67E906FFD28; }; @@ -27,6 +27,7 @@ 7DE202DC1D876F49266D9E7D /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 8290D7BAC160B3A56B66891A; }; 7FF8A938915488310A7F5921 /* InternalPlugins.cpp */ = {isa = PBXBuildFile; fileRef = 87A7AAB053051C49EAF4EE88; }; 9056B642BEF870098DE344E5 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = 03FA420AACDD03D50AA16E4A; }; + 970A893BD34180916C9D01C4 /* ARAPlugin.cpp */ = {isa = PBXBuildFile; fileRef = 6A01D5F304346E0332264056; }; A0144A682BF4843C8CF53FE4 /* BinaryData.cpp */ = {isa = PBXBuildFile; fileRef = 6D107D7946DC5976B766345B; }; A02C9F4C4B840C27B6CAFEBD /* QuartzCore.framework */ = {isa = PBXBuildFile; fileRef = 89309C0C5F3269BD06BE7F27; }; A09E93F1B354E1FF8B3E9ABE /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = 5EF1D381F42AA8764597F189; }; @@ -36,6 +37,7 @@ B288A89F96704F142ED8E939 /* AudioUnit.framework */ = {isa = PBXBuildFile; fileRef = 5ACC21AA45BBF48C3C64D56D; }; BBA1733CF8B064A5FD0B4CF4 /* OpenGL.framework */ = {isa = PBXBuildFile; fileRef = D313CF37B25D7FD313C4F336; }; C38D14DC58F1941DD5E4BF60 /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = 2BE6C2DFD6EBB9A89109AEB5; }; + CAC10E4345428CAEE6F0DA1B /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = A43CE79CB190C2D69E17E1E3; }; CAF0DE157C8F7D9F168AA3B6 /* include_juce_audio_processors.mm */ = {isa = PBXBuildFile; fileRef = 5FBD6C402617272052BB4D81; }; D92C7BF86C9CCF6B4D14F809 /* RecentFilesMenuTemplate.nib */ = {isa = PBXBuildFile; fileRef = 7DA35787B5F6F7440D667CC8; }; E092A70431B046BF1F50A482 /* CoreMIDI.framework */ = {isa = PBXBuildFile; fileRef = 5AF0CA7CDFCA90B4DE1F55C3; }; @@ -67,6 +69,7 @@ 46C3C2CD301CD59C51FD02D6 /* PluginGraph.h */ /* PluginGraph.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginGraph.h; path = ../../Source/Plugins/PluginGraph.h; sourceTree = SOURCE_ROOT; }; 4C7D82F9274A4F9DBF11235C /* include_juce_audio_basics.mm */ /* include_juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_basics.mm; path = ../../JuceLibraryCode/include_juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; 4DF6E6E41E10965AD169143B /* IOKit.framework */ /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; + 5183A94449F6317518C48B0C /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 5313EB852E41EE58B199B9A2 /* juce_audio_devices */ /* juce_audio_devices */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_devices; path = ../../../../modules/juce_audio_devices; sourceTree = SOURCE_ROOT; }; 57DF618F1DE781556B7AFC32 /* Info-App.plist */ /* Info-App.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = SOURCE_ROOT; }; 59842A98E5EBBC54B50C04CD /* juce_events */ /* juce_events */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_events; path = ../../../../modules/juce_events; sourceTree = SOURCE_ROOT; }; @@ -78,6 +81,7 @@ 5FBD6C402617272052BB4D81 /* include_juce_audio_processors.mm */ /* include_juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_processors.mm; path = ../../JuceLibraryCode/include_juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; 65968EA1B476D71F14DE1D58 /* include_juce_audio_devices.mm */ /* include_juce_audio_devices.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_devices.mm; path = ../../JuceLibraryCode/include_juce_audio_devices.mm; sourceTree = SOURCE_ROOT; }; 683CEE986A2467C850FE99E6 /* include_juce_core.mm */ /* include_juce_core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_core.mm; path = ../../JuceLibraryCode/include_juce_core.mm; sourceTree = SOURCE_ROOT; }; + 6A01D5F304346E0332264056 /* ARAPlugin.cpp */ /* ARAPlugin.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ARAPlugin.cpp; path = ../../Source/Plugins/ARAPlugin.cpp; sourceTree = SOURCE_ROOT; }; 6A71B2BCAC4239072BC2BD7E /* juce_audio_basics */ /* juce_audio_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_basics; path = ../../../../modules/juce_audio_basics; sourceTree = SOURCE_ROOT; }; 6D107D7946DC5976B766345B /* BinaryData.cpp */ /* BinaryData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = SOURCE_ROOT; }; 7DA35787B5F6F7440D667CC8 /* RecentFilesMenuTemplate.nib */ /* RecentFilesMenuTemplate.nib */ = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = SOURCE_ROOT; }; @@ -96,12 +100,12 @@ 9794142D24966F93FFDE51A1 /* Cocoa.framework */ /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 97E63C295843A1E665E70473 /* cello.wav */ /* cello.wav */ = {isa = PBXFileReference; lastKnownFileType = file.wav; name = cello.wav; path = ../../../../examples/Assets/cello.wav; sourceTree = SOURCE_ROOT; }; 9F9B445E6755CAA19E4344ED /* CoreAudio.framework */ /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + A43CE79CB190C2D69E17E1E3 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; A5DFC13E4F09134B0D226A3E /* MainHostWindow.h */ /* MainHostWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainHostWindow.h; path = ../../Source/UI/MainHostWindow.h; sourceTree = SOURCE_ROOT; }; A5E7CA8A71D049BE2BD33861 /* JuceHeader.h */ /* JuceHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = SOURCE_ROOT; }; A66EFAC64B1B67B536C73415 /* HostStartup.cpp */ /* HostStartup.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HostStartup.cpp; path = ../../Source/HostStartup.cpp; sourceTree = SOURCE_ROOT; }; A692426308435C2002F988FE /* proaudio.path */ /* proaudio.path */ = {isa = PBXFileReference; lastKnownFileType = file.path; name = proaudio.path; path = ../../../../examples/Assets/proaudio.path; sourceTree = SOURCE_ROOT; }; A872AF2CAFFC72109B9C6348 /* cassette_recorder.wav */ /* cassette_recorder.wav */ = {isa = PBXFileReference; lastKnownFileType = file.wav; name = cassette_recorder.wav; path = ../../../../examples/Assets/cassette_recorder.wav; sourceTree = SOURCE_ROOT; }; - B0935EBBA4F6E2B05F3D1C0A /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; B285CAB91AE928C476CA4F9C /* include_juce_audio_utils.mm */ /* include_juce_audio_utils.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_utils.mm; path = ../../JuceLibraryCode/include_juce_audio_utils.mm; sourceTree = SOURCE_ROOT; }; B2A1E626CC120982805754F6 /* JUCEAppIcon.png */ /* JUCEAppIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = JUCEAppIcon.png; path = ../../Source/JUCEAppIcon.png; sourceTree = SOURCE_ROOT; }; B457EE687507BF1DEEA7581F /* WebKit.framework */ /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; @@ -110,6 +114,7 @@ B8E24A5CEE6B7055537725CF /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; B95B9D6774059DBB19F2B4E2 /* InternalPlugins.h */ /* InternalPlugins.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InternalPlugins.h; path = ../../Source/Plugins/InternalPlugins.h; sourceTree = SOURCE_ROOT; }; C37B2E77AAB6C9E13729BF99 /* IOConfigurationWindow.cpp */ /* IOConfigurationWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = IOConfigurationWindow.cpp; path = ../../Source/Plugins/IOConfigurationWindow.cpp; sourceTree = SOURCE_ROOT; }; + CA726B9AA0EC87B58D005C8D /* ARAPlugin.h */ /* ARAPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ARAPlugin.h; path = ../../Source/Plugins/ARAPlugin.h; sourceTree = SOURCE_ROOT; }; D313CF37B25D7FD313C4F336 /* OpenGL.framework */ /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; D4EBC17BDB7F88CCBC76730B /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; E68018DE199135B7F738FB17 /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; @@ -128,7 +133,6 @@ B288A89F96704F142ED8E939, 73E371F1B912FCCAE0CD7E5D, 21D330A5B13178B12BEAFC3C, - 2B4B9CF71F94BDD1E3AC89AE, AC3BED74AC7C6D9F5739F38B, E3CB85BA817BC9E3942A8AB0, 70580743C3D5695F065FF698, @@ -180,6 +184,8 @@ 65968EA1B476D71F14DE1D58, 5D250A57C7DEA80248F30EED, 5FBD6C402617272052BB4D81, + A43CE79CB190C2D69E17E1E3, + 5183A94449F6317518C48B0C, B285CAB91AE928C476CA4F9C, 683CEE986A2467C850FE99E6, B8E24A5CEE6B7055537725CF, @@ -228,6 +234,8 @@ 9F51E92D8C77FA9DDD1F7B10 /* Plugins */ = { isa = PBXGroup; children = ( + 6A01D5F304346E0332264056, + CA726B9AA0EC87B58D005C8D, 87A7AAB053051C49EAF4EE88, B95B9D6774059DBB19F2B4E2, C37B2E77AAB6C9E13729BF99, @@ -266,7 +274,6 @@ 5ACC21AA45BBF48C3C64D56D, 86CA337014D3F67E906FFD28, D4EBC17BDB7F88CCBC76730B, - B0935EBBA4F6E2B05F3D1C0A, 9794142D24966F93FFDE51A1, 9F9B445E6755CAA19E4344ED, E68018DE199135B7F738FB17, @@ -327,7 +334,7 @@ ADE6E539DB98A302483A82D0 = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { @@ -388,6 +395,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 970A893BD34180916C9D01C4, 7FF8A938915488310A7F5921, 025B22813EA4E34CE3630B9A, 09309BD494A05931864B6730, @@ -399,6 +407,8 @@ 5C4D406B924230F83E3580AD, F4DD98B9310B679D50A2C8A6, CAF0DE157C8F7D9F168AA3B6, + CAC10E4345428CAEE6F0DA1B, + 60BBD03840ABDD719FED194F, 0F20A4AE04736634F097F5A6, 76A80851698FC773D2479B4E, E4A926EF695823F0F13268FF, @@ -433,7 +443,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -457,6 +467,7 @@ "JUCE_PLUGINHOST_VST3=1", "JUCE_PLUGINHOST_AU=1", "JUCE_PLUGINHOST_LADSPA=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_USE_CDREADER=0", "JUCE_USE_CDBURNER=0", "JUCE_WEB_BROWSER=0", @@ -468,13 +479,21 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", @@ -485,9 +504,10 @@ INSTALL_PATH = "$(HOME)/Applications"; LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost; PRODUCT_NAME = "AudioPluginHost"; USE_HEADERMAP = NO; @@ -563,7 +583,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -587,6 +607,7 @@ "JUCE_PLUGINHOST_VST3=1", "JUCE_PLUGINHOST_AU=1", "JUCE_PLUGINHOST_LADSPA=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_USE_CDREADER=0", "JUCE_USE_CDBURNER=0", "JUCE_WEB_BROWSER=0", @@ -598,13 +619,21 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", @@ -614,9 +643,10 @@ INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost; PRODUCT_NAME = "AudioPluginHost"; USE_HEADERMAP = NO; diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,3190 +0,0 @@ - - - - - - Debug - x64 - - - Release - x64 - - - - {5666EAA2-C82B-D06A-5228-D0E810428536} - - - - Application - false - false - v140 - 8.1 - - - Application - false - true - v140 - 8.1 - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - .exe - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - AudioPluginHost - true - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - AudioPluginHost - true - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Disabled - ProgramDatabase - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - true - NotUsing - $(IntDir)\ - $(IntDir)\ - $(IntDir)\AudioPluginHost.pdb - Level4 - true - true - /w44265 /w44062 /bigobj %(AdditionalOptions) - stdcpp14 - - - _DEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\AudioPluginHost.exe - true - libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) - true - $(IntDir)\AudioPluginHost.pdb - Windows - true - - - true - $(IntDir)\AudioPluginHost.bsc - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Full - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreadedDLL - true - NotUsing - $(IntDir)\ - $(IntDir)\ - $(IntDir)\AudioPluginHost.pdb - Level4 - true - true - /w44265 /w44062 /bigobj %(AdditionalOptions) - stdcpp14 - - - NDEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\AudioPluginHost.exe - true - %(IgnoreSpecificDefaultLibraries) - false - $(IntDir)\AudioPluginHost.pdb - Windows - true - true - true - UseLinkTimeCodeGeneration - - - true - $(IntDir)\AudioPluginHost.bsc - - - - - - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - - - - - - /bigobj %(AdditionalOptions) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 @@ -1,5531 +0,0 @@ - - - - - - {346E906D-8A2B-A93A-4C90-BCD3C60D2FD0} - - - {8C61EB30-11E6-7029-4CC8-56C52EB1F1C3} - - - {57E59C1B-8971-243F-9A1A-8EABFD456232} - - - {7FF9F684-A465-C086-BEFF-C3EF408A7A84} - - - {297DEAC9-184C-CA1D-D75C-DAA34116691C} - - - {EB58F05A-A968-CEBE-40C4-107CDD8F240F} - - - {5FCF559E-451A-CB1E-B177-A5DC5A0005BB} - - - {05CE33FC-868F-AA1A-12B8-79C98E753648} - - - {D78296AF-218E-B17E-7F8B-9D148601188D} - - - {B96EBA26-E668-FFAF-FC53-1EC1337DAF5A} - - - {D8532E5E-469E-5042-EFC8-238241704735} - - - {777B5D1D-9AF0-B22B-8894-034603EE97F5} - - - {8292766D-2459-2E7E-7615-17216318BA93} - - - {9BD56105-DAB4-EBD5-00DD-BD540E98FE88} - - - {10472B2C-9888-D269-F351-0D0AC3BCD16C} - - - {BF23FC10-1D57-2A9B-706F-6DD8A7B593D4} - - - {386862D5-4DCC-A4B3-5642-60A201E303EF} - - - {092EFC17-7C95-7E04-0ACA-0D61A462EE81} - - - {285118C6-8FDA-7DCE-BEF4-FFB2120876C5} - - - {69ED6B61-9B8D-D47E-E4A6-2E9F9A94A75A} - - - {7CDB7CD1-BB96-F593-3C78-1E06182B5839} - - - {B0A708DE-B4CF-196B-14FB-DC8221509B8E} - - - {34F46ADE-EE31-227A-A69E-7732E70145F1} - - - {BB9B3C77-17FB-E994-8B75-88F1727E4655} - - - {C0971D77-2F14-190A-E2AE-89D6285F4D5A} - - - {AABEA333-6524-8891-51C7-6DAEB5700628} - - - {F2D29337-983E-BAD7-7B5C-E0AB3D53D404} - - - {C674B0FB-1FC0-2986-94B1-083845018994} - - - {0AFC1CE8-F6E6-9817-8C21-8432B2A375DA} - - - {0D1AF264-3AC1-78A2-B2A4-AE6171F9194A} - - - {9A5DB854-CFFB-5F88-C566-0E10F994DDB3} - - - {38A5DDC7-416E-548F-39DA-887875FE6B20} - - - {980FE2DB-05D3-5FDA-79DA-067A56F5D19D} - - - {F336DC25-747A-0663-93D6-E3EB9AA0CBF8} - - - {7D78546A-80FC-4DCA-00B9-F191F0AB2179} - - - {9EB3EC7F-2AB7-DDAA-3C05-DF382B728D3F} - - - {6B9FBFDC-1D10-6246-356D-00FF4535CECB} - - - {D6FCFC8E-7136-9109-78C0-91A3EB4C443F} - - - {EBF18AC1-F0ED-937A-2824-4307CE2ADAF7} - - - {5A0F7922-2EFB-6465-57E4-A445B804EFB5} - - - {4EC45416-0E7C-7567-6F75-D0C8CEE7DC4F} - - - {C2985031-0496-55B5-41A8-BAB99E53D89D} - - - {FB4AB426-7009-0036-BB75-E34256AA7C89} - - - {E684D858-09E8-0251-8E86-5657129641E1} - - - {1EF1BF17-F941-243A-04D1-EE617D140CBA} - - - {344DB016-679C-FBD0-3EC6-4570C47522DE} - - - {3D9758A0-9359-1710-87C1-05D475C08B17} - - - {E824435F-FC7B-10BE-5D1A-5DACC51A8836} - - - {86737735-F6BA-F64A-5EC7-5C9F36755F79} - - - {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} - - - {80C72173-A1E1-C3C5-9288-B889CE2EAFEA} - - - {4138B955-AA0B-FA86-DBF9-404CAFFFA866} - - - {2B4166B8-F470-F07C-4F51-D2DAAAECBB18} - - - {9C295115-C0CD-3129-1C4D-FB53299B23FB} - - - {65526A8B-3447-9DF0-FD5D-00D111126027} - - - {A54A1F5C-F32F-F97B-9E8A-69922B770A54} - - - {B90A44F3-B62D-B5C0-81A2-683D2650AEE6} - - - {DAF30656-5915-0E45-C4E4-54439617D525} - - - {9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C} - - - {9C713CBA-A9E2-5F4E-F83C-2CAB8533913C} - - - {63571A07-9AA3-5BB0-1103-0B42A2E6BC9E} - - - {314F43F2-BC8F-B464-EAE7-86B9675454E9} - - - {874C5D0C-6D29-68EE-38BB-26200B56BC89} - - - {86BAA7A7-DC50-35B6-910B-932AEAF257F2} - - - {6B7BE34D-1BC1-C7B9-111F-C55CA8250943} - - - {9B6B6D54-D378-80C2-8CC9-D1D8FB44C2A8} - - - {D0584AC3-6837-14F6-90BF-5EA604D1F074} - - - {794B64EC-B809-32E3-AD00-4EE6A74802CA} - - - {67BE498C-9E1F-C73A-B99A-387C034CE680} - - - {1A9C8538-959B-25E3-473D-B462C9A9D458} - - - {AA9F594C-DFAF-C0A7-0CCD-9F90E54D3A01} - - - {230BF784-34F4-3BE8-46D4-54E6B67E5E9E} - - - {39F680F3-5161-4D1C-EAD0-3911ED808874} - - - {3197198B-A978-E330-C7FB-07E5CE8236C7} - - - {42F7BE9D-3C8A-AE26-289B-8F355C068036} - - - {7868764A-6572-381A-906C-9C26792A4C29} - - - {03678508-A517-48BB-FB4A-485628C34E08} - - - {07D27C1D-3227-F527-356C-17DA11551A99} - - - {6146D580-99D2-A6C8-5908-30DC355BB6BA} - - - {C67003E8-BEA8-2188-F4B3-A122F4B4FA3F} - - - {09B91E68-1FF4-C7ED-9055-D4D96E66A0BA} - - - {30B3DA63-C1E4-F2EA-CEF0-8035D8CBFF64} - - - {4F24EEED-AA33-AC6C-9A39-72E71CF83EF0} - - - {0F70B1A9-BB50-23F5-2AE7-F95E51A00389} - - - {D4C8DC40-2CD2-04B6-05D0-1E7A88841390} - - - {58BED6AF-DB89-7560-B2B8-D937C1C0825A} - - - {B958F86B-6926-8D9B-2FC6-8BFD4BDC72C9} - - - {DB624F7D-D513-25AC-C13C-B9062EB3BEEE} - - - {89AA9B6C-4029-A34F-C1B0-3B5D8691F4D4} - - - {1A7F541C-B032-9C66-C320-A13B2A8A9866} - - - {4BAB7C18-51AB-0D9D-83CD-9C37F28D2E38} - - - {5523922E-8B0C-A52B-477C-752C09F8197F} - - - {857B6D8B-0ECB-FE9E-D1EB-D5E45E72F057} - - - {BAA582FA-40B7-320E-EE7A-4C3892C7BE72} - - - {89B3E447-34BE-C691-638E-09796C6B647E} - - - {9BE78436-DBF4-658C-579B-ED19FFD0EB5D} - - - {21E7FA61-9E0A-4BA1-04B7-AF47AFA9CB8B} - - - {632B4C79-AF7D-BFB5-D006-5AE67F607130} - - - {B10E20C2-4583-2B79-60B7-FE4D4B044313} - - - {CFB54F15-8A8A-0505-9B7F-ECA41CEE38E8} - - - {911F0159-A7A8-4A43-3FD4-154F62F4A44B} - - - {53CF03D3-988B-CD28-9130-CE08FDCEF7E9} - - - {29C6FE02-507E-F3FE-16CD-74D84842C1EA} - - - {8001BD68-125B-E392-8D3B-1F9C9520A65A} - - - {EDC17061-CFA0-8EA0-0ADA-90F31C2FB0F2} - - - {B813BD14-6565-2525-9AC3-E3AA48EDDA85} - - - {DDF4BA73-8578-406D-21F8-06B9BC70BFEA} - - - {73374573-0194-9A6E-461A-A81EEB511C26} - - - {5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E} - - - {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} - - - {3FDCD000-763F-8477-9AF8-70ABA2E91E5E} - - - {0947506F-66FA-EF8D-8A4E-4D48BCDBB226} - - - {E4B6AED3-F54C-3FF2-069F-640BACAE0E08} - - - {D5EADBCC-6A1C-C940-0206-26E49110AF08} - - - {D27DC92D-5BEB-9294-DCD1-81D54E245AD5} - - - {BCD73D20-42B1-6CDB-DE66-B06236A60F47} - - - {20DC13F6-2369-8841-9F0B-D13FA14EEE74} - - - {A302A8DB-120F-9EBB-A3D5-2C29963AA56B} - - - {45489C2A-6E0E-CCDC-6638-0DACEEB63CCA} - - - {F1B90726-DB55-0293-BFAF-C65C7DF5489C} - - - {2C55FD42-0ACD-B0B8-7EAE-EB17F09BAEEC} - - - {B68CD2B2-701F-9AB7-4638-2485D6E06BCF} - - - {B0B7C78E-729E-0FFA-D611-82AE8BC7FE2C} - - - {0A4F7E12-220C-14EF-0026-9C0629FA9C17} - - - {37F49E10-4E62-6D5C-FF70-722D0CA3D97E} - - - {160D9882-0F68-278D-C5F9-8960FD7421D2} - - - {4CED05DA-E0A2-E548-F753-1F2EF299A8E3} - - - {46AE69B8-AD58-4381-6CDE-25C8D75B01D2} - - - {E56CB4FC-32E8-8740-A3BB-B323CD937A99} - - - {4ECDCA0C-BB38-0729-A6B6-2FB0B4D0863B} - - - {294E4CD5-B06F-97D1-04A3-51871CEA507C} - - - {77228F15-BD91-06FF-2C7E-0377D25C2C94} - - - {5CB531E6-BF9A-2C50-056C-EE5A525D28D3} - - - {E4EA47E5-B41C-2A19-1783-7E9104096ECD} - - - {B331BC33-9770-3DB5-73F2-BC2469ECCF7F} - - - {46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC} - - - {D90A8DF7-FBAB-D363-13C0-6707BB22B72B} - - - {8AE77C40-6839-EC37-4515-BD3CC269BCE4} - - - {0EAD99DB-011F-09E5-45A2-365F646EB004} - - - {F57590C6-3B90-1BE1-1006-488BA33E8BD9} - - - {7C319D73-0D93-5842-0874-398D2D3038D5} - - - {2CB4DB0C-DD3B-6195-D822-76EC7A5C88D2} - - - {FE3CB19C-EF43-5CF5-DAF0-09D4E43D0AB9} - - - {C0E5DD5D-F8F1-DD25-67D7-291946AB3828} - - - {FE7E6CD5-C7A0-DB20-4E7E-D6E7F08C4578} - - - {895C2D33-E08D-B1BA-BB36-FC4CA65090C8} - - - {D64A57DB-A956-5519-1929-1D929B56E1B0} - - - {5A99CC24-AC45-7ED6-C11A-B8B86E76D884} - - - {7A131EEC-25A7-22F6-2839-A2194DDF3007} - - - {EA9DB76C-CEF7-6BFC-2070-28B7DF8E8063} - - - {3C206A40-6F1B-E683-ACF1-DEC3703D0140} - - - {DF95D4BF-E18C-125A-5EBB-8993A06E232C} - - - {118946F2-AC24-0F09-62D5-753DF87A60CD} - - - {07329F9B-7D3D-CEB3-C771-714842076140} - - - {08BBBECB-B0D1-7611-37EC-F57E1D0CE2A2} - - - {268E8F2A-980C-BF2F-B161-AACABC9D91F3} - - - {A4D76113-9EDC-DA60-D89B-5BACF7F1C426} - - - {1A9221A3-E993-70B2-6EA2-8E1DB5FF646A} - - - {CC2DAD7A-5B45-62AB-4C54-6FE6B1AE86C3} - - - {599138A9-EA63-53DD-941F-ABE3412D2949} - - - {422A4014-8587-1AE6-584F-32A62613A37B} - - - {9FBFF5E5-56F1-34A1-2C85-F760DA2B1EB7} - - - {FE955B6B-68AC-AA07-70D8-2413F6DB65C8} - - - {7ED5A90E-41AF-A1EF-659B-37CEEAB9BA61} - - - - - AudioPluginHost\Source\Plugins - - - AudioPluginHost\Source\Plugins - - - AudioPluginHost\Source\Plugins - - - AudioPluginHost\Source\UI - - - AudioPluginHost\Source\UI - - - AudioPluginHost\Source - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\synthesisers - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\midi_io\ump - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\sampler - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\filter_design - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\utils - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_opengl - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - - - AudioPluginHost\Source\Plugins - - - AudioPluginHost\Source\Plugins - - - AudioPluginHost\Source\Plugins - - - AudioPluginHost\Source\UI - - - AudioPluginHost\Source\UI - - - AudioPluginHost\Source\UI - - - JUCE Modules\juce_audio_basics\audio_play_head - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\native - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\synthesisers - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\midi_io\ump - - - JUCE Modules\juce_audio_devices\midi_io\ump - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\coupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\coupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\floor - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\uncoupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\sampler - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\filter_design - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\utils - - - JUCE Modules\juce_opengl - - - JUCE Library Code - - - JUCE Library Code - - - - - AudioPluginHost\Source - - - AudioPluginHost\BinaryData - - - AudioPluginHost\BinaryData - - - AudioPluginHost\BinaryData - - - AudioPluginHost\BinaryData - - - AudioPluginHost\BinaryData - - - AudioPluginHost\BinaryData - - - JUCE Modules\juce_audio_devices\native\oboe - - - JUCE Modules\juce_audio_devices\native\oboe - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7 - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_core\native\java - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Library Code - - - - - JUCE Library Code - - - diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost.sln juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost.sln --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost.sln 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 14 - -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AudioPluginHost - App", "AudioPluginHost_App.vcxproj", "{5666EAA2-C82B-D06A-5228-D0E810428536}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5666EAA2-C82B-D06A-5228-D0E810428536}.Debug|x64.ActiveCfg = Debug|x64 - {5666EAA2-C82B-D06A-5228-D0E810428536}.Debug|x64.Build.0 = Debug|x64 - {5666EAA2-C82B-D06A-5228-D0E810428536}.Release|x64.ActiveCfg = Release|x64 - {5666EAA2-C82B-D06A-5228-D0E810428536}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal Binary files /tmp/tmp3xyzf76u/FU8JCLV1je/juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/icon.ico and /tmp/tmp3xyzf76u/WWZuZyRX_p/juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/icon.ico differ diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/resources.rc juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/resources.rc --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/resources.rc 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2015/resources.rc 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -#pragma code_page(65001) - -#ifdef JUCE_USER_DEFINED_RC_FILE - #include JUCE_USER_DEFINED_RC_FILE -#else - -#undef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#include - -VS_VERSION_INFO VERSIONINFO -FILEVERSION 1,0,0,0 -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "Raw Material Software Limited\0" - VALUE "LegalCopyright", "Raw Material Software Limited\0" - VALUE "FileDescription", "AudioPluginHost\0" - VALUE "FileVersion", "1.0.0\0" - VALUE "ProductName", "AudioPluginHost\0" - VALUE "ProductVersion", "1.0.0\0" - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif - -IDI_ICON1 ICON DISCARDABLE "icon.ico" -IDI_ICON2 ICON DISCARDABLE "icon.ico" \ No newline at end of file diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -105,8 +106,8 @@ Full - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -141,6 +143,7 @@ + @@ -159,13 +162,13 @@ true - + true - + true - + true @@ -276,7 +279,7 @@ true - + true @@ -645,6 +648,9 @@ true + + true + true @@ -678,6 +684,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -747,15 +870,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -789,6 +930,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -807,6 +966,9 @@ true + + true + true @@ -819,6 +981,12 @@ true + + true + + + true + true @@ -885,9 +1053,15 @@ true + + true + true + + true + true @@ -903,6 +1077,9 @@ true + + true + true @@ -969,6 +1146,9 @@ true + + true + true @@ -1965,6 +2145,9 @@ true + + true + true @@ -1992,9 +2175,6 @@ true - - true - true @@ -2257,7 +2437,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2272,6 +2456,7 @@ + @@ -2316,6 +2501,7 @@ + @@ -2504,6 +2690,7 @@ + @@ -2516,6 +2703,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2581,9 +2838,14 @@ + + + + + @@ -2604,6 +2866,11 @@ + + + + + @@ -2611,6 +2878,8 @@ + + @@ -2642,6 +2911,7 @@ + @@ -2650,6 +2920,8 @@ + + @@ -2858,6 +3130,7 @@ + @@ -3032,6 +3305,7 @@ + @@ -3055,6 +3329,7 @@ + @@ -3125,7 +3400,7 @@ - + @@ -3168,6 +3443,7 @@ + diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -149,6 +149,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -203,6 +329,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -496,6 +625,9 @@ + + AudioPluginHost\Source\Plugins + AudioPluginHost\Source\Plugins @@ -526,13 +658,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -646,8 +778,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1021,6 +1153,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1057,6 +1192,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1126,6 +1378,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1135,9 +1393,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1171,6 +1441,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1189,6 +1477,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1204,6 +1495,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1285,9 +1582,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1303,6 +1606,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1369,6 +1675,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2410,6 +2719,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2446,9 +2758,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2767,6 +3076,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -2799,6 +3114,9 @@ + + AudioPluginHost\Source\Plugins + AudioPluginHost\Source\Plugins @@ -2931,6 +3249,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3495,6 +3816,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3531,6 +3855,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3726,6 +4260,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3735,6 +4275,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3795,6 +4344,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3816,6 +4380,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -3909,6 +4479,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -3933,6 +4506,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4557,6 +5136,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5079,6 +5661,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -5148,6 +5733,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5358,7 +5946,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -5483,6 +6071,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -105,8 +106,8 @@ Full - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -141,6 +143,7 @@ + @@ -159,13 +162,13 @@ true - + true - + true - + true @@ -276,7 +279,7 @@ true - + true @@ -645,6 +648,9 @@ true + + true + true @@ -678,6 +684,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -747,15 +870,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -789,6 +930,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -807,6 +966,9 @@ true + + true + true @@ -819,6 +981,12 @@ true + + true + + + true + true @@ -885,9 +1053,15 @@ true + + true + true + + true + true @@ -903,6 +1077,9 @@ true + + true + true @@ -969,6 +1146,9 @@ true + + true + true @@ -1965,6 +2145,9 @@ true + + true + true @@ -1992,9 +2175,6 @@ true - - true - true @@ -2257,7 +2437,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2272,6 +2456,7 @@ + @@ -2316,6 +2501,7 @@ + @@ -2504,6 +2690,7 @@ + @@ -2516,6 +2703,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2581,9 +2838,14 @@ + + + + + @@ -2604,6 +2866,11 @@ + + + + + @@ -2611,6 +2878,8 @@ + + @@ -2642,6 +2911,7 @@ + @@ -2650,6 +2920,8 @@ + + @@ -2858,6 +3130,7 @@ + @@ -3032,6 +3305,7 @@ + @@ -3055,6 +3329,7 @@ + @@ -3125,7 +3400,7 @@ - + @@ -3168,6 +3443,7 @@ + diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -149,6 +149,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -203,6 +329,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -496,6 +625,9 @@ + + AudioPluginHost\Source\Plugins + AudioPluginHost\Source\Plugins @@ -526,13 +658,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -646,8 +778,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1021,6 +1153,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1057,6 +1192,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1126,6 +1378,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1135,9 +1393,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1171,6 +1441,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1189,6 +1477,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1204,6 +1495,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1285,9 +1582,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1303,6 +1606,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1369,6 +1675,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2410,6 +2719,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2446,9 +2758,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2767,6 +3076,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -2799,6 +3114,9 @@ + + AudioPluginHost\Source\Plugins + AudioPluginHost\Source\Plugins @@ -2931,6 +3249,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3495,6 +3816,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3531,6 +3855,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3726,6 +4260,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3735,6 +4275,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3795,6 +4344,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3816,6 +4380,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -3909,6 +4479,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -3933,6 +4506,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4557,6 +5136,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5079,6 +5661,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -5148,6 +5733,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5358,7 +5946,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -5483,6 +6071,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -105,8 +106,8 @@ Full - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -141,6 +143,7 @@ + @@ -159,13 +162,13 @@ true - + true - + true - + true @@ -276,7 +279,7 @@ true - + true @@ -645,6 +648,9 @@ true + + true + true @@ -678,6 +684,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -747,15 +870,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -789,6 +930,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -807,6 +966,9 @@ true + + true + true @@ -819,6 +981,12 @@ true + + true + + + true + true @@ -885,9 +1053,15 @@ true + + true + true + + true + true @@ -903,6 +1077,9 @@ true + + true + true @@ -969,6 +1146,9 @@ true + + true + true @@ -1965,6 +2145,9 @@ true + + true + true @@ -1992,9 +2175,6 @@ true - - true - true @@ -2257,7 +2437,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2272,6 +2456,7 @@ + @@ -2316,6 +2501,7 @@ + @@ -2504,6 +2690,7 @@ + @@ -2516,6 +2703,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2581,9 +2838,14 @@ + + + + + @@ -2604,6 +2866,11 @@ + + + + + @@ -2611,6 +2878,8 @@ + + @@ -2642,6 +2911,7 @@ + @@ -2650,6 +2920,8 @@ + + @@ -2858,6 +3130,7 @@ + @@ -3032,6 +3305,7 @@ + @@ -3055,6 +3329,7 @@ + @@ -3125,7 +3400,7 @@ - + @@ -3168,6 +3443,7 @@ + diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters --- juce-6.1.5~ds0/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -149,6 +149,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -203,6 +329,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -496,6 +625,9 @@ + + AudioPluginHost\Source\Plugins + AudioPluginHost\Source\Plugins @@ -526,13 +658,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -646,8 +778,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1021,6 +1153,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1057,6 +1192,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1126,6 +1378,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1135,9 +1393,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1171,6 +1441,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1189,6 +1477,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1204,6 +1495,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1285,9 +1582,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1303,6 +1606,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1369,6 +1675,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2410,6 +2719,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2446,9 +2758,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2767,6 +3076,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -2799,6 +3114,9 @@ + + AudioPluginHost\Source\Plugins + AudioPluginHost\Source\Plugins @@ -2931,6 +3249,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3495,6 +3816,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3531,6 +3855,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3726,6 +4260,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3735,6 +4275,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3795,6 +4344,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3816,6 +4380,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -3909,6 +4479,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -3933,6 +4506,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4557,6 +5136,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5079,6 +5661,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -5148,6 +5733,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5358,7 +5946,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -5483,6 +6071,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/CMakeLists.txt juce-7.0.0~ds0/extras/AudioPluginHost/CMakeLists.txt --- juce-6.1.5~ds0/extras/AudioPluginHost/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -31,6 +31,7 @@ target_sources(AudioPluginHost PRIVATE Source/HostStartup.cpp + Source/Plugins/ARAPlugin.cpp Source/Plugins/IOConfigurationWindow.cpp Source/Plugins/InternalPlugins.cpp Source/Plugins/PluginGraph.cpp @@ -46,12 +47,14 @@ ../../examples/Assets/singing.ogg) target_compile_definitions(AudioPluginHost PRIVATE - PIP_JUCE_EXAMPLES_DIRECTORY_STRING="${JUCE_SOURCE_DIR}/examples" JUCE_ALSA=1 JUCE_DIRECTSOUND=1 + JUCE_DISABLE_CAUTIOUS_PARAMETER_ID_CHECKING=1 JUCE_PLUGINHOST_LADSPA=1 + JUCE_PLUGINHOST_LV2=1 JUCE_PLUGINHOST_VST3=1 JUCE_PLUGINHOST_VST=0 + JUCE_PLUGINHOST_ARA=0 JUCE_USE_CAMERA=0 JUCE_USE_CDBURNER=0 JUCE_USE_CDREADER=0 @@ -60,7 +63,8 @@ JUCE_USE_OGGVORBIS=1 JUCE_VST3_HOST_CROSS_PLATFORM_UID=1 JUCE_WASAPI=1 - JUCE_WEB_BROWSER=0) + JUCE_WEB_BROWSER=0 + PIP_JUCE_EXAMPLES_DIRECTORY_STRING="${JUCE_SOURCE_DIR}/examples") target_link_libraries(AudioPluginHost PRIVATE AudioPluginHostData diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/JuceLibraryCode/BinaryData.cpp juce-7.0.0~ds0/extras/AudioPluginHost/JuceLibraryCode/BinaryData.cpp --- juce-6.1.5~ds0/extras/AudioPluginHost/JuceLibraryCode/BinaryData.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/JuceLibraryCode/BinaryData.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -4,6 +4,8 @@ */ +#include + namespace BinaryData { @@ -10986,10 +10988,8 @@ const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8) { for (unsigned int i = 0; i < (sizeof (namedResourceList) / sizeof (namedResourceList[0])); ++i) - { - if (namedResourceList[i] == resourceNameUTF8) + if (strcmp (namedResourceList[i], resourceNameUTF8) == 0) return originalFilenames[i]; - } return nullptr; } diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_ara.cpp juce-7.0.0~ds0/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_ara.cpp --- juce-6.1.5~ds0/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_ara.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_ara.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp juce-7.0.0~ds0/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp --- juce-6.1.5~ds0/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/HostStartup.cpp juce-7.0.0~ds0/extras/AudioPluginHost/Source/HostStartup.cpp --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/HostStartup.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/HostStartup.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -45,12 +45,18 @@ private: void handleMessageFromCoordinator (const MemoryBlock& mb) override { + if (mb.isEmpty()) + return; + + if (! doScan (mb)) { - const std::lock_guard lock (mutex); - pendingBlocks.emplace (mb); - } + { + const std::lock_guard lock (mutex); + pendingBlocks.emplace (mb); + } - triggerAsyncUpdate(); + triggerAsyncUpdate(); + } } void handleConnectionLost() override @@ -58,7 +64,6 @@ JUCEApplicationBase::quit(); } - // It's important to run the plugin scan on the main thread! void handleAsyncUpdate() override { for (;;) @@ -78,30 +83,59 @@ if (block.isEmpty()) return; - MemoryInputStream stream { block, false }; - const auto formatName = stream.readString(); - const auto identifier = stream.readString(); + doScan (block); + } + } + + bool doScan (const MemoryBlock& block) + { + MemoryInputStream stream { block, false }; + const auto formatName = stream.readString(); + const auto identifier = stream.readString(); - OwnedArray results; + PluginDescription pd; + pd.fileOrIdentifier = identifier; + pd.uniqueId = pd.deprecatedUid = 0; + const auto matchingFormat = [&]() -> AudioPluginFormat* + { for (auto* format : formatManager.getFormats()) if (format->getName() == formatName) - format->findAllTypesForFile (results, identifier); + return format; - XmlElement xml ("LIST"); + return nullptr; + }(); - for (const auto& desc : results) - xml.addChildElement (desc->createXml().release()); - - const auto str = xml.toString(); - sendMessageToCoordinator ({ str.toRawUTF8(), str.getNumBytesAsUTF8() }); + if (matchingFormat == nullptr + || (! MessageManager::getInstance()->isThisTheMessageThread() + && ! matchingFormat->requiresUnblockedMessageThreadDuringCreation (pd))) + { + return false; } + + OwnedArray results; + matchingFormat->findAllTypesForFile (results, identifier); + sendPluginDescriptions (results); + return true; } - AudioPluginFormatManager formatManager; + void sendPluginDescriptions (const OwnedArray& results) + { + XmlElement xml ("LIST"); + + for (const auto& desc : results) + xml.addChildElement (desc->createXml().release()); + + const auto str = xml.toString(); + sendMessageToCoordinator ({ str.toRawUTF8(), str.getNumBytesAsUTF8() }); + } std::mutex mutex; std::queue pendingBlocks; + + // After construction, this will only be accessed by doScan so there's no need + // to worry about synchronisation. + AudioPluginFormatManager formatManager; }; //============================================================================== @@ -132,7 +166,6 @@ appProperties->setStorageParameters (options); mainWindow.reset (new MainHostWindow()); - mainWindow->setUsingNativeTitleBar (true); commandManager.registerAllCommandsForTarget (this); commandManager.registerAllCommandsForTarget (mainWindow.get()); @@ -307,7 +340,8 @@ static bool isAutoScaleAvailableForPlugin (const PluginDescription& description) { return autoScaleOptionAvailable - && description.pluginFormatName.containsIgnoreCase ("VST"); + && (description.pluginFormatName.containsIgnoreCase ("VST") + || description.pluginFormatName.containsIgnoreCase ("LV2")); } bool shouldAutoScalePlugin (const PluginDescription& description) diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,33 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "ARAPlugin.h" + +#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + +const Identifier ARAPluginInstanceWrapper::ARATestHost::Context::xmlRootTag { "ARATestHostContext" }; +const Identifier ARAPluginInstanceWrapper::ARATestHost::Context::xmlAudioFileAttrib { "AudioFile" }; + +#endif diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/ARAPlugin.h juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/ARAPlugin.h --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/ARAPlugin.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/ARAPlugin.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1405 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#pragma once + +#include + +#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + +#include + +#include +#include + +class FileAudioSource +{ + auto getAudioSourceProperties() const + { + auto properties = ARAHostModel::AudioSource::getEmptyProperties(); + properties.name = formatReader->getFile().getFullPathName().toRawUTF8(); + properties.persistentID = formatReader->getFile().getFullPathName().toRawUTF8(); + properties.sampleCount = formatReader->lengthInSamples; + properties.sampleRate = formatReader->sampleRate; + properties.channelCount = (int) formatReader->numChannels; + properties.merits64BitSamples = false; + return properties; + } + +public: + FileAudioSource (ARA::Host::DocumentController& dc, const juce::File& file) + : formatReader ([&file] + { + auto result = rawToUniquePtr (WavAudioFormat().createMemoryMappedReader (file)); + result->mapEntireFile(); + return result; + }()), + audioSource (Converter::toHostRef (this), dc, getAudioSourceProperties()) + { + audioSource.enableAudioSourceSamplesAccess (true); + } + + bool readAudioSamples (float* const* buffers, int64 startSample, int64 numSamples) + { + // TODO: the ARA interface defines numSamples as int64. We should do multiple reads if necessary with the reader. + if (numSamples > std::numeric_limits::max()) + return false; + + return formatReader->read (buffers, (int) formatReader->numChannels, startSample, (int) (numSamples)); + } + + bool readAudioSamples (double* const* buffers, int64 startSample, int64 numSamples) + { + ignoreUnused (buffers, startSample, numSamples); + return false; + } + + MemoryMappedAudioFormatReader& getFormatReader() const { return *formatReader; } + + auto getPluginRef() const { return audioSource.getPluginRef(); } + + auto& getSource() { return audioSource; } + + using Converter = ARAHostModel::ConversionFunctions; + +private: + std::unique_ptr formatReader; + ARAHostModel::AudioSource audioSource; +}; + +//============================================================================== +class MusicalContext +{ + auto getMusicalContextProperties() const + { + auto properties = ARAHostModel::MusicalContext::getEmptyProperties(); + properties.name = "MusicalContext"; + properties.orderIndex = 0; + properties.color = nullptr; + return properties; + } + +public: + MusicalContext (ARA::Host::DocumentController& dc) + : context (Converter::toHostRef (this), dc, getMusicalContextProperties()) + { + } + + auto getPluginRef() const { return context.getPluginRef(); } + +private: + using Converter = ARAHostModel::ConversionFunctions; + + ARAHostModel::MusicalContext context; +}; + +//============================================================================== +class RegionSequence +{ + auto getRegionSequenceProperties() const + { + auto properties = ARAHostModel::RegionSequence::getEmptyProperties(); + properties.name = name.toRawUTF8(); + properties.orderIndex = 0; + properties.musicalContextRef = context.getPluginRef(); + properties.color = nullptr; + return properties; + } + +public: + RegionSequence (ARA::Host::DocumentController& dc, MusicalContext& contextIn, String nameIn) + : context (contextIn), + name (std::move (nameIn)), + sequence (Converter::toHostRef (this), dc, getRegionSequenceProperties()) + { + } + + auto& getMusicalContext() const { return context; } + auto getPluginRef() const { return sequence.getPluginRef(); } + +private: + using Converter = ARAHostModel::ConversionFunctions; + + MusicalContext& context; + String name; + ARAHostModel::RegionSequence sequence; +}; + +class AudioModification +{ + auto getProperties() const + { + auto properties = ARAHostModel::AudioModification::getEmptyProperties(); + properties.persistentID = "x"; + return properties; + } + +public: + AudioModification (ARA::Host::DocumentController& dc, FileAudioSource& source) + : modification (Converter::toHostRef (this), dc, source.getSource(), getProperties()) + { + } + + auto& getModification() { return modification; } + +private: + using Converter = ARAHostModel::ConversionFunctions; + + ARAHostModel::AudioModification modification; +}; + +//============================================================================== +class PlaybackRegion +{ + auto getPlaybackRegionProperties() const + { + auto properties = ARAHostModel::PlaybackRegion::getEmptyProperties(); + properties.transformationFlags = ARA::kARAPlaybackTransformationNoChanges; + properties.startInModificationTime = 0.0; + const auto& formatReader = audioSource.getFormatReader(); + properties.durationInModificationTime = formatReader.lengthInSamples / formatReader.sampleRate; + properties.startInPlaybackTime = 0.0; + properties.durationInPlaybackTime = properties.durationInModificationTime; + properties.musicalContextRef = sequence.getMusicalContext().getPluginRef(); + properties.regionSequenceRef = sequence.getPluginRef(); + + properties.name = nullptr; + properties.color = nullptr; + return properties; + } + +public: + PlaybackRegion (ARA::Host::DocumentController& dc, + RegionSequence& s, + AudioModification& m, + FileAudioSource& source) + : sequence (s), + audioSource (source), + region (Converter::toHostRef (this), dc, m.getModification(), getPlaybackRegionProperties()) + { + jassert (source.getPluginRef() == m.getModification().getAudioSource().getPluginRef()); + } + + auto& getPlaybackRegion() { return region; } + +private: + using Converter = ARAHostModel::ConversionFunctions; + + RegionSequence& sequence; + FileAudioSource& audioSource; + ARAHostModel::PlaybackRegion region; +}; + +//============================================================================== +class AudioAccessController : public ARA::Host::AudioAccessControllerInterface +{ +public: + ARA::ARAAudioReaderHostRef createAudioReaderForSource (ARA::ARAAudioSourceHostRef audioSourceHostRef, + bool use64BitSamples) noexcept override + { + auto audioReader = std::make_unique (audioSourceHostRef, use64BitSamples); + auto audioReaderHostRef = Converter::toHostRef (audioReader.get()); + auto* readerPtr = audioReader.get(); + audioReaders.emplace (readerPtr, std::move (audioReader)); + return audioReaderHostRef; + } + + bool readAudioSamples (ARA::ARAAudioReaderHostRef readerRef, + ARA::ARASamplePosition samplePosition, + ARA::ARASampleCount samplesPerChannel, + void* const* buffers) noexcept override + { + const auto use64BitSamples = Converter::fromHostRef (readerRef)->use64Bit; + auto* audioSource = FileAudioSource::Converter::fromHostRef (Converter::fromHostRef (readerRef)->sourceHostRef); + + if (use64BitSamples) + return audioSource->readAudioSamples ( + reinterpret_cast (buffers), samplePosition, samplesPerChannel); + + return audioSource->readAudioSamples ( + reinterpret_cast (buffers), samplePosition, samplesPerChannel); + } + + void destroyAudioReader (ARA::ARAAudioReaderHostRef readerRef) noexcept override + { + audioReaders.erase (Converter::fromHostRef (readerRef)); + } + +private: + struct AudioReader + { + AudioReader (ARA::ARAAudioSourceHostRef source, bool use64BitSamples) + : sourceHostRef (source), use64Bit (use64BitSamples) + { + } + + ARA::ARAAudioSourceHostRef sourceHostRef; + bool use64Bit; + }; + + using Converter = ARAHostModel::ConversionFunctions; + + std::map> audioReaders; +}; + +class ArchivingController : public ARA::Host::ArchivingControllerInterface +{ +public: + using ReaderConverter = ARAHostModel::ConversionFunctions; + using WriterConverter = ARAHostModel::ConversionFunctions; + + ARA::ARASize getArchiveSize (ARA::ARAArchiveReaderHostRef archiveReaderHostRef) noexcept override + { + return (ARA::ARASize) ReaderConverter::fromHostRef (archiveReaderHostRef)->getSize(); + } + + bool readBytesFromArchive (ARA::ARAArchiveReaderHostRef archiveReaderHostRef, + ARA::ARASize position, + ARA::ARASize length, + ARA::ARAByte* buffer) noexcept override + { + auto* archiveReader = ReaderConverter::fromHostRef (archiveReaderHostRef); + + if ((position + length) <= archiveReader->getSize()) + { + std::memcpy (buffer, addBytesToPointer (archiveReader->getData(), position), length); + return true; + } + + return false; + } + + bool writeBytesToArchive (ARA::ARAArchiveWriterHostRef archiveWriterHostRef, + ARA::ARASize position, + ARA::ARASize length, + const ARA::ARAByte* buffer) noexcept override + { + auto* archiveWriter = WriterConverter::fromHostRef (archiveWriterHostRef); + + if (archiveWriter->setPosition ((int64) position) && archiveWriter->write (buffer, length)) + return true; + + return false; + } + + void notifyDocumentArchivingProgress (float value) noexcept override { ignoreUnused (value); } + + void notifyDocumentUnarchivingProgress (float value) noexcept override { ignoreUnused (value); } + + ARA::ARAPersistentID getDocumentArchiveID (ARA::ARAArchiveReaderHostRef archiveReaderHostRef) noexcept override + { + ignoreUnused (archiveReaderHostRef); + + return nullptr; + } +}; + +class ContentAccessController : public ARA::Host::ContentAccessControllerInterface +{ +public: + using Converter = ARAHostModel::ConversionFunctions; + + bool isMusicalContextContentAvailable (ARA::ARAMusicalContextHostRef musicalContextHostRef, + ARA::ARAContentType type) noexcept override + { + ignoreUnused (musicalContextHostRef); + + return (type == ARA::kARAContentTypeTempoEntries || type == ARA::kARAContentTypeBarSignatures); + } + + ARA::ARAContentGrade getMusicalContextContentGrade (ARA::ARAMusicalContextHostRef musicalContextHostRef, + ARA::ARAContentType type) noexcept override + { + ignoreUnused (musicalContextHostRef, type); + + return ARA::kARAContentGradeInitial; + } + + ARA::ARAContentReaderHostRef + createMusicalContextContentReader (ARA::ARAMusicalContextHostRef musicalContextHostRef, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept override + { + ignoreUnused (musicalContextHostRef, range); + + return Converter::toHostRef (type); + } + + bool isAudioSourceContentAvailable (ARA::ARAAudioSourceHostRef audioSourceHostRef, + ARA::ARAContentType type) noexcept override + { + ignoreUnused (audioSourceHostRef, type); + + return false; + } + + ARA::ARAContentGrade getAudioSourceContentGrade (ARA::ARAAudioSourceHostRef audioSourceHostRef, + ARA::ARAContentType type) noexcept override + { + ignoreUnused (audioSourceHostRef, type); + + return 0; + } + + ARA::ARAContentReaderHostRef + createAudioSourceContentReader (ARA::ARAAudioSourceHostRef audioSourceHostRef, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept override + { + ignoreUnused (audioSourceHostRef, type, range); + + return nullptr; + } + + ARA::ARAInt32 getContentReaderEventCount (ARA::ARAContentReaderHostRef contentReaderHostRef) noexcept override + { + const auto contentType = Converter::fromHostRef (contentReaderHostRef); + + if (contentType == ARA::kARAContentTypeTempoEntries || contentType == ARA::kARAContentTypeBarSignatures) + return 2; + + return 0; + } + + const void* getContentReaderDataForEvent (ARA::ARAContentReaderHostRef contentReaderHostRef, + ARA::ARAInt32 eventIndex) noexcept override + { + if (Converter::fromHostRef (contentReaderHostRef) == ARA::kARAContentTypeTempoEntries) + { + if (eventIndex == 0) + { + tempoEntry.timePosition = 0.0; + tempoEntry.quarterPosition = 0.0; + } + else if (eventIndex == 1) + { + tempoEntry.timePosition = 2.0; + tempoEntry.quarterPosition = 4.0; + } + + return &tempoEntry; + } + else if (Converter::fromHostRef (contentReaderHostRef) == ARA::kARAContentTypeBarSignatures) + { + if (eventIndex == 0) + { + barSignature.position = 0.0; + barSignature.numerator = 4; + barSignature.denominator = 4; + } + + if (eventIndex == 1) + { + barSignature.position = 1.0; + barSignature.numerator = 4; + barSignature.denominator = 4; + } + + return &barSignature; + } + + jassertfalse; + return nullptr; + } + + void destroyContentReader (ARA::ARAContentReaderHostRef contentReaderHostRef) noexcept override + { + ignoreUnused (contentReaderHostRef); + } + + ARA::ARAContentTempoEntry tempoEntry; + ARA::ARAContentBarSignature barSignature; +}; + +class ModelUpdateController : public ARA::Host::ModelUpdateControllerInterface +{ +public: + void notifyAudioSourceAnalysisProgress (ARA::ARAAudioSourceHostRef audioSourceHostRef, + ARA::ARAAnalysisProgressState state, + float value) noexcept override + { + ignoreUnused (audioSourceHostRef, state, value); + } + + void notifyAudioSourceContentChanged (ARA::ARAAudioSourceHostRef audioSourceHostRef, + const ARA::ARAContentTimeRange* range, + ARA::ContentUpdateScopes scopeFlags) noexcept override + { + ignoreUnused (audioSourceHostRef, range, scopeFlags); + } + + void notifyAudioModificationContentChanged (ARA::ARAAudioModificationHostRef audioModificationHostRef, + const ARA::ARAContentTimeRange* range, + ARA::ContentUpdateScopes scopeFlags) noexcept override + { + ignoreUnused (audioModificationHostRef, range, scopeFlags); + } + + void notifyPlaybackRegionContentChanged (ARA::ARAPlaybackRegionHostRef playbackRegionHostRef, + const ARA::ARAContentTimeRange* range, + ARA::ContentUpdateScopes scopeFlags) noexcept override + { + ignoreUnused (playbackRegionHostRef, range, scopeFlags); + } +}; + +class PlaybackController : public ARA::Host::PlaybackControllerInterface +{ +public: + void requestStartPlayback() noexcept override {} + void requestStopPlayback() noexcept override {} + + void requestSetPlaybackPosition (ARA::ARATimePosition timePosition) noexcept override + { + ignoreUnused (timePosition); + } + + void requestSetCycleRange (ARA::ARATimePosition startTime, ARA::ARATimeDuration duration) noexcept override + { + ignoreUnused (startTime, duration); + } + + void requestEnableCycle (bool enable) noexcept override { ignoreUnused (enable); } +}; + +struct SimplePlayHead : public juce::AudioPlayHead +{ + Optional getPosition() const override + { + PositionInfo result; + result.setTimeInSamples (timeInSamples.load()); + result.setIsPlaying (isPlaying.load()); + return result; + } + + std::atomic timeInSamples { 0 }; + std::atomic isPlaying { false }; +}; + +struct HostPlaybackController +{ + virtual ~HostPlaybackController() = default; + + virtual void setPlaying (bool isPlaying) = 0; + virtual void goToStart() = 0; + virtual File getAudioSource() const = 0; + virtual void setAudioSource (File audioSourceFile) = 0; + virtual void clearAudioSource() = 0; +}; + +class AudioSourceComponent : public Component, + public FileDragAndDropTarget, + public ChangeListener +{ +public: + explicit AudioSourceComponent (HostPlaybackController& controller, juce::ChangeBroadcaster& bc) + : hostPlaybackController (controller), + broadcaster (bc), + waveformComponent (*this) + { + audioSourceLabel.setText ("You can drag and drop .wav files here", NotificationType::dontSendNotification); + + addAndMakeVisible (audioSourceLabel); + addAndMakeVisible (waveformComponent); + + playButton.setButtonText ("Play / Pause"); + playButton.onClick = [this] + { + isPlaying = ! isPlaying; + hostPlaybackController.setPlaying (isPlaying); + }; + + goToStartButton.setButtonText ("Go to start"); + goToStartButton.onClick = [this] { hostPlaybackController.goToStart(); }; + + addAndMakeVisible (goToStartButton); + addAndMakeVisible (playButton); + + broadcaster.addChangeListener (this); + + update(); + } + + ~AudioSourceComponent() override + { + broadcaster.removeChangeListener (this); + } + + void changeListenerCallback (ChangeBroadcaster*) override + { + update(); + } + + void resized() override + { + auto localBounds = getLocalBounds(); + auto buttonsArea = localBounds.removeFromBottom (40).reduced (5); + auto waveformArea = localBounds.removeFromBottom (150).reduced (5); + + juce::FlexBox fb; + fb.justifyContent = juce::FlexBox::JustifyContent::center; + fb.alignContent = juce::FlexBox::AlignContent::center; + + fb.items = { juce::FlexItem (goToStartButton).withMinWidth (100.0f).withMinHeight ((float) buttonsArea.getHeight()), + juce::FlexItem (playButton).withMinWidth (100.0f).withMinHeight ((float) buttonsArea.getHeight()) }; + + fb.performLayout (buttonsArea); + + waveformComponent.setBounds (waveformArea); + + audioSourceLabel.setBounds (localBounds); + } + + bool isInterestedInFileDrag (const StringArray& files) override + { + if (files.size() != 1) + return false; + + if (files.getReference (0).endsWithIgnoreCase (".wav")) + return true; + + return false; + } + + void update() + { + const auto currentAudioSource = hostPlaybackController.getAudioSource(); + + if (currentAudioSource.existsAsFile()) + { + waveformComponent.setSource (currentAudioSource); + audioSourceLabel.setText (currentAudioSource.getFullPathName(), + NotificationType::dontSendNotification); + } + else + { + waveformComponent.clearSource(); + audioSourceLabel.setText ("You can drag and drop .wav files here", NotificationType::dontSendNotification); + } + } + + void filesDropped (const StringArray& files, int, int) override + { + hostPlaybackController.setAudioSource (files.getReference (0)); + update(); + } + +private: + class WaveformComponent : public Component, + public ChangeListener + { + public: + WaveformComponent (AudioSourceComponent& p) + : parent (p), + thumbCache (7), + audioThumb (128, formatManager, thumbCache) + { + setWantsKeyboardFocus (true); + formatManager.registerBasicFormats(); + audioThumb.addChangeListener (this); + } + + ~WaveformComponent() override + { + audioThumb.removeChangeListener (this); + } + + void mouseDown (const MouseEvent&) override + { + isSelected = true; + repaint(); + } + + void changeListenerCallback (ChangeBroadcaster*) override + { + repaint(); + } + + void paint (juce::Graphics& g) override + { + if (! isEmpty) + { + auto rect = getLocalBounds(); + + const auto waveformColour = Colours::cadetblue; + + if (rect.getWidth() > 2) + { + g.setColour (isSelected ? juce::Colours::yellow : juce::Colours::black); + g.drawRect (rect); + rect.reduce (1, 1); + g.setColour (waveformColour.darker (1.0f)); + g.fillRect (rect); + } + + g.setColour (Colours::cadetblue); + audioThumb.drawChannels (g, rect, 0.0, audioThumb.getTotalLength(), 1.0f); + } + } + + void setSource (const File& source) + { + isEmpty = false; + audioThumb.setSource (new FileInputSource (source)); + } + + void clearSource() + { + isEmpty = true; + isSelected = false; + audioThumb.clear(); + } + + bool keyPressed (const KeyPress& key) override + { + if (isSelected && key == KeyPress::deleteKey) + { + parent.hostPlaybackController.clearAudioSource(); + return true; + } + + return false; + } + + private: + AudioSourceComponent& parent; + + bool isEmpty = true; + bool isSelected = false; + AudioFormatManager formatManager; + AudioThumbnailCache thumbCache; + AudioThumbnail audioThumb; + }; + + HostPlaybackController& hostPlaybackController; + juce::ChangeBroadcaster& broadcaster; + Label audioSourceLabel; + WaveformComponent waveformComponent; + bool isPlaying { false }; + TextButton playButton, goToStartButton; +}; + +class ARAPluginInstanceWrapper : public AudioPluginInstance +{ +public: + class ARATestHost : public HostPlaybackController, + public juce::ChangeBroadcaster + { + public: + class Editor : public AudioProcessorEditor + { + public: + explicit Editor (ARATestHost& araTestHost) + : AudioProcessorEditor (araTestHost.getAudioPluginInstance()), + audioSourceComponent (araTestHost, araTestHost) + { + audioSourceComponent.update(); + addAndMakeVisible (audioSourceComponent); + setSize (512, 220); + } + + ~Editor() override { getAudioProcessor()->editorBeingDeleted (this); } + + void resized() override { audioSourceComponent.setBounds (getLocalBounds()); } + + private: + AudioSourceComponent audioSourceComponent; + }; + + explicit ARATestHost (ARAPluginInstanceWrapper& instanceIn) + : instance (instanceIn) + { + if (instance.inner->getPluginDescription().hasARAExtension) + { + instance.inner->setPlayHead (&playHead); + + createARAFactoryAsync (*instance.inner, [this] (ARAFactoryWrapper araFactory) + { + init (std::move (araFactory)); + }); + } + } + + void init (ARAFactoryWrapper araFactory) + { + if (araFactory.get() != nullptr) + { + documentController = ARAHostDocumentController::create (std::move (araFactory), + "AudioPluginHostDocument", + std::make_unique(), + std::make_unique(), + std::make_unique(), + std::make_unique(), + std::make_unique()); + + if (documentController != nullptr) + { + const auto allRoles = ARA::kARAPlaybackRendererRole | ARA::kARAEditorRendererRole | ARA::kARAEditorViewRole; + const auto plugInExtensionInstance = documentController->bindDocumentToPluginInstance (*instance.inner, + allRoles, + allRoles); + playbackRenderer = plugInExtensionInstance.getPlaybackRendererInterface(); + editorRenderer = plugInExtensionInstance.getEditorRendererInterface(); + synchronizeStateWithDocumentController(); + } + else + jassertfalse; + } + else + jassertfalse; + } + + void getStateInformation (juce::MemoryBlock& b) + { + std::lock_guard configurationLock (instance.innerMutex); + + if (context != nullptr) + context->getStateInformation (b); + } + + void setStateInformation (const void* d, int s) + { + { + std::lock_guard lock { contextUpdateSourceMutex }; + contextUpdateSource = ContextUpdateSource { d, s }; + } + + synchronise(); + } + + ~ARATestHost() override { instance.inner->releaseResources(); } + + void afterProcessBlock (int numSamples) + { + const auto isPlayingNow = isPlaying.load(); + playHead.isPlaying.store (isPlayingNow); + + if (isPlayingNow) + { + const auto currentAudioSourceLength = audioSourceLength.load(); + const auto currentPlayHeadPosition = playHead.timeInSamples.load(); + + // Rudimentary attempt to not seek beyond our sample data, assuming a fairly stable numSamples + // value. We should gain control over calling the AudioProcessorGraph's processBlock() calls so + // that we can do sample precise looping. + if (currentAudioSourceLength - currentPlayHeadPosition < numSamples) + playHead.timeInSamples.store (0); + else + playHead.timeInSamples.fetch_add (numSamples); + } + + if (goToStartSignal.exchange (false)) + playHead.timeInSamples.store (0); + } + + File getAudioSource() const override + { + std::lock_guard lock { instance.innerMutex }; + + if (context != nullptr) + return context->audioFile; + + return {}; + } + + void setAudioSource (File audioSourceFile) override + { + if (audioSourceFile.existsAsFile()) + { + { + std::lock_guard lock { contextUpdateSourceMutex }; + contextUpdateSource = ContextUpdateSource (std::move (audioSourceFile)); + } + + synchronise(); + } + } + + void clearAudioSource() override + { + { + std::lock_guard lock { contextUpdateSourceMutex }; + contextUpdateSource = ContextUpdateSource (ContextUpdateSource::Type::reset); + } + + synchronise(); + } + + void setPlaying (bool isPlayingIn) override { isPlaying.store (isPlayingIn); } + + void goToStart() override { goToStartSignal.store (true); } + + Editor* createEditor() { return new Editor (*this); } + + AudioPluginInstance& getAudioPluginInstance() { return instance; } + + private: + /** Use this to put the plugin in an unprepared state for the duration of adding and removing PlaybackRegions + to and from Renderers. + */ + class ScopedPluginDeactivator + { + public: + explicit ScopedPluginDeactivator (ARAPluginInstanceWrapper& inst) : instance (inst) + { + if (instance.prepareToPlayParams.isValid) + instance.inner->releaseResources(); + } + + ~ScopedPluginDeactivator() + { + if (instance.prepareToPlayParams.isValid) + instance.inner->prepareToPlay (instance.prepareToPlayParams.sampleRate, + instance.prepareToPlayParams.samplesPerBlock); + } + + private: + ARAPluginInstanceWrapper& instance; + + JUCE_DECLARE_NON_COPYABLE (ScopedPluginDeactivator) + }; + + class ContextUpdateSource + { + public: + enum class Type + { + empty, + audioSourceFile, + stateInformation, + reset + }; + + ContextUpdateSource() = default; + + explicit ContextUpdateSource (const File& file) + : type (Type::audioSourceFile), + audioSourceFile (file) + { + } + + ContextUpdateSource (const void* d, int s) + : type (Type::stateInformation), + stateInformation (d, (size_t) s) + { + } + + ContextUpdateSource (Type t) : type (t) + { + jassert (t == Type::reset); + } + + Type getType() const { return type; } + + const File& getAudioSourceFile() const + { + jassert (type == Type::audioSourceFile); + + return audioSourceFile; + } + + const MemoryBlock& getStateInformation() const + { + jassert (type == Type::stateInformation); + + return stateInformation; + } + + private: + Type type = Type::empty; + + File audioSourceFile; + MemoryBlock stateInformation; + }; + + void synchronise() + { + const SpinLock::ScopedLockType scope (instance.innerProcessBlockFlag); + std::lock_guard configurationLock (instance.innerMutex); + synchronizeStateWithDocumentController(); + } + + void synchronizeStateWithDocumentController() + { + bool resetContext = false; + + auto newContext = [&]() -> std::unique_ptr + { + std::lock_guard lock { contextUpdateSourceMutex }; + + switch (contextUpdateSource.getType()) + { + case ContextUpdateSource::Type::empty: + return {}; + + case ContextUpdateSource::Type::audioSourceFile: + if (! (contextUpdateSource.getAudioSourceFile().existsAsFile())) + return {}; + + { + const ARAEditGuard editGuard (documentController->getDocumentController()); + return std::make_unique (documentController->getDocumentController(), + contextUpdateSource.getAudioSourceFile()); + } + + case ContextUpdateSource::Type::stateInformation: + jassert (contextUpdateSource.getStateInformation().getSize() <= std::numeric_limits::max()); + + return Context::createFromStateInformation (documentController->getDocumentController(), + contextUpdateSource.getStateInformation().getData(), + (int) contextUpdateSource.getStateInformation().getSize()); + + case ContextUpdateSource::Type::reset: + resetContext = true; + return {}; + } + + jassertfalse; + return {}; + }(); + + if (newContext != nullptr) + { + { + ScopedPluginDeactivator deactivator (instance); + + context = std::move (newContext); + audioSourceLength.store (context->fileAudioSource.getFormatReader().lengthInSamples); + + auto& region = context->playbackRegion.getPlaybackRegion(); + playbackRenderer.add (region); + editorRenderer.add (region); + } + + sendChangeMessage(); + } + + if (resetContext) + { + { + ScopedPluginDeactivator deactivator (instance); + + context.reset(); + audioSourceLength.store (0); + } + + sendChangeMessage(); + } + } + + struct Context + { + Context (ARA::Host::DocumentController& dc, const File& audioFileIn) + : audioFile (audioFileIn), + musicalContext (dc), + regionSequence (dc, musicalContext, "track 1"), + fileAudioSource (dc, audioFile), + audioModification (dc, fileAudioSource), + playbackRegion (dc, regionSequence, audioModification, fileAudioSource) + { + } + + static std::unique_ptr createFromStateInformation (ARA::Host::DocumentController& dc, const void* d, int s) + { + if (auto xml = getXmlFromBinary (d, s)) + { + if (xml->hasTagName (xmlRootTag)) + { + File file { xml->getStringAttribute (xmlAudioFileAttrib) }; + + if (file.existsAsFile()) + return std::make_unique (dc, std::move (file)); + } + } + + return {}; + } + + void getStateInformation (juce::MemoryBlock& b) + { + XmlElement root { xmlRootTag }; + root.setAttribute (xmlAudioFileAttrib, audioFile.getFullPathName()); + copyXmlToBinary (root, b); + } + + const static Identifier xmlRootTag; + const static Identifier xmlAudioFileAttrib; + + File audioFile; + + MusicalContext musicalContext; + RegionSequence regionSequence; + FileAudioSource fileAudioSource; + AudioModification audioModification; + PlaybackRegion playbackRegion; + }; + + SimplePlayHead playHead; + ARAPluginInstanceWrapper& instance; + + std::unique_ptr documentController; + ARAHostModel::PlaybackRendererInterface playbackRenderer; + ARAHostModel::EditorRendererInterface editorRenderer; + + std::unique_ptr context; + + mutable std::mutex contextUpdateSourceMutex; + ContextUpdateSource contextUpdateSource; + + std::atomic isPlaying { false }; + std::atomic goToStartSignal { false }; + std::atomic audioSourceLength { 0 }; + }; + + explicit ARAPluginInstanceWrapper (std::unique_ptr innerIn) + : inner (std::move (innerIn)), araHost (*this) + { + jassert (inner != nullptr); + + for (auto isInput : { true, false }) + matchBuses (isInput); + + setBusesLayout (inner->getBusesLayout()); + } + + //============================================================================== + AudioProcessorEditor* createARAHostEditor() { return araHost.createEditor(); } + + //============================================================================== + const String getName() const override + { + std::lock_guard lock (innerMutex); + return inner->getName(); + } + + StringArray getAlternateDisplayNames() const override + { + std::lock_guard lock (innerMutex); + return inner->getAlternateDisplayNames(); + } + + double getTailLengthSeconds() const override + { + std::lock_guard lock (innerMutex); + return inner->getTailLengthSeconds(); + } + + bool acceptsMidi() const override + { + std::lock_guard lock (innerMutex); + return inner->acceptsMidi(); + } + + bool producesMidi() const override + { + std::lock_guard lock (innerMutex); + return inner->producesMidi(); + } + + AudioProcessorEditor* createEditor() override + { + std::lock_guard lock (innerMutex); + return inner->createEditorIfNeeded(); + } + + bool hasEditor() const override + { + std::lock_guard lock (innerMutex); + return inner->hasEditor(); + } + + int getNumPrograms() override + { + std::lock_guard lock (innerMutex); + return inner->getNumPrograms(); + } + + int getCurrentProgram() override + { + std::lock_guard lock (innerMutex); + return inner->getCurrentProgram(); + } + + void setCurrentProgram (int i) override + { + std::lock_guard lock (innerMutex); + inner->setCurrentProgram (i); + } + + const String getProgramName (int i) override + { + std::lock_guard lock (innerMutex); + return inner->getProgramName (i); + } + + void changeProgramName (int i, const String& n) override + { + std::lock_guard lock (innerMutex); + inner->changeProgramName (i, n); + } + + void getStateInformation (juce::MemoryBlock& b) override + { + XmlElement state ("ARAPluginInstanceWrapperState"); + + { + MemoryBlock m; + araHost.getStateInformation (m); + state.createNewChildElement ("host")->addTextElement (m.toBase64Encoding()); + } + + { + std::lock_guard lock (innerMutex); + + MemoryBlock m; + inner->getStateInformation (m); + state.createNewChildElement ("plugin")->addTextElement (m.toBase64Encoding()); + } + + copyXmlToBinary (state, b); + } + + void setStateInformation (const void* d, int s) override + { + if (auto xml = getXmlFromBinary (d, s)) + { + if (xml->hasTagName ("ARAPluginInstanceWrapperState")) + { + if (auto* hostState = xml->getChildByName ("host")) + { + MemoryBlock m; + m.fromBase64Encoding (hostState->getAllSubText()); + jassert (m.getSize() <= std::numeric_limits::max()); + araHost.setStateInformation (m.getData(), (int) m.getSize()); + } + + if (auto* pluginState = xml->getChildByName ("plugin")) + { + std::lock_guard lock (innerMutex); + + MemoryBlock m; + m.fromBase64Encoding (pluginState->getAllSubText()); + jassert (m.getSize() <= std::numeric_limits::max()); + inner->setStateInformation (m.getData(), (int) m.getSize()); + } + } + } + } + + void getCurrentProgramStateInformation (juce::MemoryBlock& b) override + { + std::lock_guard lock (innerMutex); + inner->getCurrentProgramStateInformation (b); + } + + void setCurrentProgramStateInformation (const void* d, int s) override + { + std::lock_guard lock (innerMutex); + inner->setCurrentProgramStateInformation (d, s); + } + + void prepareToPlay (double sr, int bs) override + { + std::lock_guard lock (innerMutex); + inner->setRateAndBufferSizeDetails (sr, bs); + inner->prepareToPlay (sr, bs); + prepareToPlayParams = { sr, bs }; + } + + void releaseResources() override { inner->releaseResources(); } + + void memoryWarningReceived() override { inner->memoryWarningReceived(); } + + void processBlock (AudioBuffer& a, MidiBuffer& m) override + { + const SpinLock::ScopedTryLockType scope (innerProcessBlockFlag); + + if (! scope.isLocked()) + return; + + inner->processBlock (a, m); + araHost.afterProcessBlock (a.getNumSamples()); + } + + void processBlock (AudioBuffer& a, MidiBuffer& m) override + { + const SpinLock::ScopedTryLockType scope (innerProcessBlockFlag); + + if (! scope.isLocked()) + return; + + inner->processBlock (a, m); + araHost.afterProcessBlock (a.getNumSamples()); + } + + void processBlockBypassed (AudioBuffer& a, MidiBuffer& m) override + { + const SpinLock::ScopedTryLockType scope (innerProcessBlockFlag); + + if (! scope.isLocked()) + return; + + inner->processBlockBypassed (a, m); + araHost.afterProcessBlock (a.getNumSamples()); + } + + void processBlockBypassed (AudioBuffer& a, MidiBuffer& m) override + { + const SpinLock::ScopedTryLockType scope (innerProcessBlockFlag); + + if (! scope.isLocked()) + return; + + inner->processBlockBypassed (a, m); + araHost.afterProcessBlock (a.getNumSamples()); + } + + bool supportsDoublePrecisionProcessing() const override + { + std::lock_guard lock (innerMutex); + return inner->supportsDoublePrecisionProcessing(); + } + + bool supportsMPE() const override + { + std::lock_guard lock (innerMutex); + return inner->supportsMPE(); + } + + bool isMidiEffect() const override + { + std::lock_guard lock (innerMutex); + return inner->isMidiEffect(); + } + + void reset() override + { + std::lock_guard lock (innerMutex); + inner->reset(); + } + + void setNonRealtime (bool b) noexcept override + { + std::lock_guard lock (innerMutex); + inner->setNonRealtime (b); + } + + void refreshParameterList() override + { + std::lock_guard lock (innerMutex); + inner->refreshParameterList(); + } + + void numChannelsChanged() override + { + std::lock_guard lock (innerMutex); + inner->numChannelsChanged(); + } + + void numBusesChanged() override + { + std::lock_guard lock (innerMutex); + inner->numBusesChanged(); + } + + void processorLayoutsChanged() override + { + std::lock_guard lock (innerMutex); + inner->processorLayoutsChanged(); + } + + void setPlayHead (AudioPlayHead* p) override { ignoreUnused (p); } + + void updateTrackProperties (const TrackProperties& p) override + { + std::lock_guard lock (innerMutex); + inner->updateTrackProperties (p); + } + + bool isBusesLayoutSupported (const BusesLayout& layout) const override + { + std::lock_guard lock (innerMutex); + return inner->checkBusesLayoutSupported (layout); + } + + bool canAddBus (bool) const override + { + std::lock_guard lock (innerMutex); + return true; + } + bool canRemoveBus (bool) const override + { + std::lock_guard lock (innerMutex); + return true; + } + + //============================================================================== + void fillInPluginDescription (PluginDescription& description) const override + { + return inner->fillInPluginDescription (description); + } + +private: + void matchBuses (bool isInput) + { + const auto inBuses = inner->getBusCount (isInput); + + while (getBusCount (isInput) < inBuses) + addBus (isInput); + + while (inBuses < getBusCount (isInput)) + removeBus (isInput); + } + + // Used for mutual exclusion between the audio and other threads + SpinLock innerProcessBlockFlag; + + // Used for mutual exclusion on non-audio threads + mutable std::mutex innerMutex; + + std::unique_ptr inner; + + ARATestHost araHost; + + struct PrepareToPlayParams + { + PrepareToPlayParams() : isValid (false) {} + + PrepareToPlayParams (double sampleRateIn, int samplesPerBlockIn) + : isValid (true), sampleRate (sampleRateIn), samplesPerBlock (samplesPerBlockIn) + { + } + + bool isValid; + double sampleRate; + int samplesPerBlock; + }; + + PrepareToPlayParams prepareToPlayParams; + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAPluginInstanceWrapper) +}; +#endif diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -111,6 +111,7 @@ void setPlayHead (AudioPlayHead* p) override { inner->setPlayHead (p); } void updateTrackProperties (const TrackProperties& p) override { inner->updateTrackProperties (p); } bool isBusesLayoutSupported (const BusesLayout& layout) const override { return inner->checkBusesLayoutSupported (layout); } + bool applyBusLayouts (const BusesLayout& layouts) override { return inner->setBusesLayout (layouts) && AudioPluginInstance::applyBusLayouts (layouts); } bool canAddBus (bool) const override { return true; } bool canRemoveBus (bool) const override { return true; } diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/InternalPlugins.h juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/InternalPlugins.h --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/InternalPlugins.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/InternalPlugins.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.cpp juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.cpp --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -171,7 +171,6 @@ //============================================================================== class IOConfigurationWindow::InputOutputConfig : public Component, - private ComboBox::Listener, private Button::Listener, private NumberedBoxes::Listener { @@ -187,7 +186,6 @@ layoutLabel.setFont (layoutLabel.getFont().withStyle (Font::bold)); enabledToggle.setClickingTogglesState (true); - layouts.addListener (this); enabledToggle.addListener (this); addAndMakeVisible (layoutLabel); @@ -262,26 +260,32 @@ { name.setText (bus->getName(), NotificationType::dontSendNotification); - int i; - for (i = 1; i < AudioChannelSet::maxChannelsOfNamedLayout; ++i) - if ((layouts.indexOfItemId(i) == -1) != bus->supportedLayoutWithChannels (i).isDisabled()) - break; - // supported layouts have changed - if (i < AudioChannelSet::maxChannelsOfNamedLayout) - { - layouts.clear(); + layouts.clear (dontSendNotification); + auto* menu = layouts.getRootMenu(); + + auto itemId = 1; + auto selectedId = -1; - for (i = 1; i < AudioChannelSet::maxChannelsOfNamedLayout; ++i) + for (auto i = 1; i < AudioChannelSet::maxChannelsOfNamedLayout; ++i) + { + for (const auto& set : AudioChannelSet::channelSetsWithNumberOfChannels (i)) { - auto set = bus->supportedLayoutWithChannels (i); + if (bus->isLayoutSupported (set)) + { + menu->addItem (PopupMenu::Item { set.getDescription() } + .setAction ([this, set] { applyBusLayout (set); }) + .setID (itemId)); + } - if (! set.isDisabled()) - layouts.addItem (set.getDescription(), i); + if (bus->getCurrentLayout() == set) + selectedId = itemId; + + ++itemId; } } - layouts.setSelectedId (bus->getLastEnabledLayout().size()); + layouts.setSelectedId (selectedId); const bool canBeDisabled = bus->isNumberOfChannelsSupported (0); @@ -294,27 +298,18 @@ } //============================================================================== - void comboBoxChanged (ComboBox* combo) override + void applyBusLayout (const AudioChannelSet& set) { - if (combo == &layouts) + if (auto* p = owner.getAudioProcessor()) { - if (auto* p = owner.getAudioProcessor()) + if (auto* bus = p->getBus (isInput, currentBus)) { - if (auto* bus = p->getBus (isInput, currentBus)) + if (bus->setCurrentLayoutWithoutEnabling (set)) { - auto selectedNumChannels = layouts.getSelectedId(); - - if (selectedNumChannels != bus->getLastEnabledLayout().size()) - { - if (isPositiveAndBelow (selectedNumChannels, AudioChannelSet::maxChannelsOfNamedLayout) - && bus->setCurrentLayoutWithoutEnabling (bus->supportedLayoutWithChannels (selectedNumChannels))) - { - if (auto* config = owner.getConfig (! isInput)) - config->updateBusLayout(); + if (auto* config = owner.getConfig (! isInput)) + config->updateBusLayout(); - owner.update(); - } - } + owner.update(); } } } diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.h juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.h --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -80,21 +80,23 @@ return nullptr; } -void PluginGraph::addPlugin (const PluginDescription& desc, Point pos) +void PluginGraph::addPlugin (const PluginDescriptionAndPreference& desc, Point pos) { - std::shared_ptr dpiDisabler = makeDPIAwarenessDisablerForPlugin (desc); + std::shared_ptr dpiDisabler = makeDPIAwarenessDisablerForPlugin (desc.pluginDescription); - formatManager.createPluginInstanceAsync (desc, + formatManager.createPluginInstanceAsync (desc.pluginDescription, graph.getSampleRate(), graph.getBlockSize(), - [this, pos, dpiDisabler] (std::unique_ptr instance, const String& error) + [this, pos, dpiDisabler, useARA = desc.useARA] (std::unique_ptr instance, const String& error) { - addPluginCallback (std::move (instance), error, pos); + addPluginCallback (std::move (instance), error, pos, useARA); }); } void PluginGraph::addPluginCallback (std::unique_ptr instance, - const String& error, Point pos) + const String& error, + Point pos, + PluginDescriptionAndPreference::UseARA useARA) { if (instance == nullptr) { @@ -104,12 +106,21 @@ } else { + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + if (useARA == PluginDescriptionAndPreference::UseARA::yes + && instance->getPluginDescription().hasARAExtension) + { + instance = std::make_unique (std::move (instance)); + } + #endif + instance->enableAllBuses(); if (auto node = graph.addNode (std::move (instance))) { node->properties.set ("x", pos.x); node->properties.set ("y", pos.y); + node->properties.set ("useARA", useARA == PluginDescriptionAndPreference::UseARA::yes); changed(); } } @@ -200,10 +211,10 @@ jassert (internalFormat.getAllTypes().size() > 3); - addPlugin (internalFormat.getAllTypes()[0], { 0.5, 0.1 }); - addPlugin (internalFormat.getAllTypes()[1], { 0.25, 0.1 }); - addPlugin (internalFormat.getAllTypes()[2], { 0.5, 0.9 }); - addPlugin (internalFormat.getAllTypes()[3], { 0.25, 0.9 }); + addPlugin (PluginDescriptionAndPreference { internalFormat.getAllTypes()[0] }, { 0.5, 0.1 }); + addPlugin (PluginDescriptionAndPreference { internalFormat.getAllTypes()[1] }, { 0.25, 0.1 }); + addPlugin (PluginDescriptionAndPreference { internalFormat.getAllTypes()[2] }, { 0.5, 0.9 }); + addPlugin (PluginDescriptionAndPreference { internalFormat.getAllTypes()[3] }, { 0.25, 0.9 }); MessageManager::callAsync ([this] { @@ -332,6 +343,7 @@ e->setAttribute ("uid", (int) node->nodeID.uid); e->setAttribute ("x", node->properties ["x"].toString()); e->setAttribute ("y", node->properties ["y"].toString()); + e->setAttribute ("useARA", node->properties ["useARA"].toString()); for (int i = 0; i < (int) PluginWindow::Type::numTypes; ++i) { @@ -372,26 +384,42 @@ void PluginGraph::createNodeFromXml (const XmlElement& xml) { - PluginDescription pd; + PluginDescriptionAndPreference pd; + const auto nodeUsesARA = xml.getBoolAttribute ("useARA"); for (auto* e : xml.getChildIterator()) { - if (pd.loadFromXml (*e)) + if (pd.pluginDescription.loadFromXml (*e)) + { + pd.useARA = nodeUsesARA ? PluginDescriptionAndPreference::UseARA::yes + : PluginDescriptionAndPreference::UseARA::no; break; + } } auto createInstanceWithFallback = [&]() -> std::unique_ptr { - auto createInstance = [this] (const PluginDescription& description) + auto createInstance = [this] (const PluginDescriptionAndPreference& description) -> std::unique_ptr { String errorMessage; - auto localDpiDisabler = makeDPIAwarenessDisablerForPlugin (description); + auto localDpiDisabler = makeDPIAwarenessDisablerForPlugin (description.pluginDescription); - return formatManager.createPluginInstance (description, - graph.getSampleRate(), - graph.getBlockSize(), - errorMessage); + auto instance = formatManager.createPluginInstance (description.pluginDescription, + graph.getSampleRate(), + graph.getBlockSize(), + errorMessage); + + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + if (instance + && description.useARA == PluginDescriptionAndPreference::UseARA::yes + && description.pluginDescription.hasARAExtension) + { + return std::make_unique (std::move (instance)); + } + #endif + + return instance; }; if (auto instance = createInstance (pd)) @@ -399,19 +427,19 @@ const auto allFormats = formatManager.getFormats(); const auto matchingFormat = std::find_if (allFormats.begin(), allFormats.end(), - [&] (const AudioPluginFormat* f) { return f->getName() == pd.pluginFormatName; }); + [&] (const AudioPluginFormat* f) { return f->getName() == pd.pluginDescription.pluginFormatName; }); if (matchingFormat == allFormats.end()) return nullptr; const auto plugins = knownPlugins.getTypesForFormat (**matchingFormat); const auto matchingPlugin = std::find_if (plugins.begin(), plugins.end(), - [&] (const PluginDescription& desc) { return pd.uniqueId == desc.uniqueId; }); + [&] (const PluginDescription& desc) { return pd.pluginDescription.uniqueId == desc.uniqueId; }); if (matchingPlugin == plugins.end()) return nullptr; - return createInstance (*matchingPlugin); + return createInstance (PluginDescriptionAndPreference { *matchingPlugin }); }; if (auto instance = createInstanceWithFallback()) @@ -438,6 +466,7 @@ node->properties.set ("x", xml.getDoubleAttribute ("x")); node->properties.set ("y", xml.getDoubleAttribute ("y")); + node->properties.set ("useARA", xml.getBoolAttribute ("useARA")); for (int i = 0; i < (int) PluginWindow::Type::numTypes; ++i) { diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/PluginGraph.h juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/PluginGraph.h --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/Plugins/PluginGraph.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/Plugins/PluginGraph.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,6 +27,29 @@ #include "../UI/PluginWindow.h" +//============================================================================== +/** A type that encapsulates a PluginDescription and some preferences regarding + how plugins of that description should be instantiated. +*/ +struct PluginDescriptionAndPreference +{ + enum class UseARA { no, yes }; + + PluginDescriptionAndPreference() = default; + + explicit PluginDescriptionAndPreference (PluginDescription pd) + : pluginDescription (std::move (pd)), + useARA (pluginDescription.hasARAExtension ? PluginDescriptionAndPreference::UseARA::yes + : PluginDescriptionAndPreference::UseARA::no) + {} + + PluginDescriptionAndPreference (PluginDescription pd, UseARA ara) + : pluginDescription (std::move (pd)), useARA (ara) + {} + + PluginDescription pluginDescription; + UseARA useARA = UseARA::no; +}; //============================================================================== /** @@ -44,7 +67,7 @@ //============================================================================== using NodeID = AudioProcessorGraph::NodeID; - void addPlugin (const PluginDescription&, Point); + void addPlugin (const PluginDescriptionAndPreference&, Point); AudioProcessorGraph::Node::Ptr getNodeForName (const String& name) const; @@ -92,7 +115,10 @@ NodeID getNextUID() noexcept; void createNodeFromXml (const XmlElement&); - void addPluginCallback (std::unique_ptr, const String& error, Point); + void addPluginCallback (std::unique_ptr, + const String& error, + Point, + PluginDescriptionAndPreference::UseARA useARA); void changeListenerCallback (ChangeBroadcaster*) override; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginGraph) diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp juce-7.0.0~ds0/extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -398,53 +398,55 @@ return {}; } + bool isNodeUsingARA() const + { + if (auto node = graph.graph.getNodeForId (pluginID)) + return node->properties["useARA"]; + + return false; + } + void showPopupMenu() { menu.reset (new PopupMenu); - menu->addItem (1, "Delete this filter"); - menu->addItem (2, "Disconnect all pins"); - menu->addItem (3, "Toggle Bypass"); + menu->addItem ("Delete this filter", [this] { graph.graph.removeNode (pluginID); }); + menu->addItem ("Disconnect all pins", [this] { graph.graph.disconnectNode (pluginID); }); + menu->addItem ("Toggle Bypass", [this] + { + if (auto* node = graph.graph.getNodeForId (pluginID)) + node->setBypassed (! node->isBypassed()); + + repaint(); + }); menu->addSeparator(); if (getProcessor()->hasEditor()) - menu->addItem (10, "Show plugin GUI"); + menu->addItem ("Show plugin GUI", [this] { showWindow (PluginWindow::Type::normal); }); - menu->addItem (11, "Show all programs"); - menu->addItem (12, "Show all parameters"); - menu->addItem (13, "Show debug log"); + menu->addItem ("Show all programs", [this] { showWindow (PluginWindow::Type::programs); }); + menu->addItem ("Show all parameters", [this] { showWindow (PluginWindow::Type::generic); }); + menu->addItem ("Show debug log", [this] { showWindow (PluginWindow::Type::debug); }); + + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + if (auto* instance = dynamic_cast (getProcessor())) + if (instance->getPluginDescription().hasARAExtension && isNodeUsingARA()) + menu->addItem ("Show ARA host controls", [this] { showWindow (PluginWindow::Type::araHost); }); + #endif if (autoScaleOptionAvailable) addPluginAutoScaleOptionsSubMenu (dynamic_cast (getProcessor()), *menu); menu->addSeparator(); - menu->addItem (20, "Configure Audio I/O"); - menu->addItem (21, "Test state save/load"); - - menu->showMenuAsync ({}, ModalCallbackFunction::create - ([this] (int r) { - switch (r) - { - case 1: graph.graph.removeNode (pluginID); break; - case 2: graph.graph.disconnectNode (pluginID); break; - case 3: - { - if (auto* node = graph.graph.getNodeForId (pluginID)) - node->setBypassed (! node->isBypassed()); + menu->addItem ("Configure Audio I/O", [this] { showWindow (PluginWindow::Type::audioIO); }); + menu->addItem ("Test state save/load", [this] { testStateSaveLoad(); }); - repaint(); - - break; - } - case 10: showWindow (PluginWindow::Type::normal); break; - case 11: showWindow (PluginWindow::Type::programs); break; - case 12: showWindow (PluginWindow::Type::generic) ; break; - case 13: showWindow (PluginWindow::Type::debug); break; - case 20: showWindow (PluginWindow::Type::audioIO); break; - case 21: testStateSaveLoad(); break; + #if ! JUCE_IOS && ! JUCE_ANDROID + menu->addSeparator(); + menu->addItem ("Save plugin state", [this] { savePluginState(); }); + menu->addItem ("Load plugin state", [this] { loadPluginState(); }); + #endif - default: break; - } - })); + menu->showMenuAsync ({}); } void testStateSaveLoad() @@ -484,6 +486,59 @@ void handleAsyncUpdate() override { repaint(); } + void savePluginState() + { + fileChooser = std::make_unique ("Save plugin state"); + + const auto onChosen = [ref = SafePointer (this)] (const FileChooser& chooser) + { + if (ref == nullptr) + return; + + const auto result = chooser.getResult(); + + if (result == File()) + return; + + if (auto* node = ref->graph.graph.getNodeForId (ref->pluginID)) + { + MemoryBlock block; + node->getProcessor()->getStateInformation (block); + result.replaceWithData (block.getData(), block.getSize()); + } + }; + + fileChooser->launchAsync (FileBrowserComponent::saveMode | FileBrowserComponent::warnAboutOverwriting, onChosen); + } + + void loadPluginState() + { + fileChooser = std::make_unique ("Load plugin state"); + + const auto onChosen = [ref = SafePointer (this)] (const FileChooser& chooser) + { + if (ref == nullptr) + return; + + const auto result = chooser.getResult(); + + if (result == File()) + return; + + if (auto* node = ref->graph.graph.getNodeForId (ref->pluginID)) + { + if (auto stream = result.createInputStream()) + { + MemoryBlock block; + stream->readIntoMemoryBlock (block); + node->getProcessor()->setStateInformation (block.getData(), (int) block.getSize()); + } + } + }; + + fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles, onChosen); + } + GraphEditorPanel& panel; PluginGraph& graph; const AudioProcessorGraph::NodeID pluginID; @@ -495,6 +550,7 @@ int numIns = 0, numOuts = 0; DropShadowEffect shadow; std::unique_ptr menu; + std::unique_ptr fileChooser; const String formatSuffix = getFormatSuffix (getProcessor()); }; @@ -742,7 +798,7 @@ stopTimer(); } -void GraphEditorPanel::createNewPlugin (const PluginDescription& desc, Point position) +void GraphEditorPanel::createNewPlugin (const PluginDescriptionAndPreference& desc, Point position) { graph.addPlugin (desc, position.toDouble() / Point ((double) getWidth(), (double) getHeight())); } @@ -1238,16 +1294,11 @@ checkAvailableWidth(); } -void GraphDocumentComponent::createNewPlugin (const PluginDescription& desc, Point pos) +void GraphDocumentComponent::createNewPlugin (const PluginDescriptionAndPreference& desc, Point pos) { graphPanel->createNewPlugin (desc, pos); } -void GraphDocumentComponent::unfocusKeyboardComponent() -{ - keyboardComp->unfocusAllComponents(); -} - void GraphDocumentComponent::releaseGraph() { deviceManager.removeAudioCallback (&graphPlayer); @@ -1285,7 +1336,8 @@ // must be a valid index! jassert (isPositiveAndBelow (pluginTypeIndex, pluginList.getNumTypes())); - createNewPlugin (pluginList.getTypes()[pluginTypeIndex], details.localPosition); + createNewPlugin (PluginDescriptionAndPreference { pluginList.getTypes()[pluginTypeIndex] }, + details.localPosition); } void GraphDocumentComponent::showSidePanel (bool showSettingsPanel) diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/UI/GraphEditorPanel.h juce-7.0.0~ds0/extras/AudioPluginHost/Source/UI/GraphEditorPanel.h --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/UI/GraphEditorPanel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/UI/GraphEditorPanel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -38,10 +38,11 @@ private Timer { public: + //============================================================================== GraphEditorPanel (PluginGraph& graph); ~GraphEditorPanel() override; - void createNewPlugin (const PluginDescription&, Point position); + void createNewPlugin (const PluginDescriptionAndPreference&, Point position); void paint (Graphics&) override; void resized() override; @@ -110,7 +111,7 @@ ~GraphDocumentComponent() override; //============================================================================== - void createNewPlugin (const PluginDescription&, Point position); + void createNewPlugin (const PluginDescriptionAndPreference&, Point position); void setDoublePrecision (bool doublePrecision); bool closeAnyOpenPluginWindows(); @@ -118,7 +119,6 @@ std::unique_ptr graph; void resized() override; - void unfocusKeyboardComponent(); void releaseGraph(); //============================================================================== diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp juce-7.0.0~ds0/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -29,6 +29,71 @@ constexpr const char* scanModeKey = "pluginScanMode"; +//============================================================================== +class Superprocess : private ChildProcessCoordinator +{ +public: + Superprocess() + { + launchWorkerProcess (File::getSpecialLocation (File::currentExecutableFile), processUID, 0, 0); + } + + enum class State + { + timeout, + gotResult, + connectionLost, + }; + + struct Response + { + State state; + std::unique_ptr xml; + }; + + Response getResponse() + { + std::unique_lock lock { mutex }; + + if (! condvar.wait_for (lock, std::chrono::milliseconds { 50 }, [&] { return gotResult || connectionLost; })) + return { State::timeout, nullptr }; + + const auto state = connectionLost ? State::connectionLost : State::gotResult; + connectionLost = false; + gotResult = false; + + return { state, std::move (pluginDescription) }; + } + + using ChildProcessCoordinator::sendMessageToWorker; + +private: + void handleMessageFromWorker (const MemoryBlock& mb) override + { + const std::lock_guard lock { mutex }; + pluginDescription = parseXML (mb.toString()); + gotResult = true; + condvar.notify_one(); + } + + void handleConnectionLost() override + { + const std::lock_guard lock { mutex }; + connectionLost = true; + condvar.notify_one(); + } + + std::mutex mutex; + std::condition_variable condvar; + + std::unique_ptr pluginDescription; + bool connectionLost = false; + bool gotResult = false; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Superprocess) +}; + +//============================================================================== class CustomPluginScanner : public KnownPluginList::CustomScanner, private ChangeListener { @@ -58,50 +123,54 @@ return true; } - if (superprocess == nullptr) - { - superprocess = std::make_unique (*this); + if (addPluginDescriptions (format.getName(), fileOrIdentifier, result)) + return true; - std::unique_lock lock (mutex); - connectionLost = false; - } + superprocess = nullptr; + return false; + } + + void scanFinished() override + { + superprocess = nullptr; + } + +private: + /* Scans for a plugin with format 'formatName' and ID 'fileOrIdentifier' using a subprocess, + and adds discovered plugin descriptions to 'result'. + + Returns true on success. + + Failure indicates that the subprocess is unrecoverable and should be terminated. + */ + bool addPluginDescriptions (const String& formatName, + const String& fileOrIdentifier, + OwnedArray& result) + { + if (superprocess == nullptr) + superprocess = std::make_unique(); MemoryBlock block; MemoryOutputStream stream { block, true }; - stream.writeString (format.getName()); + stream.writeString (formatName); stream.writeString (fileOrIdentifier); - if (superprocess->sendMessageToWorker (block)) - { - std::unique_lock lock (mutex); - gotResponse = false; - pluginDescription = nullptr; - - for (;;) - { - if (condvar.wait_for (lock, - std::chrono::milliseconds (50), - [this] { return gotResponse || shouldExit(); })) - { - break; - } - } + if (! superprocess->sendMessageToWorker (block)) + return false; + for (;;) + { if (shouldExit()) - { - superprocess = nullptr; return true; - } - if (connectionLost) - { - superprocess = nullptr; - return false; - } + const auto response = superprocess->getResponse(); - if (pluginDescription != nullptr) + if (response.state == Superprocess::State::timeout) + continue; + + if (response.xml != nullptr) { - for (const auto* item : pluginDescription->getChildIterator()) + for (const auto* item : response.xml->getChildIterator()) { auto desc = std::make_unique(); @@ -110,55 +179,10 @@ } } - return true; + return (response.state == Superprocess::State::gotResult); } - - superprocess = nullptr; - return false; - } - - void scanFinished() override - { - superprocess = nullptr; } -private: - class Superprocess : private ChildProcessCoordinator - { - public: - explicit Superprocess (CustomPluginScanner& o) - : owner (o) - { - launchWorkerProcess (File::getSpecialLocation (File::currentExecutableFile), processUID, 0, 0); - } - - using ChildProcessCoordinator::sendMessageToWorker; - - private: - void handleMessageFromWorker (const MemoryBlock& mb) override - { - auto xml = parseXML (mb.toString()); - - const std::lock_guard lock (owner.mutex); - owner.pluginDescription = std::move (xml); - owner.gotResponse = true; - owner.condvar.notify_one(); - } - - void handleConnectionLost() override - { - const std::lock_guard lock (owner.mutex); - owner.pluginDescription = nullptr; - owner.gotResponse = true; - owner.connectionLost = true; - owner.condvar.notify_one(); - } - - CustomPluginScanner& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Superprocess) - }; - void changeListenerCallback (ChangeBroadcaster*) override { if (auto* file = getAppProperties().getUserSettings()) @@ -166,11 +190,6 @@ } std::unique_ptr superprocess; - std::mutex mutex; - std::condition_variable condvar; - std::unique_ptr pluginDescription; - bool gotResponse = false; - bool connectionLost = false; std::atomic scanInProcess { true }; @@ -300,6 +319,8 @@ setContentNonOwned (graphHolder.get(), false); + setUsingNativeTitleBar (true); + restoreWindowStateFromString (getAppProperties().getUserSettings()->getValue ("mainWindowPos")); setVisible (true); @@ -581,7 +602,7 @@ } else { - if (KnownPluginList::getIndexChosenByMenu (pluginDescriptions, menuItemID) >= 0) + if (getIndexChosenByMenu (menuItemID) >= 0) createPlugin (getChosenType (menuItemID), { proportionOfWidth (0.3f + Random::getSystemRandom().nextFloat() * 0.6f), proportionOfHeight (0.3f + Random::getSystemRandom().nextFloat() * 0.6f) }); } @@ -590,15 +611,67 @@ void MainHostWindow::menuBarActivated (bool isActivated) { if (isActivated && graphHolder != nullptr) - graphHolder->unfocusKeyboardComponent(); + Component::unfocusAllComponents(); } -void MainHostWindow::createPlugin (const PluginDescription& desc, Point pos) +void MainHostWindow::createPlugin (const PluginDescriptionAndPreference& desc, Point pos) { if (graphHolder != nullptr) graphHolder->createNewPlugin (desc, pos); } +static bool containsDuplicateNames (const Array& plugins, const String& name) +{ + int matches = 0; + + for (auto& p : plugins) + if (p.name == name && ++matches > 1) + return true; + + return false; +} + +static constexpr int menuIDBase = 0x324503f4; + +static void addToMenu (const KnownPluginList::PluginTree& tree, + PopupMenu& m, + const Array& allPlugins, + Array& addedPlugins) +{ + for (auto* sub : tree.subFolders) + { + PopupMenu subMenu; + addToMenu (*sub, subMenu, allPlugins, addedPlugins); + + m.addSubMenu (sub->folder, subMenu, true, nullptr, false, 0); + } + + auto addPlugin = [&] (const auto& descriptionAndPreference, const auto& pluginName) + { + addedPlugins.add (descriptionAndPreference); + const auto menuID = addedPlugins.size() - 1 + menuIDBase; + m.addItem (menuID, pluginName, true, false); + }; + + for (auto& plugin : tree.plugins) + { + auto name = plugin.name; + + if (containsDuplicateNames (tree.plugins, name)) + name << " (" << plugin.pluginFormatName << ')'; + + addPlugin (PluginDescriptionAndPreference { plugin, PluginDescriptionAndPreference::UseARA::no }, name); + + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + if (plugin.hasARAExtension) + { + name << " (ARA)"; + addPlugin (PluginDescriptionAndPreference { plugin }, name); + } + #endif + } +} + void MainHostWindow::addPluginsToMenu (PopupMenu& m) { if (graphHolder != nullptr) @@ -611,7 +684,7 @@ m.addSeparator(); - pluginDescriptions = knownPluginList.getTypes(); + auto pluginDescriptions = knownPluginList.getTypes(); // This avoids showing the internal types again later on in the list pluginDescriptions.removeIf ([] (PluginDescription& desc) @@ -619,15 +692,23 @@ return desc.pluginFormatName == InternalPluginFormat::getIdentifier(); }); - KnownPluginList::addToMenu (m, pluginDescriptions, pluginSortMethod); + auto tree = KnownPluginList::createTree (pluginDescriptions, pluginSortMethod); + pluginDescriptionsAndPreference = {}; + addToMenu (*tree, m, pluginDescriptions, pluginDescriptionsAndPreference); +} + +int MainHostWindow::getIndexChosenByMenu (int menuID) const +{ + const auto i = menuID - menuIDBase; + return isPositiveAndBelow (i, pluginDescriptionsAndPreference.size()) ? i : -1; } -PluginDescription MainHostWindow::getChosenType (const int menuID) const +PluginDescriptionAndPreference MainHostWindow::getChosenType (const int menuID) const { if (menuID >= 1 && menuID < (int) (1 + internalTypes.size())) - return internalTypes[(size_t) (menuID - 1)]; + return PluginDescriptionAndPreference { internalTypes[(size_t) (menuID - 1)] }; - return pluginDescriptions[KnownPluginList::getIndexChosenByMenu (pluginDescriptions, menuID)]; + return pluginDescriptionsAndPreference[getIndexChosenByMenu (menuID)]; } //============================================================================== @@ -910,7 +991,7 @@ for (int i = 0; i < jmin (5, typesFound.size()); ++i) if (auto* desc = typesFound.getUnchecked(i)) - createPlugin (*desc, pos); + createPlugin (PluginDescriptionAndPreference { *desc }, pos); } } } diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/UI/MainHostWindow.h juce-7.0.0~ds0/extras/AudioPluginHost/Source/UI/MainHostWindow.h --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/UI/MainHostWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/UI/MainHostWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -107,10 +107,10 @@ void tryToQuitApplication(); - void createPlugin (const PluginDescription&, Point pos); + void createPlugin (const PluginDescriptionAndPreference&, Point pos); void addPluginsToMenu (PopupMenu&); - PluginDescription getChosenType (int menuID) const; + PluginDescriptionAndPreference getChosenType (int menuID) const; std::unique_ptr graphHolder; @@ -124,6 +124,8 @@ void showAudioSettings(); + int getIndexChosenByMenu (int menuID) const; + //============================================================================== AudioDeviceManager deviceManager; AudioPluginFormatManager formatManager; @@ -131,7 +133,7 @@ std::vector internalTypes; KnownPluginList knownPluginList; KnownPluginList::SortMethod pluginSortMethod; - Array pluginDescriptions; + Array pluginDescriptionsAndPreference; class PluginListWindow; std::unique_ptr pluginListWindow; diff -Nru juce-6.1.5~ds0/extras/AudioPluginHost/Source/UI/PluginWindow.h juce-7.0.0~ds0/extras/AudioPluginHost/Source/UI/PluginWindow.h --- juce-6.1.5~ds0/extras/AudioPluginHost/Source/UI/PluginWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/AudioPluginHost/Source/UI/PluginWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,7 @@ #pragma once #include "../Plugins/IOConfigurationWindow.h" +#include "../Plugins/ARAPlugin.h" inline String getFormatSuffix (const AudioProcessor* plugin) { @@ -155,15 +156,16 @@ programs, audioIO, debug, + araHost, numTypes }; PluginWindow (AudioProcessorGraph::Node* n, Type t, OwnedArray& windowList) - : DocumentWindow (n->getProcessor()->getName() + getFormatSuffix (n->getProcessor()), - LookAndFeel::getDefaultLookAndFeel().findColour (ResizableWindow::backgroundColourId), - DocumentWindow::minimiseButton | DocumentWindow::closeButton), - activeWindowList (windowList), - node (n), type (t) + : DocumentWindow (n->getProcessor()->getName() + getFormatSuffix (n->getProcessor()), + LookAndFeel::getDefaultLookAndFeel().findColour (ResizableWindow::backgroundColourId), + DocumentWindow::minimiseButton | DocumentWindow::closeButton), + activeWindowList (windowList), + node (n), type (t) { setSize (400, 300); @@ -241,6 +243,16 @@ type = PluginWindow::Type::generic; } + if (type == PluginWindow::Type::araHost) + { + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + if (auto* araPluginInstanceWrapper = dynamic_cast (&processor)) + if (auto* ui = araPluginInstanceWrapper->createARAHostEditor()) + return ui; + #endif + return {}; + } + if (type == PluginWindow::Type::generic) return new GenericAudioProcessorEditor (processor); if (type == PluginWindow::Type::programs) return new ProgramAudioProcessorEditor (processor); if (type == PluginWindow::Type::audioIO) return new IOConfigurationWindow (processor); @@ -259,6 +271,7 @@ case Type::programs: return "Programs"; case Type::audioIO: return "IO"; case Type::debug: return "Debug"; + case Type::araHost: return "ARAHost"; case Type::numTypes: default: return {}; } diff -Nru juce-6.1.5~ds0/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile juce-7.0.0~ds0/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile --- juce-6.1.5~ds0/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile 2022-06-21 07:56:28.000000000 +0000 @@ -11,6 +11,10 @@ # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_CONSOLEAPP := BinaryBuilder JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,13 +60,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_CONSOLEAPP := BinaryBuilder JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -Os $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -76,8 +80,8 @@ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) $(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) : $(OBJECTS_CONSOLEAPP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors libcurl + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors libcurl @echo Linking "BinaryBuilder - ConsoleApp" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) diff -Nru juce-6.1.5~ds0/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj juce-7.0.0~ds0/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj --- juce-6.1.5~ds0/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj 2022-06-21 07:56:28.000000000 +0000 @@ -140,7 +140,7 @@ 36B6F402BC83F21646259DEF = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; }; buildConfigurationList = E4C85B0464A93027D035AA1F; @@ -201,7 +201,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_STANDALONE_APPLICATION=1", @@ -212,10 +212,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -299,7 +299,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_STANDALONE_APPLICATION=1", @@ -310,10 +310,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( diff -Nru juce-6.1.5~ds0/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj juce-7.0.0~ds0/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj --- juce-6.1.5~ds0/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -77,7 +77,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\BinaryBuilder.exe @@ -105,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -118,7 +119,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\BinaryBuilder.exe @@ -152,9 +154,15 @@ true + + true + true + + true + true @@ -170,6 +178,9 @@ true + + true + true @@ -236,6 +247,9 @@ true + + true + true @@ -465,6 +479,7 @@ + @@ -473,6 +488,8 @@ + + diff -Nru juce-6.1.5~ds0/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters juce-7.0.0~ds0/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters --- juce-6.1.5~ds0/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -91,9 +91,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -109,6 +115,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -175,6 +184,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -444,6 +456,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -468,6 +483,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff -Nru juce-6.1.5~ds0/extras/BinaryBuilder/CMakeLists.txt juce-7.0.0~ds0/extras/BinaryBuilder/CMakeLists.txt --- juce-6.1.5~ds0/extras/BinaryBuilder/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/BinaryBuilder/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/BinaryBuilder/Source/Main.cpp juce-7.0.0~ds0/extras/BinaryBuilder/Source/Main.cpp --- juce-6.1.5~ds0/extras/BinaryBuilder/Source/Main.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/BinaryBuilder/Source/Main.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/CMake/checkBundleSigning.cmake juce-7.0.0~ds0/extras/Build/CMake/checkBundleSigning.cmake --- juce-6.1.5~ds0/extras/Build/CMake/checkBundleSigning.cmake 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/CMake/checkBundleSigning.cmake 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,37 @@ +# ============================================================================== +# +# This file is part of the JUCE library. +# Copyright (c) 2022 - Raw Material Software Limited +# +# 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 7 End-User License +# Agreement and JUCE Privacy Policy. +# +# End User License Agreement: www.juce.com/juce-7-licence +# Privacy Policy: www.juce.com/juce-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. +# +# ============================================================================== + +find_program(JUCE_XCRUN xcrun) + +if(NOT JUCE_XCRUN) + return() +endif() + +execute_process( + COMMAND "${JUCE_XCRUN}" codesign --verify "${src}" + RESULT_VARIABLE result) + +if(result) + message(STATUS "Replacing invalid signature with ad-hoc signature") + execute_process(COMMAND "${JUCE_XCRUN}" codesign -s - "${src}") +endif() diff -Nru juce-6.1.5~ds0/extras/Build/CMake/copyDir.cmake juce-7.0.0~ds0/extras/Build/CMake/copyDir.cmake --- juce-6.1.5~ds0/extras/Build/CMake/copyDir.cmake 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/CMake/copyDir.cmake 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/CMake/JUCECheckAtomic.cmake juce-7.0.0~ds0/extras/Build/CMake/JUCECheckAtomic.cmake --- juce-6.1.5~ds0/extras/Build/CMake/JUCECheckAtomic.cmake 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/CMake/JUCECheckAtomic.cmake 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/CMake/JUCEConfig.cmake.in juce-7.0.0~ds0/extras/Build/CMake/JUCEConfig.cmake.in --- juce-6.1.5~ds0/extras/Build/CMake/JUCEConfig.cmake.in 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/CMake/JUCEConfig.cmake.in 2022-06-21 07:56:28.000000000 +0000 @@ -20,6 +20,8 @@ @PACKAGE_INIT@ +include("${CMAKE_CURRENT_LIST_DIR}/LV2_HELPER.cmake") + if(NOT TARGET juce::juceaide) add_executable(juce::juceaide IMPORTED) set_target_properties(juce::juceaide PROPERTIES diff -Nru juce-6.1.5~ds0/extras/Build/CMake/JUCEHelperTargets.cmake juce-7.0.0~ds0/extras/Build/CMake/JUCEHelperTargets.cmake --- juce-6.1.5~ds0/extras/Build/CMake/JUCEHelperTargets.cmake 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/CMake/JUCEHelperTargets.cmake 2022-06-21 07:56:28.000000000 +0000 @@ -1,3 +1,26 @@ +# ============================================================================== +# +# This file is part of the JUCE library. +# Copyright (c) 2022 - Raw Material Software Limited +# +# 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 7 End-User License +# Agreement and JUCE Privacy Policy. +# +# End User License Agreement: www.juce.com/juce-7-licence +# Privacy Policy: www.juce.com/juce-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. +# +# ============================================================================== + add_library(juce_recommended_warning_flags INTERFACE) add_library(juce::juce_recommended_warning_flags ALIAS juce_recommended_warning_flags) @@ -9,19 +32,21 @@ -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wsign-conversion -Wbool-conversion -Wextra-semi -Wunreachable-code - -Wcast-align -Wshift-sign-overflow -Wno-missing-field-initializers + -Wcast-align -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wno-ignored-qualifiers -Wswitch-enum - -Wpedantic + -Wpedantic -Wdeprecated $<$,$>: -Wzero-as-null-pointer-constant -Wunused-private-field -Woverloaded-virtual -Wreorder - -Winconsistent-missing-destructor-override>) + -Winconsistent-missing-destructor-override> + $<$,$>: + -Wunguarded-availability -Wunguarded-availability-new>) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") target_compile_options(juce_recommended_warning_flags INTERFACE -Wall -Wextra -Wpedantic -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wsign-compare -Wsign-conversion -Wunreachable-code -Wcast-align -Wno-implicit-fallthrough -Wno-maybe-uninitialized - -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum + -Wno-ignored-qualifiers -Wswitch-enum -Wredundant-decls -Wno-strict-overflow -Wshadow $<$: -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant>) diff -Nru juce-6.1.5~ds0/extras/Build/CMake/JuceLV2Defines.h.in juce-7.0.0~ds0/extras/Build/CMake/JuceLV2Defines.h.in --- juce-6.1.5~ds0/extras/Build/CMake/JuceLV2Defines.h.in 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/CMake/JuceLV2Defines.h.in 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,5 @@ +#pragma once + +#ifndef JucePlugin_LV2URI + #define JucePlugin_LV2URI "${JUCE_LV2URI}" +#endif diff -Nru juce-6.1.5~ds0/extras/Build/CMake/JUCEModuleSupport.cmake juce-7.0.0~ds0/extras/Build/CMake/JUCEModuleSupport.cmake --- juce-6.1.5~ds0/extras/Build/CMake/JUCEModuleSupport.cmake 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/CMake/JUCEModuleSupport.cmake 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -120,23 +120,23 @@ foreach(line IN LISTS module_header_contents) if(NOT append) - if(line MATCHES " *BEGIN_${delim_str} *") + if(line MATCHES "[\t ]*BEGIN_${delim_str}[\t ]*") set(append YES) endif() continue() endif() - if(append AND (line MATCHES " *END_${delim_str} *")) + if(append AND (line MATCHES "[\t ]*END_${delim_str}[\t ]*")) break() endif() - if(line MATCHES "^ *([a-zA-Z]+):") + if(line MATCHES "^[\t ]*([a-zA-Z]+):") set(last_written_key "${CMAKE_MATCH_1}") endif() - string(REGEX REPLACE "^ *${last_written_key}: *" "" line "${line}") - string(REGEX REPLACE "[ ,]+" ";" line "${line}") + string(REGEX REPLACE "^[\t ]*${last_written_key}:[\t ]*" "" line "${line}") + string(REGEX REPLACE "[\t ,]+" ";" line "${line}") set_property(TARGET ${target_name} APPEND PROPERTY "INTERFACE_JUCE_${last_written_key}" "${line}") @@ -234,7 +234,7 @@ # ================================================================================================== function(_juce_get_all_plugin_kinds out) - set(${out} AU AUv3 AAX Standalone Unity VST VST3 PARENT_SCOPE) + set(${out} AU AUv3 AAX LV2 Standalone Unity VST VST3 PARENT_SCOPE) endfunction() function(_juce_get_platform_plugin_kinds out) @@ -249,7 +249,7 @@ endif() if(NOT CMAKE_SYSTEM_NAME STREQUAL "iOS" AND NOT CMAKE_SYSTEM_NAME STREQUAL "Android") - list(APPEND result AAX Unity VST VST3) + list(APPEND result AAX Unity VST VST3 LV2) endif() set(${out} ${result} PARENT_SCOPE) @@ -272,22 +272,29 @@ # ================================================================================================== -# Takes a target, a link visibility, and a variable-length list of framework -# names. On macOS, finds the requested frameworks using `find_library` and -# links them. On iOS, links directly with `-framework Name`. +# Takes a target, a link visibility, if it should be a weak link, and a variable-length list of +# framework names. On macOS, for non-weak links, this finds the requested frameworks using +# `find_library`. function(_juce_link_frameworks target visibility) - foreach(framework IN LISTS ARGN) + set(options WEAK) + cmake_parse_arguments(JUCE_LINK_FRAMEWORKS "${options}" "" "" ${ARGN}) + foreach(framework IN LISTS JUCE_LINK_FRAMEWORKS_UNPARSED_ARGUMENTS) if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") - find_library("juce_found_${framework}" "${framework}" REQUIRED) - target_link_libraries("${target}" "${visibility}" "${juce_found_${framework}}") + if(JUCE_LINK_FRAMEWORKS_WEAK) + set(framework_flags "-weak_framework ${framework}") + else() + find_library("juce_found_${framework}" "${framework}" REQUIRED) + set(framework_flags "${juce_found_${framework}}") + endif() elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS") # CoreServices is only available on iOS 12+, we must link it weakly on earlier platforms - if((framework STREQUAL "CoreServices") AND (CMAKE_OSX_DEPLOYMENT_TARGET LESS 12.0)) + if(JUCE_LINK_FRAMEWORKS_WEAK OR ((framework STREQUAL "CoreServices") AND (CMAKE_OSX_DEPLOYMENT_TARGET LESS 12.0))) set(framework_flags "-weak_framework ${framework}") else() set(framework_flags "-framework ${framework}") endif() - + endif() + if(NOT framework_flags STREQUAL "") target_link_libraries("${target}" "${visibility}" "${framework_flags}") endif() endforeach() @@ -398,6 +405,11 @@ # ================================================================================================== +function(_juce_remove_empty_list_elements arg) + list(FILTER ${arg} EXCLUDE REGEX "^$") + set(${arg} ${${arg}} PARENT_SCOPE) +endfunction() + function(juce_add_module module_path) set(one_value_args INSTALL_PATH ALIAS_NAMESPACE) cmake_parse_arguments(JUCE_ARG "" "${one_value_args}" "" ${ARGN}) @@ -484,8 +496,30 @@ target_link_libraries(juce_audio_processors INTERFACE juce_vst3_headers) + add_library(juce_lilv_headers INTERFACE) + set(lv2_base_path "${base_path}/juce_audio_processors/format_types/LV2_SDK") + target_include_directories(juce_lilv_headers INTERFACE + "${lv2_base_path}" + "${lv2_base_path}/lv2" + "${lv2_base_path}/serd" + "${lv2_base_path}/sord" + "${lv2_base_path}/sord/src" + "${lv2_base_path}/sratom" + "${lv2_base_path}/lilv" + "${lv2_base_path}/lilv/src") + target_link_libraries(juce_audio_processors INTERFACE juce_lilv_headers) + + add_library(juce_ara_headers INTERFACE) + + target_include_directories(juce_ara_headers INTERFACE + "$<$:$>") + + target_link_libraries(juce_audio_processors INTERFACE juce_ara_headers) + if(JUCE_ARG_ALIAS_NAMESPACE) add_library(${JUCE_ARG_ALIAS_NAMESPACE}::juce_vst3_headers ALIAS juce_vst3_headers) + add_library(${JUCE_ARG_ALIAS_NAMESPACE}::juce_lilv_headers ALIAS juce_lilv_headers) + add_library(${JUCE_ARG_ALIAS_NAMESPACE}::juce_ara_headers ALIAS juce_ara_headers) endif() endif() @@ -529,26 +563,34 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") _juce_get_metadata("${metadata_dict}" OSXFrameworks module_osxframeworks) + _juce_remove_empty_list_elements(module_osxframeworks) foreach(module_framework IN LISTS module_osxframeworks) - if(module_framework STREQUAL "") - continue() - endif() - _juce_link_frameworks("${module_name}" INTERFACE "${module_framework}") endforeach() + _juce_get_metadata("${metadata_dict}" WeakOSXFrameworks module_weakosxframeworks) + + _juce_remove_empty_list_elements(module_weakosxframeworks) + foreach(module_framework IN LISTS module_weakosxframeworks) + _juce_link_frameworks("${module_name}" INTERFACE WEAK "${module_framework}") + endforeach() + _juce_link_libs_from_metadata("${module_name}" "${metadata_dict}" OSXLibs) elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS") _juce_get_metadata("${metadata_dict}" iOSFrameworks module_iosframeworks) + _juce_remove_empty_list_elements(module_iosframeworks) foreach(module_framework IN LISTS module_iosframeworks) - if(module_framework STREQUAL "") - continue() - endif() - _juce_link_frameworks("${module_name}" INTERFACE "${module_framework}") endforeach() + _juce_get_metadata("${metadata_dict}" WeakiOSFrameworks module_weakiosframeworks) + + _juce_remove_empty_list_elements(module_weakiosframeworks) + foreach(module_framework IN LISTS module_weakiosframeworks) + _juce_link_frameworks("${module_name}" INTERFACE WEAK "${module_framework}") + endforeach() + _juce_link_libs_from_metadata("${module_name}" "${metadata_dict}" iOSLibs) elseif((CMAKE_SYSTEM_NAME STREQUAL "Linux") OR (CMAKE_SYSTEM_NAME MATCHES ".*BSD")) _juce_get_metadata("${metadata_dict}" linuxPackages module_linuxpackages) diff -Nru juce-6.1.5~ds0/extras/Build/CMake/juce_runtime_arch_detection.cpp juce-7.0.0~ds0/extras/Build/CMake/juce_runtime_arch_detection.cpp --- juce-6.1.5~ds0/extras/Build/CMake/juce_runtime_arch_detection.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/CMake/juce_runtime_arch_detection.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -1,3 +1,28 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + #if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(_M_ARM64) || defined(__aarch64__) || defined(__ARM64__) #if defined(_M_ARM64) || defined(__aarch64__) || defined(__ARM64__) diff -Nru juce-6.1.5~ds0/extras/Build/CMake/JUCEUtils.cmake juce-7.0.0~ds0/extras/Build/CMake/JUCEUtils.cmake --- juce-6.1.5~ds0/extras/Build/CMake/JUCEUtils.cmake 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/CMake/JUCEUtils.cmake 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -75,6 +75,10 @@ BRIEF_DOCS "Install location for Unity plugins" FULL_DOCS "This is where the plugin will be copied if plugin copying is enabled") +define_property(TARGET PROPERTY JUCE_LV2_COPY_DIR INHERITED + BRIEF_DOCS "Install location for LV2 plugins" + FULL_DOCS "This is where the plugin will be copied if plugin copying is enabled") + define_property(TARGET PROPERTY JUCE_COPY_PLUGIN_AFTER_BUILD INHERITED BRIEF_DOCS "Whether or not plugins should be copied after building" FULL_DOCS "Whether or not plugins should be copied after building") @@ -97,10 +101,12 @@ function(_juce_set_default_properties) if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") - set_property(GLOBAL PROPERTY JUCE_VST_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/VST") - set_property(GLOBAL PROPERTY JUCE_VST3_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/VST3") - set_property(GLOBAL PROPERTY JUCE_AU_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/Components") - set_property(GLOBAL PROPERTY JUCE_AAX_COPY_DIR "/Library/Application Support/Avid/Audio/Plug-Ins") + set_property(GLOBAL PROPERTY JUCE_LV2_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/LV2") + set_property(GLOBAL PROPERTY JUCE_VST_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/VST") + set_property(GLOBAL PROPERTY JUCE_VST3_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/VST3") + set_property(GLOBAL PROPERTY JUCE_AU_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/Components") + set_property(GLOBAL PROPERTY JUCE_UNITY_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/Unity") + set_property(GLOBAL PROPERTY JUCE_AAX_COPY_DIR "/Library/Application Support/Avid/Audio/Plug-Ins") elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows") if(CMAKE_SIZEOF_VOID_P EQUAL 8) set_property(GLOBAL PROPERTY JUCE_VST_COPY_DIR "$ENV{ProgramW6432}/Steinberg/Vstplugins") @@ -110,11 +116,15 @@ set(prefix "$ENV{CommonProgramFiles\(x86\)}") endif() - set_property(GLOBAL PROPERTY JUCE_VST3_COPY_DIR "${prefix}/VST3") - set_property(GLOBAL PROPERTY JUCE_AAX_COPY_DIR "${prefix}/Avid/Audio/Plug-Ins") + set_property(GLOBAL PROPERTY JUCE_VST3_COPY_DIR "${prefix}/VST3") + set_property(GLOBAL PROPERTY JUCE_AAX_COPY_DIR "${prefix}/Avid/Audio/Plug-Ins") + set_property(GLOBAL PROPERTY JUCE_LV2_COPY_DIR "$ENV{APPDATA}/LV2") + set_property(GLOBAL PROPERTY JUCE_UNITY_COPY_DIR "$ENV{APPDATA}/Unity") elseif((CMAKE_SYSTEM_NAME STREQUAL "Linux") OR (CMAKE_SYSTEM_NAME MATCHES ".*BSD")) - set_property(GLOBAL PROPERTY JUCE_VST_COPY_DIR "$ENV{HOME}/.vst") - set_property(GLOBAL PROPERTY JUCE_VST3_COPY_DIR "$ENV{HOME}/.vst3") + set_property(GLOBAL PROPERTY JUCE_LV2_COPY_DIR "$ENV{HOME}/.lv2") + set_property(GLOBAL PROPERTY JUCE_VST_COPY_DIR "$ENV{HOME}/.vst") + set_property(GLOBAL PROPERTY JUCE_VST3_COPY_DIR "$ENV{HOME}/.vst3") + set_property(GLOBAL PROPERTY JUCE_UNITY_COPY_DIR "$ENV{HOME}/.unity") endif() endfunction() @@ -318,6 +328,10 @@ _juce_append_target_property(file_content APP_SANDBOX_INHERIT ${target} JUCE_APP_SANDBOX_INHERIT) _juce_append_target_property(file_content HARDENED_RUNTIME_OPTIONS ${target} JUCE_HARDENED_RUNTIME_OPTIONS) _juce_append_target_property(file_content APP_SANDBOX_OPTIONS ${target} JUCE_APP_SANDBOX_OPTIONS) + _juce_append_target_property(file_content APP_SANDBOX_FILE_ACCESS_HOME_RO ${target} JUCE_APP_SANDBOX_FILE_ACCESS_HOME_RO) + _juce_append_target_property(file_content APP_SANDBOX_FILE_ACCESS_HOME_RW ${target} JUCE_APP_SANDBOX_FILE_ACCESS_HOME_RW) + _juce_append_target_property(file_content APP_SANDBOX_FILE_ACCESS_ABS_RO ${target} JUCE_APP_SANDBOX_FILE_ACCESS_ABS_RO) + _juce_append_target_property(file_content APP_SANDBOX_FILE_ACCESS_ABS_RW ${target} JUCE_APP_SANDBOX_FILE_ACCESS_ABS_RW) _juce_append_target_property(file_content APP_GROUPS_ENABLED ${target} JUCE_APP_GROUPS_ENABLED) _juce_append_target_property(file_content APP_GROUP_IDS ${target} JUCE_APP_GROUP_IDS) _juce_append_target_property(file_content IS_PLUGIN ${target} JUCE_IS_PLUGIN) @@ -451,7 +465,7 @@ string(LENGTH "${str}" string_length) if(NOT "${string_length}" EQUAL "4") - message(FATAL_ERROR "The ${help_text} code must contain exactly four characters, but it was set to '${str}'") + message(WARNING "The ${help_text} code must contain exactly four characters, but it was set to '${str}'") endif() # Round-tripping through a file is the simplest way to convert a string to hex... @@ -463,7 +477,8 @@ file(READ "${scratch_file}" four_chars_hex HEX) file(REMOVE "${scratch_file}") - set(${out_var} ${four_chars_hex} PARENT_SCOPE) + string(SUBSTRING "${four_chars_hex}00000000" 0 8 four_chars_hex) + set(${out_var} "${four_chars_hex}" PARENT_SCOPE) endfunction() # ================================================================================================== @@ -501,10 +516,13 @@ message(FATAL_ERROR "juceaide was imported, but it doesn't exist!") endif() - execute_process(COMMAND "${juceaide_location}" ${ARGN} RESULT_VARIABLE result_variable) + execute_process(COMMAND "${juceaide_location}" ${ARGN} + RESULT_VARIABLE result_variable + OUTPUT_VARIABLE output + ERROR_VARIABLE output) if(result_variable) - message(FATAL_ERROR "Running juceaide failed") + message(FATAL_ERROR "Running juceaide failed:\n${output}") endif() endfunction() @@ -855,7 +873,15 @@ get_target_property(source "${target}" JUCE_PLUGIN_ARTEFACT_FILE) if(source) - get_target_property(dest "${target}" JUCE_PLUGIN_COPY_DIR) + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + add_custom_command(TARGET ${target} POST_BUILD + COMMAND "${CMAKE_COMMAND}" + "-Dsrc=${source}" + "-P" "${JUCE_CMAKE_UTILS_DIR}/checkBundleSigning.cmake" + VERBATIM) + endif() + + get_target_property(dest "${target}" JUCE_PLUGIN_COPY_DIR) if(dest) _juce_copy_dir("${target}" "${source}" "$") @@ -979,6 +1005,29 @@ "${script_file}" JUCE_UNITY_COPY_DIR) endif() + elseif(kind STREQUAL "LV2") + set_target_properties(${target_name} PROPERTIES BUNDLE FALSE) + + get_target_property(JUCE_LV2URI "${shared_code_target}" JUCE_LV2URI) + + if(NOT JUCE_LV2URI MATCHES "https?://.*") + message(WARNING + "LV2URI should be well-formed with an 'http' prefix. " + "Check the LV2URI argument to juce_add_plugin.") + endif() + + set(source_header "${JUCE_CMAKE_UTILS_DIR}/JuceLV2Defines.h.in") + get_target_property(juce_library_code "${shared_code_target}" JUCE_GENERATED_SOURCES_DIRECTORY) + configure_file("${source_header}" "${juce_library_code}/JuceLV2Defines.h") + + set(output_path "${products_folder}/${product_name}.lv2") + set_target_properties(${target_name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${output_path}") + + add_custom_command(TARGET ${target_name} POST_BUILD + COMMAND juce::juce_lv2_helper "$" + VERBATIM) + + _juce_set_copy_properties(${shared_code_target} ${target_name} "${output_path}" JUCE_LV2_COPY_DIR) endif() endfunction() @@ -1004,6 +1053,8 @@ set(${out_var} "AUv3 AppExtension" PARENT_SCOPE) elseif(kind STREQUAL "AAX") set(${out_var} "AAX" PARENT_SCOPE) + elseif(kind STREQUAL "LV2") + set(${out_var} "LV2" PARENT_SCOPE) elseif(kind STREQUAL "Standalone") set(${out_var} "Standalone Plugin" PARENT_SCOPE) elseif(kind STREQUAL "Unity") @@ -1064,7 +1115,10 @@ add_dependencies(${shared_code_target}_All ${target_name}) - _juce_configure_bundle(${shared_code_target} ${target_name}) + if(NOT kind STREQUAL "LV2") + _juce_configure_bundle(${shared_code_target} ${target_name}) + endif() + _juce_set_plugin_target_properties(${shared_code_target} ${kind}) endfunction() @@ -1183,7 +1237,13 @@ JucePlugin_AAXDisableBypass=$> JucePlugin_AAXDisableMultiMono=$> JucePlugin_VSTNumMidiInputs=$ - JucePlugin_VSTNumMidiOutputs=$) + JucePlugin_VSTNumMidiOutputs=$ + JucePlugin_Enable_ARA=$> + JucePlugin_ARAFactoryID=$ + JucePlugin_ARADocumentArchiveID=$ + JucePlugin_ARACompatibleArchiveIDs=$ + JucePlugin_ARAContentTypes=$ + JucePlugin_ARATransformationFlags=$) set_target_properties(${target} PROPERTIES POSITION_INDEPENDENT_CODE TRUE @@ -1458,6 +1518,90 @@ if(NOT aax_category_int STREQUAL "") set_target_properties(${target} PROPERTIES JUCE_AAX_CATEGORY ${aax_category_int}) endif() + + # Ensure this matches the Projucer implementation + get_target_property(company_website ${target} JUCE_COMPANY_WEBSITE) + get_target_property(plugin_name ${target} JUCE_PLUGIN_NAME) + string(MAKE_C_IDENTIFIER "${plugin_name}" plugin_name_sanitised) + _juce_set_property_if_not_set(${target} LV2URI "${company_website}/plugins/${plugin_name_sanitised}") + + # ARA configuration + # Analysis types + set(ara_analysis_type_strings + kARAContentTypeNotes + kARAContentTypeTempoEntries + kARAContentTypeBarSignatures + kARAContentTypeStaticTuning + kARAContentTypeKeySignatures + kARAContentTypeSheetChords) + + get_target_property(actual_ara_analysis_types ${target} JUCE_ARA_ANALYSIS_TYPES) + + set(ara_analysis_types_int "") + + foreach(category_string IN LISTS actual_ara_analysis_types) + list(FIND ara_analysis_type_strings ${category_string} ara_index) + + if(ara_index GREATER_EQUAL 0) + set(ara_analysis_types_bit "1 << ${ara_index}") + + if(ara_analysis_types_int STREQUAL "") + set(ara_analysis_types_int 0) + endif() + + math(EXPR ara_analysis_types_int "${ara_analysis_types_int} | (${ara_analysis_types_bit})") + endif() + endforeach() + + if(NOT ara_analysis_types_int STREQUAL "") + set_target_properties(${target} PROPERTIES JUCE_ARA_ANALYSIS_TYPES ${ara_analysis_types_int}) + endif() + + _juce_set_property_if_not_set(${target} ARA_ANALYSIS_TYPES 0) + + # Transformation flags + set(ara_transformation_flags_strings + kARAPlaybackTransformationNoChanges + kARAPlaybackTransformationTimestretch + kARAPlaybackTransformationTimestretchReflectingTempo + kARAPlaybackTransformationContentBasedFadeAtTail + kARAPlaybackTransformationContentBasedFadeAtHead) + + set(default_ara_transformation_flags kARAPlaybackTransformationNoChanges) + + _juce_set_property_if_not_set(${target} ARA_TRANSFORMATION_FLAGS ${default_ara_transformation_flags}) + + get_target_property(actual_ara_transformation_flags ${target} JUCE_ARA_TRANSFORMATION_FLAGS) + + set(ara_transformation_flags_int "") + + foreach(transformation_string IN LISTS actual_ara_transformation_flags) + list(FIND ara_transformation_flags_strings ${transformation_string} ara_transformation_index) + + if(ara_transformation_index GREATER_EQUAL 0) + if(ara_transformation_index EQUAL 0) + set(ara_transformation_bit 0) + else() + set(ara_transformation_bit "1 << (${ara_transformation_index} - 1)") + endif() + + if(ara_transformation_flags_int STREQUAL "") + set(ara_transformation_flags_int 0) + endif() + + math(EXPR ara_transformation_flags_int "${ara_transformation_flags_int} | (${ara_transformation_bit})") + endif() + endforeach() + + if(NOT ara_transformation_flags_int STREQUAL "") + set_target_properties(${target} PROPERTIES JUCE_ARA_TRANSFORMATION_FLAGS ${ara_transformation_flags_int}) + endif() + + _juce_set_property_if_not_set(${target} IS_ARA_EFFECT FALSE) + get_target_property(final_bundle_id ${target} JUCE_BUNDLE_ID) + _juce_set_property_if_not_set(${target} ARA_FACTORY_ID "\"${final_bundle_id}.arafactory.${final_version}\"") + _juce_set_property_if_not_set(${target} ARA_DOCUMENT_ARCHIVE_ID "\"${final_bundle_id}.aradocumentarchive.1\"") + _juce_set_property_if_not_set(${target} ARA_COMPATIBLE_ARCHIVE_IDS "\"\"") endfunction() # ================================================================================================== @@ -1524,6 +1668,10 @@ SUPPRESS_AU_PLIST_RESOURCE_USAGE PLUGINHOST_AU # Set this true if you want to host AU plugins USE_LEGACY_COMPATIBILITY_PLUGIN_CODE + LV2URI + IS_ARA_EFFECT + ARA_FACTORY_ID + ARA_DOCUMENT_ARCHIVE_ID VST_COPY_DIR VST3_COPY_DIR @@ -1537,11 +1685,18 @@ VST3_CATEGORIES HARDENED_RUNTIME_OPTIONS APP_SANDBOX_OPTIONS + APP_SANDBOX_FILE_ACCESS_HOME_RO + APP_SANDBOX_FILE_ACCESS_HOME_RW + APP_SANDBOX_FILE_ACCESS_ABS_RO + APP_SANDBOX_FILE_ACCESS_ABS_RW DOCUMENT_EXTENSIONS AAX_CATEGORY IPHONE_SCREEN_ORIENTATIONS # iOS only IPAD_SCREEN_ORIENTATIONS # iOS only - APP_GROUP_IDS) # iOS only + APP_GROUP_IDS # iOS only + ARA_COMPATIBLE_ARCHIVE_IDS + ARA_ANALYSIS_TYPES + ARA_TRANSFORMATION_FLAGS) cmake_parse_arguments(JUCE_ARG "" "${one_value_args}" "${multi_value_args}" ${ARGN}) @@ -1735,27 +1890,48 @@ NEEDS_STORE_KIT TRUE) endif() + if("JUCE_PLUGINHOST_AU=1" IN_LIST pip_moduleflags) + list(APPEND extra_target_args PLUGINHOST_AU TRUE) + endif() + if(pip_kind STREQUAL "AudioProcessor") - set(source_main "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in") + _juce_get_metadata("${metadata_dict}" documentControllerClass JUCE_PIP_DOCUMENTCONTROLLER_CLASS) - # We add AAX/VST2 targets too, if the user has set up those SDKs + if(JUCE_PIP_DOCUMENTCONTROLLER_CLASS) + if(NOT TARGET juce_ara_sdk) + message(WARNING + "${header} specifies a documentControllerClass, but the ARA SDK could not be located. " + "Use juce_set_ara_sdk_path to specify the ARA SDK location. " + "This PIP will not be configured.") + endif() - set(extra_formats) + set(source_main "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessorWithARA.cpp.in") - if(TARGET juce_aax_sdk) - list(APPEND extra_formats AAX) - endif() + juce_add_plugin(${JUCE_PIP_NAME} + FORMATS AU VST3 + IS_ARA_EFFECT TRUE) + else() + set(source_main "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in") - if(TARGET juce_vst2_sdk) - list(APPEND extra_formats VST) - endif() + # We add AAX/VST2 targets too, if the user has set up those SDKs - # Standalone plugins might want to access the mic - list(APPEND extra_target_args MICROPHONE_PERMISSION_ENABLED TRUE) + set(extra_formats) - juce_add_plugin(${JUCE_PIP_NAME} - FORMATS AU AUv3 VST3 Unity Standalone ${extra_formats} - ${extra_target_args}) + if(TARGET juce_aax_sdk) + list(APPEND extra_formats AAX) + endif() + + if(TARGET juce_vst2_sdk) + list(APPEND extra_formats VST) + endif() + + # Standalone plugins might want to access the mic + list(APPEND extra_target_args MICROPHONE_PERMISSION_ENABLED TRUE) + + juce_add_plugin(${JUCE_PIP_NAME} + FORMATS AU AUv3 LV2 Standalone Unity VST3 ${extra_formats} + ${extra_target_args}) + endif() elseif(pip_kind STREQUAL "Component") set(source_main "${JUCE_CMAKE_UTILS_DIR}/PIPComponent.cpp.in") juce_add_gui_app(${JUCE_PIP_NAME} ${extra_target_args}) @@ -1907,6 +2083,22 @@ target_include_directories(juce_vst3_sdk INTERFACE "${path}") endfunction() +function(juce_set_ara_sdk_path path) + if(TARGET juce_ara_sdk) + message(FATAL_ERROR "juce_set_ara_sdk_path should only be called once") + endif() + + _juce_make_absolute(path) + + if(NOT EXISTS "${path}") + message(FATAL_ERROR "Could not find ARA SDK at the specified path: ${path}") + endif() + + add_library(juce_ara_sdk INTERFACE IMPORTED GLOBAL) + + target_include_directories(juce_ara_sdk INTERFACE "${path}") +endfunction() + # ================================================================================================== function(juce_disable_default_flags) diff -Nru juce-6.1.5~ds0/extras/Build/CMake/PIPAudioProcessorWithARA.cpp.in juce-7.0.0~ds0/extras/Build/CMake/PIPAudioProcessorWithARA.cpp.in --- juce-6.1.5~ds0/extras/Build/CMake/PIPAudioProcessorWithARA.cpp.in 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/CMake/PIPAudioProcessorWithARA.cpp.in 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,23 @@ +/* + ============================================================================== + + This file was auto-generated and contains the startup code for a PIP. + + ============================================================================== +*/ + +#include +#include "${JUCE_PIP_HEADER}" + +//============================================================================== +juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() +{ + return new ${JUCE_PIP_MAIN_CLASS}(); +} + +#if JucePlugin_Enable_ARA +const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory() +{ + return juce::ARADocumentControllerSpecialisation::createARAFactory<${JUCE_PIP_DOCUMENTCONTROLLER_CLASS}>(); +} +#endif diff -Nru juce-6.1.5~ds0/extras/Build/CMakeLists.txt juce-7.0.0~ds0/extras/Build/CMakeLists.txt --- juce-6.1.5~ds0/extras/Build/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juceaide/CMakeLists.txt juce-7.0.0~ds0/extras/Build/juceaide/CMakeLists.txt --- juce-6.1.5~ds0/extras/Build/juceaide/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juceaide/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -53,10 +53,18 @@ # environment variables, which is unfortunate because we really don't want to cross-compile # juceaide. If you really want to set the compilers for juceaide, pass the appropriate # CMAKE__COMPILER flags when configuring CMake. - if((CMAKE_SYSTEM_NAME STREQUAL "Android") OR (CMAKE_SYSTEM_NAME STREQUAL "iOS")) + if(CMAKE_CROSSCOMPILING) unset(ENV{ASM}) unset(ENV{CC}) unset(ENV{CXX}) + else() + # When building with clang-cl in Clion on Windows for an x64 target, the ABI detection phase + # of the inner build can fail unless we pass through these flags too + set(extra_configure_flags + "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}" + "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}" + "-DCMAKE_EXE_LINKER_FLAGS=${CMAKE_EXE_LINKER_FLAGS}" + "-DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}") endif() message(STATUS "Configuring juceaide") @@ -70,6 +78,7 @@ "-DCMAKE_BUILD_TYPE=Debug" "-DJUCE_BUILD_HELPER_TOOLS=ON" "-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}" + ${extra_configure_flags} WORKING_DIRECTORY "${JUCE_SOURCE_DIR}" OUTPUT_VARIABLE command_output ERROR_VARIABLE command_output diff -Nru juce-6.1.5~ds0/extras/Build/juceaide/Main.cpp juce-7.0.0~ds0/extras/Build/juceaide/Main.cpp --- juce-6.1.5~ds0/extras/Build/juceaide/Main.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juceaide/Main.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -343,6 +343,29 @@ updateField ("APP_SANDBOX_OPTIONS", result.appSandboxOptions); updateField ("NETWORK_MULTICAST_ENABLED", result.isNetworkingMulticastEnabled); + struct SandboxTemporaryAccessKey + { + juce::String cMakeVar, key; + }; + + SandboxTemporaryAccessKey sandboxTemporaryAccessKeys[] + { + { "APP_SANDBOX_FILE_ACCESS_HOME_RO", "home-relative-path.read-only" }, + { "APP_SANDBOX_FILE_ACCESS_HOME_RW", "home-relative-path.read-write" }, + { "APP_SANDBOX_FILE_ACCESS_ABS_RO", "absolute-path.read-only" }, + { "APP_SANDBOX_FILE_ACCESS_ABS_RW", "absolute-path.read-write" } + }; + + for (const auto& entry : sandboxTemporaryAccessKeys) + { + juce::StringArray values; + updateField (entry.cMakeVar, values); + + if (! values.isEmpty()) + result.appSandboxTemporaryPaths.push_back ({ "com.apple.security.temporary-exception.files." + entry.key, + std::move (values) }); + } + result.type = type; return result; diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/juce_build_tools.cpp juce-7.0.0~ds0/extras/Build/juce_build_tools/juce_build_tools.cpp --- juce-6.1.5~ds0/extras/Build/juce_build_tools/juce_build_tools.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/juce_build_tools.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/juce_build_tools.h juce-7.0.0~ds0/extras/Build/juce_build_tools/juce_build_tools.h --- juce-6.1.5~ds0/extras/Build/juce_build_tools/juce_build_tools.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/juce_build_tools.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -34,7 +34,7 @@ ID: juce_build_tools vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE Build Tools description: Classes for generating intermediate files for JUCE projects. website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.cpp juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.cpp --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -135,7 +135,9 @@ cpp << "/* ==================================== " << resourceFileIdentifierString << " ===================================="; writeComment (cpp); - cpp << "namespace " << className << newLine + cpp << "#include " << newLine + << newLine + << "namespace " << className << newLine << "{" << newLine; while (i < files.size()) @@ -221,10 +223,8 @@ << "const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8)" << newLine << "{" << newLine << " for (unsigned int i = 0; i < (sizeof (namedResourceList) / sizeof (namedResourceList[0])); ++i)" << newLine - << " {" << newLine - << " if (namedResourceList[i] == resourceNameUTF8)" << newLine + << " if (strcmp (namedResourceList[i], resourceNameUTF8) == 0)" << newLine << " return originalFilenames[i];" << newLine - << " }" << newLine << newLine << " return nullptr;" << newLine << "}" << newLine diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.h juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.h --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.cpp juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.cpp --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -72,12 +72,13 @@ return "XPC!"; case Type::AAXPlugIn: - case Type::RTASPlugIn: return "TDMw"; case Type::ConsoleApp: case Type::StaticLibrary: case Type::DynamicLibrary: + case Type::LV2PlugIn: + case Type::LV2TurtleProgram: case Type::SharedCodeTarget: case Type::AggregateTarget: case Type::unspecified: @@ -102,12 +103,13 @@ return "????"; case Type::AAXPlugIn: - case Type::RTASPlugIn: return "PTul"; case Type::ConsoleApp: case Type::StaticLibrary: case Type::DynamicLibrary: + case Type::LV2PlugIn: + case Type::LV2TurtleProgram: case Type::SharedCodeTarget: case Type::AggregateTarget: case Type::unspecified: diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.h juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.h --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_CppTokeniserFunctions.cpp juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_CppTokeniserFunctions.cpp --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_CppTokeniserFunctions.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_CppTokeniserFunctions.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_Entitlements.cpp juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_Entitlements.cpp --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_Entitlements.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_Entitlements.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -79,7 +79,7 @@ if (isAppGroupsEnabled) { auto appGroups = StringArray::fromTokens (appGroupIdString, ";", {}); - auto groups = String (""); + String groups = ""; for (auto group : appGroups) groups += "\n\t\t" + group.trim() + ""; @@ -101,13 +101,27 @@ { // no other sandbox options can be specified if sandbox inheritance is enabled! jassert (appSandboxOptions.isEmpty()); + jassert (appSandboxTemporaryPaths.empty()); entitlements.set ("com.apple.security.inherit", ""); } if (isAppSandboxEnabled) + { for (auto& option : appSandboxOptions) entitlements.set (option, ""); + + for (auto& option : appSandboxTemporaryPaths) + { + String paths = ""; + + for (const auto& path : option.values) + paths += "\n\t\t" + path + ""; + + paths += "\n\t"; + entitlements.set (option.key, paths); + } + } } if (isNetworkingMulticastEnabled) diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_Entitlements.h juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_Entitlements.h --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_Entitlements.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_Entitlements.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -49,6 +49,14 @@ StringArray hardenedRuntimeOptions; StringArray appSandboxOptions; + struct KeyAndStringArray + { + String key; + StringArray values; + }; + + std::vector appSandboxTemporaryPaths; + private: StringPairArray getEntitlements() const; }; diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_Icons.cpp juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_Icons.cpp --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_Icons.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_Icons.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_Icons.h juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_Icons.h --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_Icons.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_Icons.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_PlistOptions.cpp juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_PlistOptions.cpp --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_PlistOptions.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_PlistOptions.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -327,6 +327,13 @@ addPlistDictionaryKey (*resourceUsageDict, "temporary-exception.files.all.read-write", true); } + if (isPluginARAEffect) + { + dict->createNewChildElement ("key")->addTextElement ("tags"); + auto* tagsArray = dict->createNewChildElement ("array"); + tagsArray->createNewChildElement ("string")->addTextElement ("ARA"); + } + return { plistKey, plistEntry }; } diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_PlistOptions.h juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_PlistOptions.h --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_PlistOptions.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_PlistOptions.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -93,6 +93,7 @@ bool isAuSandboxSafe = false; bool isPluginSynth = false; bool suppressResourceUsage = false; + bool isPluginARAEffect = false; private: void write (MemoryOutputStream&) const; diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_ProjectType.h juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_ProjectType.h --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_ProjectType.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_ProjectType.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -57,6 +57,7 @@ virtual bool isGUIApplication() const { return false; } virtual bool isCommandLineApp() const { return false; } virtual bool isAudioPlugin() const { return false; } + virtual bool isARAAudioPlugin() const { return false; } //============================================================================== struct Target @@ -71,15 +72,18 @@ VSTPlugIn = 10, VST3PlugIn = 11, AAXPlugIn = 12, - RTASPlugIn = 13, + AudioUnitPlugIn = 14, AudioUnitv3PlugIn = 15, StandalonePlugIn = 16, UnityPlugIn = 17, + LV2PlugIn = 18, SharedCodeTarget = 20, // internal AggregateTarget = 21, + LV2TurtleProgram = 25, // internal + unspecified = 30 }; @@ -110,12 +114,12 @@ case StandalonePlugIn: return "Standalone Plugin"; case AudioUnitv3PlugIn: return "AUv3 AppExtension"; case AAXPlugIn: return "AAX"; - case RTASPlugIn: return "RTAS"; case UnityPlugIn: return "Unity Plugin"; + case LV2PlugIn: return "LV2 Plugin"; case SharedCodeTarget: return "Shared Code"; case AggregateTarget: return "All"; - case unspecified: - default: break; + case LV2TurtleProgram: return "LV2 Manifest Helper"; + case unspecified: break; } return "undefined"; @@ -123,20 +127,21 @@ static Type typeFromName (const String& name) { - if (name == "App") return Type::GUIApp; - if (name == "ConsoleApp") return Type::ConsoleApp; - if (name == "Static Library") return Type::StaticLibrary; - if (name == "Dynamic Library") return Type::DynamicLibrary; - if (name == "VST") return Type::VSTPlugIn; - if (name == "VST3") return Type::VST3PlugIn; - if (name == "AU") return Type::AudioUnitPlugIn; - if (name == "Standalone Plugin") return Type::StandalonePlugIn; - if (name == "AUv3 AppExtension") return Type::AudioUnitv3PlugIn; - if (name == "AAX") return Type::AAXPlugIn; - if (name == "RTAS") return Type::RTASPlugIn; - if (name == "Unity Plugin") return Type::UnityPlugIn; - if (name == "Shared Code") return Type::SharedCodeTarget; - if (name == "All") return Type::AggregateTarget; + if (name == "App") return Type::GUIApp; + if (name == "ConsoleApp") return Type::ConsoleApp; + if (name == "Static Library") return Type::StaticLibrary; + if (name == "Dynamic Library") return Type::DynamicLibrary; + if (name == "VST") return Type::VSTPlugIn; + if (name == "VST3") return Type::VST3PlugIn; + if (name == "AU") return Type::AudioUnitPlugIn; + if (name == "Standalone Plugin") return Type::StandalonePlugIn; + if (name == "AUv3 AppExtension") return Type::AudioUnitv3PlugIn; + if (name == "AAX") return Type::AAXPlugIn; + if (name == "Unity Plugin") return Type::UnityPlugIn; + if (name == "LV2 Plugin") return Type::LV2PlugIn; + if (name == "Shared Code") return Type::SharedCodeTarget; + if (name == "All") return Type::AggregateTarget; + if (name == "LV2 Manifest Helper") return Type::LV2TurtleProgram; jassertfalse; return Type::ConsoleApp; @@ -156,12 +161,13 @@ case StandalonePlugIn: return executable; case AudioUnitv3PlugIn: return macOSAppex; case AAXPlugIn: return pluginBundle; - case RTASPlugIn: return pluginBundle; case UnityPlugIn: return pluginBundle; + case LV2PlugIn: return pluginBundle; case SharedCodeTarget: return staticLibrary; + case LV2TurtleProgram: return executable; case AggregateTarget: case unspecified: - default: break; + break; } return unknown; @@ -238,7 +244,43 @@ case Target::VSTPlugIn: case Target::VST3PlugIn: case Target::AAXPlugIn: - case Target::RTASPlugIn: + case Target::AudioUnitPlugIn: + case Target::AudioUnitv3PlugIn: + case Target::StandalonePlugIn: + case Target::UnityPlugIn: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: + case Target::SharedCodeTarget: + case Target::AggregateTarget: + return true; + + case Target::GUIApp: + case Target::ConsoleApp: + case Target::StaticLibrary: + case Target::DynamicLibrary: + case Target::unspecified: + break; + } + + return false; + } + }; + + struct ProjectType_ARAAudioPlugin : public ProjectType + { + ProjectType_ARAAudioPlugin() : ProjectType (getTypeName(), "ARA Audio Plug-in") {} + + static const char* getTypeName() noexcept { return "araaudioplug"; } + bool isAudioPlugin() const override { return true; } + bool isARAAudioPlugin() const override { return true; } + + bool supportsTargetType (Target::Type targetType) const override + { + switch (targetType) + { + case Target::VSTPlugIn: + case Target::VST3PlugIn: + case Target::AAXPlugIn: case Target::AudioUnitPlugIn: case Target::AudioUnitv3PlugIn: case Target::StandalonePlugIn: @@ -252,7 +294,8 @@ case Target::StaticLibrary: case Target::DynamicLibrary: case Target::unspecified: - default: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: break; } @@ -268,8 +311,9 @@ static ProjectType_StaticLibrary staticLib; static ProjectType_DLL dll; static ProjectType_AudioPlugin plugin; + static ProjectType_ARAAudioPlugin araplugin; - return Array(&guiApp, &consoleApp, &staticLib, &dll, &plugin); + return Array(&guiApp, &consoleApp, &staticLib, &dll, &plugin, &araplugin); } } } diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_RelativePath.h juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_RelativePath.h --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_RelativePath.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_RelativePath.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.cpp juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.cpp --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.h juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.h --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_ResourceRc.cpp juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_ResourceRc.cpp --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_ResourceRc.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_ResourceRc.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_ResourceRc.h juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_ResourceRc.h --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_ResourceRc.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_ResourceRc.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_VersionNumbers.cpp juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_VersionNumbers.cpp --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_VersionNumbers.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_VersionNumbers.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_VersionNumbers.h juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_VersionNumbers.h --- juce-6.1.5~ds0/extras/Build/juce_build_tools/utils/juce_VersionNumbers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Build/juce_build_tools/utils/juce_VersionNumbers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/CMakeLists.txt juce-7.0.0~ds0/extras/CMakeLists.txt --- juce-6.1.5~ds0/extras/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -23,9 +23,9 @@ enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEBUG=0]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEBUG=0]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) else() message( FATAL_ERROR "No matching build-configuration found." ) endif() @@ -51,6 +51,7 @@ "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" @@ -65,7 +66,6 @@ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" - "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" @@ -102,6 +102,7 @@ "../../../../../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/native/juce_mac_CoreAudioTimeConversions.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" @@ -144,9 +145,9 @@ "../../../../../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_SampleRateHelpers.cpp" "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" - "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" @@ -440,6 +441,8 @@ "../../../../../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_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.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" @@ -464,6 +467,116 @@ "../../../../../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/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" "../../../../../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" @@ -561,16 +674,27 @@ "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.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_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.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_VST3PluginFormat_test.cpp" "../../../../../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" @@ -599,6 +723,17 @@ "../../../../../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/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.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" @@ -612,6 +747,9 @@ "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" "../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" @@ -622,6 +760,8 @@ "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" @@ -673,9 +813,12 @@ "../../../../../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.cpp" "../../../../../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_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.h" "../../../../../modules/juce_core/containers/juce_PropertySet.cpp" @@ -689,6 +832,9 @@ "../../../../../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_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.h" "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" "../../../../../modules/juce_core/files/juce_DirectoryIterator.h" "../../../../../modules/juce_core/files/juce_File.cpp" @@ -755,6 +901,7 @@ "../../../../../modules/juce_core/misc/juce_Uuid.h" "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" "../../../../../modules/juce_core/native/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" "../../../../../modules/juce_core/native/juce_android_Files.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" @@ -982,6 +1129,7 @@ "../../../../../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_EventLoopInternal.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" @@ -1359,10 +1507,12 @@ "../../../../../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_PointerState.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/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" @@ -1394,13 +1544,13 @@ "../../../../../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_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" "../../../../../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" @@ -1543,8 +1693,8 @@ "../../../../../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_NSViewFrameWatcher.h" "../../../../../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" @@ -1617,6 +1767,8 @@ "../../../JuceLibraryCode/include_juce_audio_devices.cpp" "../../../JuceLibraryCode/include_juce_audio_formats.cpp" "../../../JuceLibraryCode/include_juce_audio_processors.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_ara.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp" "../../../JuceLibraryCode/include_juce_audio_utils.cpp" "../../../JuceLibraryCode/include_juce_core.cpp" "../../../JuceLibraryCode/include_juce_cryptography.cpp" @@ -1630,1584 +1782,1736 @@ "../../../JuceLibraryCode/JuceHeader.h" ) -set_source_files_properties("../../../Source/Demos.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/MasterComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/ClientComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/SharedCanvas.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/juce_icon.png" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Bela.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/assert.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/callback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/compat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/export.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_MathsFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_NormalisableRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Range.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Reservoir.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Functional.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/java/README.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Misc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_curl_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_intel_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_CFHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Files.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Network.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Strings.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Registry.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerSupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerWarnings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_PlatformDefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_StandardHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_TargetPlatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_NewLine.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringRef.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_CriticalSection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_InterProcessLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Process.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_SpinLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTestCategories.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/adler32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/compress.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/infback.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/uncompr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.in.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zlib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_BlowFish.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_BlowFish.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_Primes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_Primes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_RSAKey.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_RSAKey.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_MD5.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_MD5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_SHA256.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_SHA256.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Initialisation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Message.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_NotificationType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_android_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_EventLoop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Line.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Parallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Point.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ScaledImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_Justification.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_common_MimeTypes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_MessageBoxOptions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_HWNDComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Draggable3DOrientation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Matrix3D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Quaternion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Vector3D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_android.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_ios.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_linux_X11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_osx.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_win32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGLExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gl.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gles2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gles2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_khrplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_wgl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCArgument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCArgument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCBundle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCBundle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCMessage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCReceiver.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCSender.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCSender.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTimeTag.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTimeTag.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTypes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/juce_osc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/juce_osc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../JuceLibraryCode/BinaryData.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../JuceLibraryCode/JuceHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties( + "../../../Source/Demos.h" + "../../../Source/MasterComponent.h" + "../../../Source/ClientComponent.h" + "../../../Source/SharedCanvas.h" + "../../../Source/juce_icon.png" + "../../../../../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_AudioProcessLoadMeasurer.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.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/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.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/native/juce_mac_CoreAudioTimeConversions.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_ADSR_test.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" + "../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" + "../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" + "../../../../../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_basics/utilities/juce_WindowedSincInterpolator.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.mm" + "../../../../../modules/juce_audio_basics/juce_audio_basics.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_SampleRateHelpers.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" + "../../../../../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/oboe/include/oboe/AudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" + "../../../../../modules/juce_audio_devices/native/oboe/README.md" + "../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" + "../../../../../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.mm" + "../../../../../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_audio_devices/juce_audio_devices.cpp" + "../../../../../modules/juce_audio_devices/juce_audio_devices.mm" + "../../../../../modules/juce_audio_devices/juce_audio_devices.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/assert.h" + "../../../../../modules/juce_audio_formats/codecs/flac/callback.h" + "../../../../../modules/juce_audio_formats/codecs/flac/compat.h" + "../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" + "../../../../../modules/juce_audio_formats/codecs/flac/export.h" + "../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/flac/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.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_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.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/sampler/juce_Sampler.cpp" + "../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" + "../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" + "../../../../../modules/juce_audio_formats/juce_audio_formats.mm" + "../../../../../modules/juce_audio_formats/juce_audio_formats.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/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" + "../../../../../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/base/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/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/ivstparameterfunctionname.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/ivsttestplugprovider.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/vstspeaker.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" + "../../../../../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" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.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_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.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_VST3PluginFormat_test.cpp" + "../../../../../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/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_AudioProcessorEditorHostContext.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_HostedAudioProcessorParameter.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/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.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_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" + "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.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_KeyboardComponentBase.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" + "../../../../../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_win_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.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_audio_utils/juce_audio_utils.cpp" + "../../../../../modules/juce_audio_utils/juce_audio_utils.mm" + "../../../../../modules/juce_audio_utils/juce_audio_utils.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.cpp" + "../../../../../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_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" + "../../../../../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_SingleThreadedAbstractFifo.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_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.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_RangedDirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.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_Javascript.cpp" + "../../../../../modules/juce_core/javascript/juce_Javascript.h" + "../../../../../modules/juce_core/javascript/juce_JSON.cpp" + "../../../../../modules/juce_core/javascript/juce_JSON.h" + "../../../../../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_AllocationHooks.cpp" + "../../../../../modules/juce_core/memory/juce_AllocationHooks.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_Reservoir.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_Functional.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/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" + "../../../../../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_BasicNativeHeaders.h" + "../../../../../modules/juce_core/native/juce_curl_Network.cpp" + "../../../../../modules/juce_core/native/juce_intel_SharedCode.h" + "../../../../../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_CFHelpers.h" + "../../../../../modules/juce_core/native/juce_mac_Files.mm" + "../../../../../modules/juce_core/native/juce_mac_Network.mm" + "../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" + "../../../../../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_posix_IPAddress.h" + "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" + "../../../../../modules/juce_core/native/juce_posix_SharedCode.h" + "../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" + "../../../../../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_CompilerWarnings.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_CharacterFunctions.cpp" + "../../../../../modules/juce_core/text/juce_CharacterFunctions.h" + "../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF32.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.cpp" + "../../../../../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/zlib/adler32.c" + "../../../../../modules/juce_core/zip/zlib/compress.c" + "../../../../../modules/juce_core/zip/zlib/crc32.c" + "../../../../../modules/juce_core/zip/zlib/crc32.h" + "../../../../../modules/juce_core/zip/zlib/deflate.c" + "../../../../../modules/juce_core/zip/zlib/deflate.h" + "../../../../../modules/juce_core/zip/zlib/infback.c" + "../../../../../modules/juce_core/zip/zlib/inffast.c" + "../../../../../modules/juce_core/zip/zlib/inffast.h" + "../../../../../modules/juce_core/zip/zlib/inffixed.h" + "../../../../../modules/juce_core/zip/zlib/inflate.c" + "../../../../../modules/juce_core/zip/zlib/inflate.h" + "../../../../../modules/juce_core/zip/zlib/inftrees.c" + "../../../../../modules/juce_core/zip/zlib/inftrees.h" + "../../../../../modules/juce_core/zip/zlib/trees.c" + "../../../../../modules/juce_core/zip/zlib/trees.h" + "../../../../../modules/juce_core/zip/zlib/uncompr.c" + "../../../../../modules/juce_core/zip/zlib/zconf.h" + "../../../../../modules/juce_core/zip/zlib/zconf.in.h" + "../../../../../modules/juce_core/zip/zlib/zlib.h" + "../../../../../modules/juce_core/zip/zlib/zutil.c" + "../../../../../modules/juce_core/zip/zlib/zutil.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_core/juce_core.cpp" + "../../../../../modules/juce_core/juce_core.mm" + "../../../../../modules/juce_core/juce_core.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.mm" + "../../../../../modules/juce_cryptography/juce_cryptography.h" + "../../../../../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/undomanager/juce_UndoableAction.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.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_ValueTreePropertyWithDefault.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" + "../../../../../modules/juce_data_structures/juce_data_structures.cpp" + "../../../../../modules/juce_data_structures/juce_data_structures.mm" + "../../../../../modules/juce_data_structures/juce_data_structures.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/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_EventLoopInternal.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_ScopedLowPowerModeDisabler.cpp" + "../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.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_events/juce_events.cpp" + "../../../../../modules/juce_events/juce_events.mm" + "../../../../../modules/juce_events/juce_events.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_Rectangle_test.cpp" + "../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" + "../../../../../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/images/juce_ScaledImage.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_RenderingHelpers.h" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.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_graphics/juce_graphics.cpp" + "../../../../../modules/juce_graphics/juce_graphics.mm" + "../../../../../modules/juce_graphics/juce_graphics.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.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_ComponentTraverser.h" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.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_FilenameComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.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_ImagePreviewComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.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_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_FocusOutline.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.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_PointerState.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/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.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_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_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" + "../../../../../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_MultiTouchMapper.h" + "../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" + "../../../../../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_ScopedThreadDPIAwarenessSetter.h" + "../../../../../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_MessageBoxOptions.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_basics/juce_gui_basics.cpp" + "../../../../../modules/juce_gui_basics/juce_gui_basics.mm" + "../../../../../modules/juce_gui_basics/juce_gui_basics.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_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_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_HWNDComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" + "../../../../../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_android_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.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_NSViewComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" + "../../../../../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_HWNDComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.mm" + "../../../../../modules/juce_gui_extra/juce_gui_extra.h" + "../../../../../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/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/native/juce_OpenGLExtensions.h" + "../../../../../modules/juce_opengl/opengl/juce_gl.cpp" + "../../../../../modules/juce_opengl/opengl/juce_gl.h" + "../../../../../modules/juce_opengl/opengl/juce_gles2.cpp" + "../../../../../modules/juce_opengl/opengl/juce_gles2.h" + "../../../../../modules/juce_opengl/opengl/juce_khrplatform.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/opengl/juce_wgl.h" + "../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp" + "../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h" + "../../../../../modules/juce_opengl/juce_opengl.cpp" + "../../../../../modules/juce_opengl/juce_opengl.mm" + "../../../../../modules/juce_opengl/juce_opengl.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_osc/juce_osc.cpp" + "../../../../../modules/juce_osc/juce_osc.h" + "../../../JuceLibraryCode/BinaryData.h" + "../../../JuceLibraryCode/JuceHeader.h" + PROPERTIES HEADER_FILE_ONLY TRUE) target_compile_options( ${BINARY_NAME} PRIVATE "-fsigned-char" ) diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml 2022-06-21 07:56:28.000000000 +0000 @@ -1,10 +1,10 @@ + package="com.juce.networkgraphicsdemo"> - + diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj 2022-06-21 07:56:28.000000000 +0000 @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 006DF460F8DF66EFFA80D968 /* Icon.icns */ = {isa = PBXBuildFile; fileRef = 70F1CAF3C4C561DD81E6AFC1; }; 0977FEC02DAF29438583198A /* include_juce_core.mm */ = {isa = PBXBuildFile; fileRef = 01E0EEF68A11C1CAF180E173; }; + 0E39AB2B15DCE39E1055A646 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = AB2DE62887E2F58D821F3217; }; 0FA2A3321630EBE83E439D99 /* include_juce_cryptography.mm */ = {isa = PBXBuildFile; fileRef = AFF729977947528F3E4AAA96; }; 1282A62308CD1AC3F88A5D03 /* Images.xcassets */ = {isa = PBXBuildFile; fileRef = 5273768FBB55D0DD57A5E70C; }; 1F7A8BD2B43B3D191132301D /* CoreImage.framework */ = {isa = PBXBuildFile; fileRef = E51ABCA80B75F33848F28184; }; @@ -23,6 +24,7 @@ 770AB74B1D3A0108F764DD47 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = 4D1DB6D77B6F3DE7A569780B; }; 80EE2C27B466BAFD83881D3F /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 2E13A899F4E3C99054A3656F; }; 8ECB0767EE340DD83869E37D /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = EC794872987FEA2E129C589A; }; + 95C7D26CC68839FC6BF90AC3 /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = 52EF9BE720EFF47106DB0351; }; 987CBD5330E76B404F0D966C /* Main.cpp */ = {isa = PBXBuildFile; fileRef = 77C0AC21C1028911123844FC; }; 9EFD2AA2FFF3C125FDAA4279 /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = 7525879E73E8AF32FFA0CDDE; }; 9F618C008A503063D10076C4 /* BinaryData.cpp */ = {isa = PBXBuildFile; fileRef = 74711D7544168CCAC4969A07; }; @@ -59,6 +61,7 @@ 4D1DB6D77B6F3DE7A569780B /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; 4FF648D72D6F1A78956CDA1B /* Demos.h */ /* Demos.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Demos.h; path = ../../Source/Demos.h; sourceTree = SOURCE_ROOT; }; 5273768FBB55D0DD57A5E70C /* Images.xcassets */ /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = NetworkGraphicsDemo/Images.xcassets; sourceTree = SOURCE_ROOT; }; + 52EF9BE720EFF47106DB0351 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; 55CB060922ABCBC105FE38D2 /* juce_osc */ /* juce_osc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_osc; path = ../../../../modules/juce_osc; sourceTree = SOURCE_ROOT; }; 660F1970CF687A7AE8371C6D /* include_juce_opengl.mm */ /* include_juce_opengl.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_opengl.mm; path = ../../JuceLibraryCode/include_juce_opengl.mm; sourceTree = SOURCE_ROOT; }; 6799B056504F9F017998B9E2 /* CoreAudio.framework */ /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; @@ -82,6 +85,7 @@ 9E8129263CD42C6029FC2CAD /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; A505E1DABB2ED630EFBA96DB /* juce_audio_processors */ /* juce_audio_processors */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_processors; path = ../../../../modules/juce_audio_processors; sourceTree = SOURCE_ROOT; }; A7FF2B353C8568B5A7A80117 /* include_juce_graphics.mm */ /* include_juce_graphics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_graphics.mm; path = ../../JuceLibraryCode/include_juce_graphics.mm; sourceTree = SOURCE_ROOT; }; + AB2DE62887E2F58D821F3217 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; AED58461CE961C62A0E0A552 /* include_juce_audio_processors.mm */ /* include_juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_processors.mm; path = ../../JuceLibraryCode/include_juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; AF330F41D1A4865108690E3C /* include_juce_audio_devices.mm */ /* include_juce_audio_devices.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_devices.mm; path = ../../JuceLibraryCode/include_juce_audio_devices.mm; sourceTree = SOURCE_ROOT; }; AFF729977947528F3E4AAA96 /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; @@ -201,6 +205,8 @@ AF330F41D1A4865108690E3C, C6E2284D86D93F1D9D5C7666, AED58461CE961C62A0E0A552, + 52EF9BE720EFF47106DB0351, + AB2DE62887E2F58D821F3217, FCEBB157FB526741DB6791D1, 01E0EEF68A11C1CAF180E173, AFF729977947528F3E4AAA96, @@ -276,7 +282,7 @@ A5398ADB6F5B128C00EB935C = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { @@ -343,6 +349,8 @@ 6C2200C52B65E1BE80544E50, A1F34D09F4E4338775917ED1, 2E28F61A64DEF942FE7B94C4, + 95C7D26CC68839FC6BF90AC3, + 0E39AB2B15DCE39E1055A646, EA487FA4116517A8DFEE85B0, 0977FEC02DAF29438583198A, 0FA2A3321630EBE83E439D99, @@ -378,7 +386,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -402,10 +410,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -418,6 +426,7 @@ INSTALL_PATH = "$(HOME)/Applications"; LLVM_LTO = YES; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo; PRODUCT_NAME = "JUCE Network Graphics Demo"; USE_HEADERMAP = NO; @@ -545,7 +554,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -569,10 +578,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -584,6 +593,7 @@ INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo; PRODUCT_NAME = "JUCE Network Graphics Demo"; USE_HEADERMAP = NO; diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile 2022-06-21 07:56:28.000000000 +0000 @@ -11,6 +11,10 @@ # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,13 +60,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -74,6 +78,8 @@ $(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \ $(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o \ $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o \ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \ $(JUCE_OBJDIR)/include_juce_cryptography_8cb807a8.o \ @@ -90,8 +96,8 @@ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors alsa freetype2 libcurl + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors alsa freetype2 libcurl @echo Linking "NetworkGraphicsDemo - App" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) @@ -128,6 +134,16 @@ @echo "Compiling include_juce_audio_processors.cpp" $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" +$(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o: ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_ara.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o: ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_lv2_libs.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o: ../../JuceLibraryCode/include_juce_audio_utils.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling include_juce_audio_utils.cpp" diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj 2022-06-21 07:56:28.000000000 +0000 @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 006DF460F8DF66EFFA80D968 /* Icon.icns */ = {isa = PBXBuildFile; fileRef = 70F1CAF3C4C561DD81E6AFC1; }; 0977FEC02DAF29438583198A /* include_juce_core.mm */ = {isa = PBXBuildFile; fileRef = 01E0EEF68A11C1CAF180E173; }; + 0E39AB2B15DCE39E1055A646 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = AB2DE62887E2F58D821F3217; }; 0FA2A3321630EBE83E439D99 /* include_juce_cryptography.mm */ = {isa = PBXBuildFile; fileRef = AFF729977947528F3E4AAA96; }; 2E28F61A64DEF942FE7B94C4 /* include_juce_audio_processors.mm */ = {isa = PBXBuildFile; fileRef = AED58461CE961C62A0E0A552; }; 3717B9F9A0F7C9CB95F1BE7F /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = 7BE6330821794919A88ED8ED; }; @@ -22,13 +23,13 @@ 80B9F7ED2009922C693B7DD4 /* DiscRecording.framework */ = {isa = PBXBuildFile; fileRef = CB82A14817C3E2ABBBBC3864; }; 80EE2C27B466BAFD83881D3F /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 2E13A899F4E3C99054A3656F; }; 8ECB0767EE340DD83869E37D /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = EC794872987FEA2E129C589A; }; + 95C7D26CC68839FC6BF90AC3 /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = 52EF9BE720EFF47106DB0351; }; 987CBD5330E76B404F0D966C /* Main.cpp */ = {isa = PBXBuildFile; fileRef = 77C0AC21C1028911123844FC; }; 9EFD2AA2FFF3C125FDAA4279 /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = 7525879E73E8AF32FFA0CDDE; }; 9F618C008A503063D10076C4 /* BinaryData.cpp */ = {isa = PBXBuildFile; fileRef = 74711D7544168CCAC4969A07; }; A1F34D09F4E4338775917ED1 /* include_juce_audio_formats.mm */ = {isa = PBXBuildFile; fileRef = C6E2284D86D93F1D9D5C7666; }; B323E5E5FBD5663B21A8E623 /* OpenGL.framework */ = {isa = PBXBuildFile; fileRef = 996E743A20FC78671766BF59; }; BB9A9692D99DD0DDB1047B60 /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 6D1F9E505D20C09647124F0A; }; - BED88ADEA4DC91AA8C810FA8 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = 398A945EFD9ED923162982B1; }; C4D6C466C41173D6970553D2 /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = 9E8129263CD42C6029FC2CAD; }; C5E7BAD864E02CF37F7BD707 /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 33AA348465F512DBA8778DAF; }; C6348C6B1D0312580E97EA19 /* include_juce_osc.cpp */ = {isa = PBXBuildFile; fileRef = 3BF06B70407FFDBE9534F942; }; @@ -49,11 +50,11 @@ 25DEDA8C9F94A6C8DFC8E53E /* SharedCanvas.h */ /* SharedCanvas.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SharedCanvas.h; path = ../../Source/SharedCanvas.h; sourceTree = SOURCE_ROOT; }; 2E13A899F4E3C99054A3656F /* Accelerate.framework */ /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; 33AA348465F512DBA8778DAF /* include_juce_events.mm */ /* include_juce_events.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_events.mm; path = ../../JuceLibraryCode/include_juce_events.mm; sourceTree = SOURCE_ROOT; }; - 398A945EFD9ED923162982B1 /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; 3BF06B70407FFDBE9534F942 /* include_juce_osc.cpp */ /* include_juce_osc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_osc.cpp; path = ../../JuceLibraryCode/include_juce_osc.cpp; sourceTree = SOURCE_ROOT; }; 448838BE6E937D450A3C84CE /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; 4D1DB6D77B6F3DE7A569780B /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; 4FF648D72D6F1A78956CDA1B /* Demos.h */ /* Demos.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Demos.h; path = ../../Source/Demos.h; sourceTree = SOURCE_ROOT; }; + 52EF9BE720EFF47106DB0351 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; 55CB060922ABCBC105FE38D2 /* juce_osc */ /* juce_osc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_osc; path = ../../../../modules/juce_osc; sourceTree = SOURCE_ROOT; }; 660F1970CF687A7AE8371C6D /* include_juce_opengl.mm */ /* include_juce_opengl.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_opengl.mm; path = ../../JuceLibraryCode/include_juce_opengl.mm; sourceTree = SOURCE_ROOT; }; 6799B056504F9F017998B9E2 /* CoreAudio.framework */ /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; @@ -77,6 +78,7 @@ 9E8129263CD42C6029FC2CAD /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; A505E1DABB2ED630EFBA96DB /* juce_audio_processors */ /* juce_audio_processors */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_processors; path = ../../../../modules/juce_audio_processors; sourceTree = SOURCE_ROOT; }; A7FF2B353C8568B5A7A80117 /* include_juce_graphics.mm */ /* include_juce_graphics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_graphics.mm; path = ../../JuceLibraryCode/include_juce_graphics.mm; sourceTree = SOURCE_ROOT; }; + AB2DE62887E2F58D821F3217 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; AED58461CE961C62A0E0A552 /* include_juce_audio_processors.mm */ /* include_juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_processors.mm; path = ../../JuceLibraryCode/include_juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; AF330F41D1A4865108690E3C /* include_juce_audio_devices.mm */ /* include_juce_audio_devices.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_devices.mm; path = ../../JuceLibraryCode/include_juce_audio_devices.mm; sourceTree = SOURCE_ROOT; }; AFF729977947528F3E4AAA96 /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; @@ -105,7 +107,6 @@ files = ( 80EE2C27B466BAFD83881D3F, C4D6C466C41173D6970553D2, - BED88ADEA4DC91AA8C810FA8, 3C30D7C28C86F4054257DCD5, 67DF295E93E54432043126DF, 770AB74B1D3A0108F764DD47, @@ -149,7 +150,6 @@ children = ( 2E13A899F4E3C99054A3656F, 9E8129263CD42C6029FC2CAD, - 398A945EFD9ED923162982B1, C78806A6727F44EACFDED4A5, 6799B056504F9F017998B9E2, 4D1DB6D77B6F3DE7A569780B, @@ -190,6 +190,8 @@ AF330F41D1A4865108690E3C, C6E2284D86D93F1D9D5C7666, AED58461CE961C62A0E0A552, + 52EF9BE720EFF47106DB0351, + AB2DE62887E2F58D821F3217, FCEBB157FB526741DB6791D1, 01E0EEF68A11C1CAF180E173, AFF729977947528F3E4AAA96, @@ -265,7 +267,7 @@ A5398ADB6F5B128C00EB935C = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { @@ -331,6 +333,8 @@ 6C2200C52B65E1BE80544E50, A1F34D09F4E4338775917ED1, 2E28F61A64DEF942FE7B94C4, + 95C7D26CC68839FC6BF90AC3, + 0E39AB2B15DCE39E1055A646, EA487FA4116517A8DFEE85B0, 0977FEC02DAF29438583198A, 0FA2A3321630EBE83E439D99, @@ -365,7 +369,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -389,10 +393,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -406,6 +410,7 @@ LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.9; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo; PRODUCT_NAME = "JUCE Network Graphics Demo"; USE_HEADERMAP = NO; @@ -529,7 +534,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -553,10 +558,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -569,6 +574,7 @@ INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.9; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo; PRODUCT_NAME = "JUCE Network Graphics Demo"; USE_HEADERMAP = NO; diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -77,7 +77,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\JUCE Network Graphics Demo.exe @@ -105,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -118,7 +119,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\JUCE Network Graphics Demo.exe @@ -152,13 +154,13 @@ true - + true - + true - + true @@ -269,7 +271,7 @@ true - + true @@ -638,6 +640,9 @@ true + + true + true @@ -671,6 +676,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -740,15 +862,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -782,6 +922,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -800,6 +958,9 @@ true + + true + true @@ -812,6 +973,12 @@ true + + true + + + true + true @@ -878,9 +1045,15 @@ true + + true + true + + true + true @@ -896,6 +1069,9 @@ true + + true + true @@ -962,6 +1138,9 @@ true + + true + true @@ -1850,6 +2029,9 @@ true + + true + true @@ -1877,9 +2059,6 @@ true - - true - true @@ -2169,7 +2348,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2226,6 +2409,7 @@ + @@ -2414,6 +2598,7 @@ + @@ -2426,6 +2611,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2491,9 +2746,14 @@ + + + + + @@ -2514,6 +2774,11 @@ + + + + + @@ -2521,6 +2786,8 @@ + + @@ -2552,6 +2819,7 @@ + @@ -2560,6 +2828,8 @@ + + @@ -2721,6 +2991,7 @@ + @@ -2895,6 +3166,7 @@ + @@ -2918,6 +3190,7 @@ + @@ -2988,7 +3261,7 @@ - + @@ -3034,6 +3307,7 @@ + diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -140,6 +140,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -194,6 +320,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -484,13 +613,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -604,8 +733,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -979,6 +1108,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1015,6 +1147,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1084,6 +1333,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1093,9 +1348,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1129,6 +1396,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1147,6 +1432,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1162,6 +1450,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1243,9 +1537,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1261,6 +1561,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1327,6 +1630,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2257,6 +2563,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2293,9 +2602,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2641,6 +2947,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -2799,6 +3111,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3363,6 +3678,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3399,6 +3717,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3594,6 +4122,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3603,6 +4137,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3663,6 +4206,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3684,6 +4242,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -3777,6 +4341,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -3801,6 +4368,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4284,6 +4857,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -4806,6 +5382,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -4875,6 +5454,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5085,7 +5667,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -5219,6 +5801,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/CMakeLists.txt juce-7.0.0~ds0/extras/NetworkGraphicsDemo/CMakeLists.txt --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/JuceLibraryCode/BinaryData.cpp juce-7.0.0~ds0/extras/NetworkGraphicsDemo/JuceLibraryCode/BinaryData.cpp --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/JuceLibraryCode/BinaryData.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/JuceLibraryCode/BinaryData.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -4,6 +4,8 @@ */ +#include + namespace BinaryData { @@ -690,10 +692,8 @@ const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8) { for (unsigned int i = 0; i < (sizeof (namedResourceList) / sizeof (namedResourceList[0])); ++i) - { - if (namedResourceList[i] == resourceNameUTF8) + if (strcmp (namedResourceList[i], resourceNameUTF8) == 0) return originalFilenames[i]; - } return nullptr; } diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_ara.cpp juce-7.0.0~ds0/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_ara.cpp --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_ara.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_ara.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp juce-7.0.0~ds0/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Source/ClientComponent.h juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Source/ClientComponent.h --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Source/ClientComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Source/ClientComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Source/Demos.h juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Source/Demos.h --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Source/Demos.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Source/Demos.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -375,7 +375,7 @@ "Visual Studio, Android Studio, GCC and other compilers"); messages.add ("JUCE can be used to build desktop or mobile apps, and also\n" - "audio plug-ins in the VST2, VST3, AudioUnit, AAX and RTAS formats"); + "audio plug-ins in the VST2, VST3, AudioUnit and AAX formats"); } String getName() const override { return "Flock with text"; } diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Source/Main.cpp juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Source/Main.cpp --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Source/Main.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Source/Main.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Source/MasterComponent.h juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Source/MasterComponent.h --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Source/MasterComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Source/MasterComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Source/SharedCanvas.h juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Source/SharedCanvas.h --- juce-6.1.5~ds0/extras/NetworkGraphicsDemo/Source/SharedCanvas.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/NetworkGraphicsDemo/Source/SharedCanvas.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/LinuxMakefile/Makefile juce-7.0.0~ds0/extras/Projucer/Builds/LinuxMakefile/Makefile --- juce-6.1.5~ds0/extras/Projucer/Builds/LinuxMakefile/Makefile 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/LinuxMakefile/Makefile 2022-06-21 07:56:28.000000000 +0000 @@ -11,6 +11,10 @@ # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.0" "-DJUCE_APP_VERSION_HEX=0x70000" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := Projucer JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs freetype2) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,13 +60,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.0" "-DJUCE_APP_VERSION_HEX=0x70000" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := Projucer JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs freetype2) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -132,8 +136,8 @@ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors freetype2 + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors freetype2 @echo Linking "Projucer - App" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/MacOSX/Info-App.plist juce-7.0.0~ds0/extras/Projucer/Builds/MacOSX/Info-App.plist --- juce-6.1.5~ds0/extras/Projucer/Builds/MacOSX/Info-App.plist 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/MacOSX/Info-App.plist 2022-06-21 07:56:28.000000000 +0000 @@ -22,9 +22,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 6.1.5 + 7.0.0 CFBundleVersion - 6.1.5 + 7.0.0 NSHumanReadableCopyright Raw Material Software Limited NSHighResolutionCapable diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj juce-7.0.0~ds0/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj --- juce-6.1.5~ds0/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj 2022-06-21 07:56:28.000000000 +0000 @@ -17,7 +17,6 @@ 11D42F7EC6E6539D79A7F4B1 /* QuartzCore.framework */ = {isa = PBXBuildFile; fileRef = E5D6C36496F5BC84D7213BE8; }; 1321E6C1C6170B6C898AD09D /* Icon.icns */ = {isa = PBXBuildFile; fileRef = 951128CA33CCDEF570436B1C; }; 1B988E139004D8E2850EB656 /* jucer_PaintRoutine.cpp */ = {isa = PBXBuildFile; fileRef = C187718F7B9EBA88584B43F3; }; - 1E76E36772355E2A43CF4961 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = D00F311BFC3C2625C457CB9B; }; 209FCCC2155A1FCB7E11E20D /* jucer_JucerDocument.cpp */ = {isa = PBXBuildFile; fileRef = 269A454F1FF081DA67FFD578; }; 234B6BA2952CBC7C61EF70EF /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 5867DC4E39DF8539B54C0D59; }; 241F29FCBB7A17BB44A0B10C /* Cocoa.framework */ = {isa = PBXBuildFile; fileRef = D1F9B0E9F5D54FE48BEB46EA; }; @@ -112,6 +111,7 @@ 133F1E428260C5ADDF496DF9 /* jucer_ComponentLayout.cpp */ /* jucer_ComponentLayout.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ComponentLayout.cpp; path = ../../Source/ComponentEditor/jucer_ComponentLayout.cpp; sourceTree = SOURCE_ROOT; }; 16751E04B0F3737BDF52CEB4 /* jucer_HeaderComponent.h */ /* jucer_HeaderComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_HeaderComponent.h; path = ../../Source/Project/UI/jucer_HeaderComponent.h; sourceTree = SOURCE_ROOT; }; 169DD91232C070C4D6470B31 /* jucer_IconButton.h */ /* jucer_IconButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_IconButton.h; path = ../../Source/Utility/UI/jucer_IconButton.h; sourceTree = SOURCE_ROOT; }; + 18C82CBCEE30425A2481755D /* PIPAudioProcessorWithARA.cpp.in */ /* PIPAudioProcessorWithARA.cpp.in */ = {isa = PBXFileReference; lastKnownFileType = file.in; name = PIPAudioProcessorWithARA.cpp.in; path = ../../../Build/CMake/PIPAudioProcessorWithARA.cpp.in; sourceTree = SOURCE_ROOT; }; 191330B20DAC08B890656EA0 /* jucer_PIPGenerator.cpp */ /* jucer_PIPGenerator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_PIPGenerator.cpp; path = ../../Source/Utility/PIPs/jucer_PIPGenerator.cpp; sourceTree = SOURCE_ROOT; }; 1B0F18E1D96F727C062B05FA /* jucer_ProjectContentComponent.cpp */ /* jucer_ProjectContentComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ProjectContentComponent.cpp; path = ../../Source/Project/UI/jucer_ProjectContentComponent.cpp; sourceTree = SOURCE_ROOT; }; 1B5BCD4899A9E295786EB642 /* jucer_OpenDocumentManager.h */ /* jucer_OpenDocumentManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_OpenDocumentManager.h; path = ../../Source/CodeEditor/jucer_OpenDocumentManager.h; sourceTree = SOURCE_ROOT; }; @@ -134,6 +134,7 @@ 269A454F1FF081DA67FFD578 /* jucer_JucerDocument.cpp */ /* jucer_JucerDocument.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_JucerDocument.cpp; path = ../../Source/ComponentEditor/jucer_JucerDocument.cpp; sourceTree = SOURCE_ROOT; }; 2BD9B4556479A8A41740BCAE /* jucer_ComponentTemplate.h */ /* jucer_ComponentTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ComponentTemplate.h; path = ../../Source/BinaryData/Templates/jucer_ComponentTemplate.h; sourceTree = SOURCE_ROOT; }; 2CD34A70B4032C0426F7AA10 /* jucer_MainWindow.h */ /* jucer_MainWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_MainWindow.h; path = ../../Source/Application/jucer_MainWindow.h; sourceTree = SOURCE_ROOT; }; + 2E9CF857DCF1EFEA997B4D5B /* jucer_AudioPluginARAPlaybackRendererTemplate.h */ /* jucer_AudioPluginARAPlaybackRendererTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_AudioPluginARAPlaybackRendererTemplate.h; path = ../../Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.h; sourceTree = SOURCE_ROOT; }; 2EEB1C074162F363C6599282 /* jucer_CommandLine.h */ /* jucer_CommandLine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_CommandLine.h; path = ../../Source/Application/jucer_CommandLine.h; sourceTree = SOURCE_ROOT; }; 2F0A7CA808B2FCCC9ED68992 /* jucer_LicenseQueryThread.h */ /* jucer_LicenseQueryThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_LicenseQueryThread.h; path = ../../Source/Application/UserAccount/jucer_LicenseQueryThread.h; sourceTree = SOURCE_ROOT; }; 2F373F97E30AC1A0BFC1FC61 /* jucer_FilePropertyComponent.h */ /* jucer_FilePropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_FilePropertyComponent.h; path = ../../Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h; sourceTree = SOURCE_ROOT; }; @@ -180,7 +181,6 @@ 5432B7B9B2CF2EAEC8B66D5C /* jucer_UtilityFunctions.h */ /* jucer_UtilityFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_UtilityFunctions.h; path = ../../Source/ComponentEditor/jucer_UtilityFunctions.h; sourceTree = SOURCE_ROOT; }; 5524B5C9FC6AEAA670B92AA9 /* jucer_ComponentLayoutEditor.h */ /* jucer_ComponentLayoutEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ComponentLayoutEditor.h; path = ../../Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h; sourceTree = SOURCE_ROOT; }; 56177921580A4855917E0205 /* jucer_AudioPluginEditorTemplate.h */ /* jucer_AudioPluginEditorTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_AudioPluginEditorTemplate.h; path = ../../Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.h; sourceTree = SOURCE_ROOT; }; - 56749E4C72A8F51ACA8F2330 /* export_clion.svg */ /* export_clion.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = export_clion.svg; path = ../../Source/BinaryData/Icons/export_clion.svg; sourceTree = SOURCE_ROOT; }; 576A92E1E0D8F453EC0FEB34 /* gradlew.bat */ /* gradlew.bat */ = {isa = PBXFileReference; lastKnownFileType = file.bat; name = gradlew.bat; path = ../../Source/BinaryData/gradle/gradlew.bat; sourceTree = SOURCE_ROOT; }; 5783563E39E48ADFC68EB84A /* jucer_ComponentTextProperty.h */ /* jucer_ComponentTextProperty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ComponentTextProperty.h; path = ../../Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h; sourceTree = SOURCE_ROOT; }; 582F659B801F656C2B7C51B1 /* jucer_Modules.h */ /* jucer_Modules.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_Modules.h; path = ../../Source/Project/Modules/jucer_Modules.h; sourceTree = SOURCE_ROOT; }; @@ -238,6 +238,7 @@ 8D9A9A373E4621F7CBFCCCEF /* jucer_ContentCompTemplate.cpp */ /* jucer_ContentCompTemplate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ContentCompTemplate.cpp; path = ../../Source/BinaryData/Templates/jucer_ContentCompTemplate.cpp; sourceTree = SOURCE_ROOT; }; 8DBB36126CD144A8364F1F19 /* jucer_ProjectExporter.h */ /* jucer_ProjectExporter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectExporter.h; path = ../../Source/ProjectSaving/jucer_ProjectExporter.h; sourceTree = SOURCE_ROOT; }; 8DFE6D8AFB8057790041300B /* jucer_ToggleButtonHandler.h */ /* jucer_ToggleButtonHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ToggleButtonHandler.h; path = ../../Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h; sourceTree = SOURCE_ROOT; }; + 8E129499EA2FB8A4944F8701 /* jucer_AudioPluginARADocumentControllerTemplate.h */ /* jucer_AudioPluginARADocumentControllerTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_AudioPluginARADocumentControllerTemplate.h; path = ../../Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h; sourceTree = SOURCE_ROOT; }; 8F30A53C7FE4BC65171FB3E2 /* jucer_JucerDocument.h */ /* jucer_JucerDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_JucerDocument.h; path = ../../Source/ComponentEditor/jucer_JucerDocument.h; sourceTree = SOURCE_ROOT; }; 8F4D281E98808204E2846A7D /* export_xcode.svg */ /* export_xcode.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = export_xcode.svg; path = ../../Source/BinaryData/Icons/export_xcode.svg; sourceTree = SOURCE_ROOT; }; 8F67F3C0492EAFEBDBBC12DB /* jucer_NewCppFileTemplate.cpp */ /* jucer_NewCppFileTemplate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_NewCppFileTemplate.cpp; path = ../../Source/BinaryData/Templates/jucer_NewCppFileTemplate.cpp; sourceTree = SOURCE_ROOT; }; @@ -246,10 +247,12 @@ 8FEF6F5EA676B824C021EB6F /* wizard_AnimatedApp.svg */ /* wizard_AnimatedApp.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = wizard_AnimatedApp.svg; path = ../../Source/BinaryData/Icons/wizard_AnimatedApp.svg; sourceTree = SOURCE_ROOT; }; 8FF26BF72A522FBEAAFDDF54 /* wizard_AudioApp.svg */ /* wizard_AudioApp.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = wizard_AudioApp.svg; path = ../../Source/BinaryData/Icons/wizard_AudioApp.svg; sourceTree = SOURCE_ROOT; }; 9069981E414A631B036CC9AC /* jucer_MainWindow.cpp */ /* jucer_MainWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_MainWindow.cpp; path = ../../Source/Application/jucer_MainWindow.cpp; sourceTree = SOURCE_ROOT; }; + 921D263A2EAFD96C8D389693 /* JuceLV2Defines.h.in */ /* JuceLV2Defines.h.in */ = {isa = PBXFileReference; lastKnownFileType = file.in; name = JuceLV2Defines.h.in; path = ../../../Build/CMake/JuceLV2Defines.h.in; sourceTree = SOURCE_ROOT; }; 92926A4D3CC4BB2A9D35EB0B /* jucer_UTF8WindowComponent.h */ /* jucer_UTF8WindowComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_UTF8WindowComponent.h; path = ../../Source/Application/Windows/jucer_UTF8WindowComponent.h; sourceTree = SOURCE_ROOT; }; 92A66A8BD87F98EB6B4FB6D0 /* jucer_ProjectContentComponent.h */ /* jucer_ProjectContentComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectContentComponent.h; path = ../../Source/Project/UI/jucer_ProjectContentComponent.h; sourceTree = SOURCE_ROOT; }; 94146B40B41BF0AACF4359DD /* jucer_LicenseState.h */ /* jucer_LicenseState.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_LicenseState.h; path = ../../Source/Application/UserAccount/jucer_LicenseState.h; sourceTree = SOURCE_ROOT; }; 951128CA33CCDEF570436B1C /* Icon.icns */ /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = SOURCE_ROOT; }; + 96A1EC6B50DBD2C526C60338 /* jucer_AudioPluginARADocumentControllerTemplate.cpp */ /* jucer_AudioPluginARADocumentControllerTemplate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_AudioPluginARADocumentControllerTemplate.cpp; path = ../../Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.cpp; sourceTree = SOURCE_ROOT; }; 983CFBA01CA8811F30FA7F4C /* jucer_MiscUtilities.h */ /* jucer_MiscUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_MiscUtilities.h; path = ../../Source/Utility/Helpers/jucer_MiscUtilities.h; sourceTree = SOURCE_ROOT; }; 988F5C1E40DED02D8B064253 /* jucer_PaintElementGroup.cpp */ /* jucer_PaintElementGroup.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_PaintElementGroup.cpp; path = ../../Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp; sourceTree = SOURCE_ROOT; }; 9914F905BFCFBE5F76619670 /* jucer_ColouredElement.h */ /* jucer_ColouredElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ColouredElement.h; path = ../../Source/ComponentEditor/PaintElements/jucer_ColouredElement.h; sourceTree = SOURCE_ROOT; }; @@ -313,14 +316,12 @@ CCD62DB0A19A985A4B9D7F32 /* jucer_ProjectExport_Android.h */ /* jucer_ProjectExport_Android.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectExport_Android.h; path = ../../Source/ProjectSaving/jucer_ProjectExport_Android.h; sourceTree = SOURCE_ROOT; }; CD267A28C16C4E79EB749005 /* gpl_logo.svg */ /* gpl_logo.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = gpl_logo.svg; path = ../../Source/BinaryData/Icons/gpl_logo.svg; sourceTree = SOURCE_ROOT; }; CF6C8BD0DA3D8CD4E99EBADA /* WebKit.framework */ /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; - D00F311BFC3C2625C457CB9B /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; D045BD5943BD38F2720FF5F0 /* jucer_FontPropertyComponent.h */ /* jucer_FontPropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_FontPropertyComponent.h; path = ../../Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h; sourceTree = SOURCE_ROOT; }; D05BD91B6105827B010E1C20 /* juce_gui_extra */ /* juce_gui_extra */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_gui_extra; path = ../../../../modules/juce_gui_extra; sourceTree = SOURCE_ROOT; }; D1739728A79A2062418B8EF0 /* wizard_StaticLibrary.svg */ /* wizard_StaticLibrary.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = wizard_StaticLibrary.svg; path = ../../Source/BinaryData/Icons/wizard_StaticLibrary.svg; sourceTree = SOURCE_ROOT; }; D1F9B0E9F5D54FE48BEB46EA /* Cocoa.framework */ /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; D4EB334E5186D1584EC63CA4 /* jucer_AudioComponentSimpleTemplate.h */ /* jucer_AudioComponentSimpleTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_AudioComponentSimpleTemplate.h; path = ../../Source/BinaryData/Templates/jucer_AudioComponentSimpleTemplate.h; sourceTree = SOURCE_ROOT; }; D5795F8CAC5876714DAB355F /* jucer_AnimatedComponentTemplate.h */ /* jucer_AnimatedComponentTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_AnimatedComponentTemplate.h; path = ../../Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.h; sourceTree = SOURCE_ROOT; }; - D5EF5961B1F0E3FAED32E30A /* jucer_ProjectExport_CLion.h */ /* jucer_ProjectExport_CLion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectExport_CLion.h; path = ../../Source/ProjectSaving/jucer_ProjectExport_CLion.h; sourceTree = SOURCE_ROOT; }; D6390A40B3279E0E626C78D3 /* jucer_ColouredElement.cpp */ /* jucer_ColouredElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ColouredElement.cpp; path = ../../Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp; sourceTree = SOURCE_ROOT; }; D766BB9D8C32B5560F0493F3 /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; D91E7F8FEF9290195D56782C /* jucer_EditorColourSchemeWindowComponent.h */ /* jucer_EditorColourSchemeWindowComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_EditorColourSchemeWindowComponent.h; path = ../../Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h; sourceTree = SOURCE_ROOT; }; @@ -360,6 +361,7 @@ F30DF63DBEFA4BEEF7C369FC /* jucer_LicenseController.h */ /* jucer_LicenseController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_LicenseController.h; path = ../../Source/Application/UserAccount/jucer_LicenseController.h; sourceTree = SOURCE_ROOT; }; F313EE01ECE306DB2CFE011D /* UnityPluginGUIScript.cs.in */ /* UnityPluginGUIScript.cs.in */ = {isa = PBXFileReference; lastKnownFileType = file.in; name = UnityPluginGUIScript.cs.in; path = ../../../Build/CMake/UnityPluginGUIScript.cs.in; sourceTree = SOURCE_ROOT; }; F3CC8F26ECCDA6DCD8A284D2 /* jucer_GradientPointComponent.h */ /* jucer_GradientPointComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_GradientPointComponent.h; path = ../../Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h; sourceTree = SOURCE_ROOT; }; + F3CCA5545AB7B4B603D0BFEB /* jucer_AudioPluginARAPlaybackRendererTemplate.cpp */ /* jucer_AudioPluginARAPlaybackRendererTemplate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_AudioPluginARAPlaybackRendererTemplate.cpp; path = ../../Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp; sourceTree = SOURCE_ROOT; }; F4FD9BD16ED2700F45A68C4F /* jucer_ComponentBooleanProperty.h */ /* jucer_ComponentBooleanProperty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ComponentBooleanProperty.h; path = ../../Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h; sourceTree = SOURCE_ROOT; }; F58B23995765C9FDBE28F871 /* jucer_Modules.cpp */ /* jucer_Modules.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_Modules.cpp; path = ../../Source/Project/Modules/jucer_Modules.cpp; sourceTree = SOURCE_ROOT; }; F5DD97B45B8EA60C1ED0DD80 /* jucer_StoredSettings.cpp */ /* jucer_StoredSettings.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_StoredSettings.cpp; path = ../../Source/Settings/jucer_StoredSettings.cpp; sourceTree = SOURCE_ROOT; }; @@ -389,7 +391,6 @@ A578EAD4BB55680E8097BE0F, C1B9334AE849F93FB3C56B34, A14C2C2725DA3CA7995D2815, - 1E76E36772355E2A43CF4961, 241F29FCBB7A17BB44A0B10C, 9359F9401D59B4517F75C39C, 091A57B4B9CE623E75E9A756, @@ -441,7 +442,6 @@ 80D62B907248523E6943298B, 5A75806B34E4EA6598A6024A, 210CD22F25F2C22F9CEEB025, - D00F311BFC3C2625C457CB9B, D1F9B0E9F5D54FE48BEB46EA, 728FE25157E9874D50BBECB2, E983E6DDE3318B872EBE347F, @@ -607,7 +607,6 @@ isa = PBXGroup; children = ( CCD62DB0A19A985A4B9D7F32, - D5EF5961B1F0E3FAED32E30A, FA790C59A304579F660F112F, 59520B8137E6A2E483074399, FF68231DE2B395461009116C, @@ -664,6 +663,10 @@ D4EB334E5186D1584EC63CA4, 203FA6AD7EDDF1F9C338CC2A, 5BF0374EB908F0476BD8ED42, + 96A1EC6B50DBD2C526C60338, + 8E129499EA2FB8A4944F8701, + F3CCA5545AB7B4B603D0BFEB, + 2E9CF857DCF1EFEA997B4D5B, 6574A50A8997799705B23465, 56177921580A4855917E0205, 079802C6AEE7646010766FE8, @@ -807,7 +810,6 @@ children = ( 514F2FAFDBF535AC03FA2E6C, 807049CA2D5B6DE18EA078F2, - 56749E4C72A8F51ACA8F2330, 42F4AA3EF0883D506987CA99, 69B478C992FA0B8C885946A6, EAC1731150A7F79D59BAA0B6, @@ -846,8 +848,10 @@ DC3A4B0AD79334BA8A7E0661 /* BinaryData */ = { isa = PBXGroup; children = ( + 921D263A2EAFD96C8D389693, 50F89D3827B83B48855B3564, A0ECDAF137029C445910D3ED, + 18C82CBCEE30425A2481755D, 463C8CF42FAA00014198B71B, F84D031B2A6BB1EE6A316C71, 233C7FC5157176DB33FE2F27, @@ -987,7 +991,7 @@ 74EA481348A24104E6ACE009 = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 0039FE1A254FE518518BF8B8 = { @@ -1129,7 +1133,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_build_tools=1", "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_MODULE_AVAILABLE_juce_cryptography=1", @@ -1147,16 +1151,16 @@ "JUCE_WEB_BROWSER=0", "JUCE_STANDALONE_APPLICATION=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=6.1.5", - "JUCE_APP_VERSION_HEX=0x60105", + "JUCE_APP_VERSION=7.0.0", + "JUCE_APP_VERSION_HEX=0x70000", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -1170,8 +1174,9 @@ INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../Build $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.theprojucer; PRODUCT_NAME = "Projucer"; USE_HEADERMAP = NO; @@ -1198,7 +1203,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_build_tools=1", "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_MODULE_AVAILABLE_juce_cryptography=1", @@ -1216,16 +1221,16 @@ "JUCE_WEB_BROWSER=0", "JUCE_STANDALONE_APPLICATION=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=6.1.5", - "JUCE_APP_VERSION_HEX=0x60105", + "JUCE_APP_VERSION=7.0.0", + "JUCE_APP_VERSION_HEX=0x70000", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -1239,8 +1244,9 @@ INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../Build $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.theprojucer; PRODUCT_NAME = "Projucer"; USE_HEADERMAP = NO; Binary files /tmp/tmp3xyzf76u/FU8JCLV1je/juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2015/icon.ico and /tmp/tmp3xyzf76u/WWZuZyRX_p/juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2015/icon.ico differ diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,2177 +0,0 @@ - - - - - - Debug - x64 - - - Release - x64 - - - - {E4CFCE31-1AF5-C360-751D-9682E333BE4D} - - - - Application - false - false - v140 - 8.1 - - - Application - false - false - v140 - 8.1 - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - .exe - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - Projucer - true - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - Projucer - true - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Disabled - ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - true - NotUsing - $(IntDir)\ - $(IntDir)\ - $(IntDir)\Projucer.pdb - Level4 - true - true - /bigobj %(AdditionalOptions) - stdcpp14 - - - _DEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\Projucer.exe - true - libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) - true - $(IntDir)\Projucer.pdb - Windows - true - - - true - $(IntDir)\Projucer.bsc - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Full - ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreaded - true - NotUsing - $(IntDir)\ - $(IntDir)\ - $(IntDir)\Projucer.pdb - Level4 - true - true - /bigobj %(AdditionalOptions) - stdcpp14 - - - NDEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\Projucer.exe - true - %(IgnoreSpecificDefaultLibraries) - false - $(IntDir)\Projucer.pdb - Windows - true - true - true - - - true - $(IntDir)\Projucer.bsc - - - - - - - - true - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - /bigobj %(AdditionalOptions) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 @@ -1,3872 +0,0 @@ - - - - - - {1E1D2D75-0ADA-6E9E-105F-2F87632B55AF} - - - {DA27985D-8427-CE70-CA06-EAF7009CCC60} - - - {DC7E18A5-E854-3D99-627F-AAA88246B712} - - - {4F8BCD36-CE20-D951-FB82-2CCEDD0C5898} - - - {661FA330-2192-FAA3-E7B2-FAF8EBB783C6} - - - {3A77FAA0-7E92-6D59-9C5F-BAAA2BF82833} - - - {D8DD148A-AB2B-B485-520B-8924DA606099} - - - {FE290DF2-C600-4159-D484-7F48DB498EBE} - - - {DE3E40F0-B495-2AC0-52AF-AA073FFE8E4C} - - - {A61A4546-CC78-CCFD-CC99-D5CD03650B08} - - - {485EE240-BE7D-E5FD-07C2-760B7401D5F3} - - - {35957741-E3A5-47F8-86DC-FDE691866C74} - - - {16DF510D-120E-D924-C478-E1E82643ED83} - - - {3207865A-047C-278E-870A-BC204B74ECB3} - - - {5F21E507-E5E8-0A74-F1AE-874BB67C26CC} - - - {F5C79836-30DE-9DC7-9392-DAAB3F04C18E} - - - {A0A94AE6-B447-151A-D0DA-FAE9B5410EBF} - - - {D2E33EF7-EDDC-06BA-9343-EF957E30A158} - - - {BBF7BD20-FB7D-59E5-D1DD-3E6F1455CA02} - - - {C4676327-23FA-ED8F-1881-BC5E53840936} - - - {FAD9788E-4FE6-172B-0E32-913C0C8FC2FB} - - - {A353D068-8C43-A573-8460-59B6BA167F83} - - - {A4B9C07E-05B1-BCE9-E075-7E573FFD23B0} - - - {ACCBC32A-58D5-1EC6-FC4D-B3B32CB6588E} - - - {A90A32B8-1A07-8900-6E90-EC981F56EC9D} - - - {F77CA057-8DE4-E076-7EB6-D2646794864B} - - - {7DBEF27C-2AFE-DA02-1DBF-E80FAAC99EA7} - - - {D9FAFF6D-6737-F775-056A-D0B29BE13820} - - - {065C11E4-EB37-5B72-0A01-F549675EB866} - - - {42F7BE9D-3C8A-AE26-289B-8F355C068036} - - - {7868764A-6572-381A-906C-9C26792A4C29} - - - {03678508-A517-48BB-FB4A-485628C34E08} - - - {07D27C1D-3227-F527-356C-17DA11551A99} - - - {6146D580-99D2-A6C8-5908-30DC355BB6BA} - - - {C67003E8-BEA8-2188-F4B3-A122F4B4FA3F} - - - {09B91E68-1FF4-C7ED-9055-D4D96E66A0BA} - - - {30B3DA63-C1E4-F2EA-CEF0-8035D8CBFF64} - - - {4F24EEED-AA33-AC6C-9A39-72E71CF83EF0} - - - {0F70B1A9-BB50-23F5-2AE7-F95E51A00389} - - - {D4C8DC40-2CD2-04B6-05D0-1E7A88841390} - - - {58BED6AF-DB89-7560-B2B8-D937C1C0825A} - - - {B958F86B-6926-8D9B-2FC6-8BFD4BDC72C9} - - - {DB624F7D-D513-25AC-C13C-B9062EB3BEEE} - - - {89AA9B6C-4029-A34F-C1B0-3B5D8691F4D4} - - - {1A7F541C-B032-9C66-C320-A13B2A8A9866} - - - {4BAB7C18-51AB-0D9D-83CD-9C37F28D2E38} - - - {5523922E-8B0C-A52B-477C-752C09F8197F} - - - {857B6D8B-0ECB-FE9E-D1EB-D5E45E72F057} - - - {BAA582FA-40B7-320E-EE7A-4C3892C7BE72} - - - {89B3E447-34BE-C691-638E-09796C6B647E} - - - {9BE78436-DBF4-658C-579B-ED19FFD0EB5D} - - - {21E7FA61-9E0A-4BA1-04B7-AF47AFA9CB8B} - - - {632B4C79-AF7D-BFB5-D006-5AE67F607130} - - - {B10E20C2-4583-2B79-60B7-FE4D4B044313} - - - {CFB54F15-8A8A-0505-9B7F-ECA41CEE38E8} - - - {911F0159-A7A8-4A43-3FD4-154F62F4A44B} - - - {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} - - - {3FDCD000-763F-8477-9AF8-70ABA2E91E5E} - - - {0947506F-66FA-EF8D-8A4E-4D48BCDBB226} - - - {E4B6AED3-F54C-3FF2-069F-640BACAE0E08} - - - {D5EADBCC-6A1C-C940-0206-26E49110AF08} - - - {D27DC92D-5BEB-9294-DCD1-81D54E245AD5} - - - {BCD73D20-42B1-6CDB-DE66-B06236A60F47} - - - {20DC13F6-2369-8841-9F0B-D13FA14EEE74} - - - {A302A8DB-120F-9EBB-A3D5-2C29963AA56B} - - - {45489C2A-6E0E-CCDC-6638-0DACEEB63CCA} - - - {F1B90726-DB55-0293-BFAF-C65C7DF5489C} - - - {2C55FD42-0ACD-B0B8-7EAE-EB17F09BAEEC} - - - {B68CD2B2-701F-9AB7-4638-2485D6E06BCF} - - - {B0B7C78E-729E-0FFA-D611-82AE8BC7FE2C} - - - {0A4F7E12-220C-14EF-0026-9C0629FA9C17} - - - {37F49E10-4E62-6D5C-FF70-722D0CA3D97E} - - - {160D9882-0F68-278D-C5F9-8960FD7421D2} - - - {4CED05DA-E0A2-E548-F753-1F2EF299A8E3} - - - {46AE69B8-AD58-4381-6CDE-25C8D75B01D2} - - - {E56CB4FC-32E8-8740-A3BB-B323CD937A99} - - - {4ECDCA0C-BB38-0729-A6B6-2FB0B4D0863B} - - - {294E4CD5-B06F-97D1-04A3-51871CEA507C} - - - {77228F15-BD91-06FF-2C7E-0377D25C2C94} - - - {5CB531E6-BF9A-2C50-056C-EE5A525D28D3} - - - {E4EA47E5-B41C-2A19-1783-7E9104096ECD} - - - {B331BC33-9770-3DB5-73F2-BC2469ECCF7F} - - - {46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC} - - - {D90A8DF7-FBAB-D363-13C0-6707BB22B72B} - - - {8AE77C40-6839-EC37-4515-BD3CC269BCE4} - - - {0EAD99DB-011F-09E5-45A2-365F646EB004} - - - {F57590C6-3B90-1BE1-1006-488BA33E8BD9} - - - {7C319D73-0D93-5842-0874-398D2D3038D5} - - - {2CB4DB0C-DD3B-6195-D822-76EC7A5C88D2} - - - {FE3CB19C-EF43-5CF5-DAF0-09D4E43D0AB9} - - - {C0E5DD5D-F8F1-DD25-67D7-291946AB3828} - - - {FE7E6CD5-C7A0-DB20-4E7E-D6E7F08C4578} - - - {895C2D33-E08D-B1BA-BB36-FC4CA65090C8} - - - {D64A57DB-A956-5519-1929-1D929B56E1B0} - - - {5A99CC24-AC45-7ED6-C11A-B8B86E76D884} - - - {7A131EEC-25A7-22F6-2839-A2194DDF3007} - - - {EA9DB76C-CEF7-6BFC-2070-28B7DF8E8063} - - - {3C206A40-6F1B-E683-ACF1-DEC3703D0140} - - - {DF95D4BF-E18C-125A-5EBB-8993A06E232C} - - - {118946F2-AC24-0F09-62D5-753DF87A60CD} - - - {07329F9B-7D3D-CEB3-C771-714842076140} - - - {08BBBECB-B0D1-7611-37EC-F57E1D0CE2A2} - - - {268E8F2A-980C-BF2F-B161-AACABC9D91F3} - - - {A4D76113-9EDC-DA60-D89B-5BACF7F1C426} - - - {FE955B6B-68AC-AA07-70D8-2413F6DB65C8} - - - {7ED5A90E-41AF-A1EF-659B-37CEEAB9BA61} - - - - - Projucer\Application\StartPage - - - Projucer\Application\StartPage - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Documents - - - Projucer\ComponentEditor\Documents - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\Project\Modules - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\Settings - - - Projucer\Settings - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\PIPs - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_gui_extra - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - - - Projucer\Application\StartPage - - - Projucer\Application\StartPage - - - Projucer\Application\StartPage - - - Projucer\Application\StartPage - - - Projucer\Application\StartPage - - - Projucer\Application\UserAccount - - - Projucer\Application\UserAccount - - - Projucer\Application\UserAccount - - - Projucer\Application\UserAccount - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Documents - - - Projucer\ComponentEditor\Documents - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\Project\Modules - - - Projucer\Project\Modules - - - Projucer\Project\Modules - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\Settings - - - Projucer\Settings - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\PIPs - - - Projucer\Utility\UI\PropertyComponents - - - Projucer\Utility\UI\PropertyComponents - - - Projucer\Utility\UI\PropertyComponents - - - Projucer\Utility\UI\PropertyComponents - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Library Code - - - JUCE Library Code - - - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData\gradle - - - Projucer\BinaryData\gradle - - - Projucer\BinaryData\gradle - - - Projucer\BinaryData\gradle - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData - - - Projucer\BinaryData - - - JUCE Modules\juce_core\native\java - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Library Code - - - - - JUCE Library Code - - - diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2015/Projucer.sln juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2015/Projucer.sln --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2015/Projucer.sln 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2015/Projucer.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 14 - -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Projucer - App", "Projucer_App.vcxproj", "{E4CFCE31-1AF5-C360-751D-9682E333BE4D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E4CFCE31-1AF5-C360-751D-9682E333BE4D}.Debug|x64.ActiveCfg = Debug|x64 - {E4CFCE31-1AF5-C360-751D-9682E333BE4D}.Debug|x64.Build.0 = Debug|x64 - {E4CFCE31-1AF5-C360-751D-9682E333BE4D}.Release|x64.ActiveCfg = Release|x64 - {E4CFCE31-1AF5-C360-751D-9682E333BE4D}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2015/resources.rc juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2015/resources.rc --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2015/resources.rc 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2015/resources.rc 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -#pragma code_page(65001) - -#ifdef JUCE_USER_DEFINED_RC_FILE - #include JUCE_USER_DEFINED_RC_FILE -#else - -#undef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#include - -VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,5,0 -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "Raw Material Software Limited\0" - VALUE "LegalCopyright", "Raw Material Software Limited\0" - VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "6.1.5\0" - VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "6.1.5\0" - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif - -IDI_ICON1 ICON DISCARDABLE "icon.ico" -IDI_ICON2 ICON DISCARDABLE "icon.ico" \ No newline at end of file diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebug true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -106,7 +107,7 @@ Full ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -155,6 +157,12 @@ true + + true + + + true + true @@ -276,9 +284,15 @@ true + + true + true + + true + true @@ -294,6 +308,9 @@ true + + true + true @@ -360,6 +377,9 @@ true + + true + true @@ -1248,6 +1268,9 @@ true + + true + true @@ -1275,9 +1298,6 @@ true - - true - true @@ -1541,6 +1561,8 @@ + + @@ -1640,7 +1662,6 @@ - @@ -1691,6 +1712,7 @@ + @@ -1699,6 +1721,8 @@ + + @@ -1860,6 +1884,7 @@ + @@ -2034,6 +2059,7 @@ + @@ -2057,6 +2083,7 @@ + @@ -2127,14 +2154,16 @@ - + + + @@ -2145,7 +2174,6 @@ - diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -349,6 +349,12 @@ Projucer\BinaryData\Templates + + Projucer\BinaryData\Templates + + + Projucer\BinaryData\Templates + Projucer\BinaryData\Templates @@ -556,9 +562,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -574,6 +586,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -640,6 +655,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -1570,6 +1588,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -1606,9 +1627,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -1986,6 +2004,12 @@ Projucer\BinaryData\Templates + + Projucer\BinaryData\Templates + + + Projucer\BinaryData\Templates + Projucer\BinaryData\Templates @@ -2283,9 +2307,6 @@ Projucer\ProjectSaving - - Projucer\ProjectSaving - Projucer\ProjectSaving @@ -2436,6 +2457,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -2460,6 +2484,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -2943,6 +2973,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -3465,6 +3498,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -3534,6 +3570,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -3744,7 +3783,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -3758,12 +3797,18 @@ + + Projucer\BinaryData + Projucer\BinaryData Projucer\BinaryData + + Projucer\BinaryData + Projucer\BinaryData @@ -3794,9 +3839,6 @@ Projucer\BinaryData\Icons - - Projucer\BinaryData\Icons - Projucer\BinaryData\Icons diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2017/resources.rc juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2017/resources.rc --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2017/resources.rc 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2017/resources.rc 2022-06-21 07:56:28.000000000 +0000 @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,5,0 +FILEVERSION 7,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Raw Material Software Limited\0" VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "6.1.5\0" + VALUE "FileVersion", "7.0.0\0" VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "6.1.5\0" + VALUE "ProductVersion", "7.0.0\0" END END diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebug true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -106,7 +107,7 @@ Full ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -155,6 +157,12 @@ true + + true + + + true + true @@ -276,9 +284,15 @@ true + + true + true + + true + true @@ -294,6 +308,9 @@ true + + true + true @@ -360,6 +377,9 @@ true + + true + true @@ -1248,6 +1268,9 @@ true + + true + true @@ -1275,9 +1298,6 @@ true - - true - true @@ -1541,6 +1561,8 @@ + + @@ -1640,7 +1662,6 @@ - @@ -1691,6 +1712,7 @@ + @@ -1699,6 +1721,8 @@ + + @@ -1860,6 +1884,7 @@ + @@ -2034,6 +2059,7 @@ + @@ -2057,6 +2083,7 @@ + @@ -2127,14 +2154,16 @@ - + + + @@ -2145,7 +2174,6 @@ - diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -349,6 +349,12 @@ Projucer\BinaryData\Templates + + Projucer\BinaryData\Templates + + + Projucer\BinaryData\Templates + Projucer\BinaryData\Templates @@ -556,9 +562,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -574,6 +586,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -640,6 +655,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -1570,6 +1588,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -1606,9 +1627,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -1986,6 +2004,12 @@ Projucer\BinaryData\Templates + + Projucer\BinaryData\Templates + + + Projucer\BinaryData\Templates + Projucer\BinaryData\Templates @@ -2283,9 +2307,6 @@ Projucer\ProjectSaving - - Projucer\ProjectSaving - Projucer\ProjectSaving @@ -2436,6 +2457,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -2460,6 +2484,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -2943,6 +2973,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -3465,6 +3498,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -3534,6 +3570,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -3744,7 +3783,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -3758,12 +3797,18 @@ + + Projucer\BinaryData + Projucer\BinaryData Projucer\BinaryData + + Projucer\BinaryData + Projucer\BinaryData @@ -3794,9 +3839,6 @@ Projucer\BinaryData\Icons - - Projucer\BinaryData\Icons - Projucer\BinaryData\Icons diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2019/resources.rc juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2019/resources.rc --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2019/resources.rc 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2019/resources.rc 2022-06-21 07:56:28.000000000 +0000 @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,5,0 +FILEVERSION 7,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Raw Material Software Limited\0" VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "6.1.5\0" + VALUE "FileVersion", "7.0.0\0" VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "6.1.5\0" + VALUE "ProductVersion", "7.0.0\0" END END diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebug true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -106,7 +107,7 @@ Full ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -155,6 +157,12 @@ true + + true + + + true + true @@ -276,9 +284,15 @@ true + + true + true + + true + true @@ -294,6 +308,9 @@ true + + true + true @@ -360,6 +377,9 @@ true + + true + true @@ -1248,6 +1268,9 @@ true + + true + true @@ -1275,9 +1298,6 @@ true - - true - true @@ -1541,6 +1561,8 @@ + + @@ -1640,7 +1662,6 @@ - @@ -1691,6 +1712,7 @@ + @@ -1699,6 +1721,8 @@ + + @@ -1860,6 +1884,7 @@ + @@ -2034,6 +2059,7 @@ + @@ -2057,6 +2083,7 @@ + @@ -2127,14 +2154,16 @@ - + + + @@ -2145,7 +2174,6 @@ - diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -349,6 +349,12 @@ Projucer\BinaryData\Templates + + Projucer\BinaryData\Templates + + + Projucer\BinaryData\Templates + Projucer\BinaryData\Templates @@ -556,9 +562,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -574,6 +586,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -640,6 +655,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -1570,6 +1588,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -1606,9 +1627,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -1986,6 +2004,12 @@ Projucer\BinaryData\Templates + + Projucer\BinaryData\Templates + + + Projucer\BinaryData\Templates + Projucer\BinaryData\Templates @@ -2283,9 +2307,6 @@ Projucer\ProjectSaving - - Projucer\ProjectSaving - Projucer\ProjectSaving @@ -2436,6 +2457,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -2460,6 +2484,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -2943,6 +2973,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -3465,6 +3498,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -3534,6 +3570,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -3744,7 +3783,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -3758,12 +3797,18 @@ + + Projucer\BinaryData + Projucer\BinaryData Projucer\BinaryData + + Projucer\BinaryData + Projucer\BinaryData @@ -3794,9 +3839,6 @@ Projucer\BinaryData\Icons - - Projucer\BinaryData\Icons - Projucer\BinaryData\Icons diff -Nru juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2022/resources.rc juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2022/resources.rc --- juce-6.1.5~ds0/extras/Projucer/Builds/VisualStudio2022/resources.rc 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Builds/VisualStudio2022/resources.rc 2022-06-21 07:56:28.000000000 +0000 @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,5,0 +FILEVERSION 7,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Raw Material Software Limited\0" VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "6.1.5\0" + VALUE "FileVersion", "7.0.0\0" VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "6.1.5\0" + VALUE "ProductVersion", "7.0.0\0" END END diff -Nru juce-6.1.5~ds0/extras/Projucer/CMakeLists.txt juce-7.0.0~ds0/extras/Projucer/CMakeLists.txt --- juce-6.1.5~ds0/extras/Projucer/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -96,7 +96,6 @@ juce_add_binary_data(ProjucerData SOURCES Source/BinaryData/Icons/background_logo.svg Source/BinaryData/Icons/export_android.svg - Source/BinaryData/Icons/export_clion.svg Source/BinaryData/Icons/export_codeBlocks.svg Source/BinaryData/Icons/export_linux.svg Source/BinaryData/Icons/export_visualStudio.svg @@ -119,6 +118,10 @@ Source/BinaryData/Templates/jucer_AudioComponentSimpleTemplate.h Source/BinaryData/Templates/jucer_AudioComponentTemplate.cpp Source/BinaryData/Templates/jucer_AudioComponentTemplate.h + Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.cpp + Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h + Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp + Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.h Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.cpp Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.h Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.cpp @@ -149,8 +152,10 @@ Source/BinaryData/gradle/gradlew Source/BinaryData/gradle/gradlew.bat + ../Build/CMake/JuceLV2Defines.h.in ../Build/CMake/LaunchScreen.storyboard ../Build/CMake/PIPAudioProcessor.cpp.in + ../Build/CMake/PIPAudioProcessorWithARA.cpp.in ../Build/CMake/PIPComponent.cpp.in ../Build/CMake/PIPConsole.cpp.in ../Build/CMake/RecentFilesMenuTemplate.nib diff -Nru juce-6.1.5~ds0/extras/Projucer/JuceLibraryCode/BinaryData.cpp juce-7.0.0~ds0/extras/Projucer/JuceLibraryCode/BinaryData.cpp --- juce-6.1.5~ds0/extras/Projucer/JuceLibraryCode/BinaryData.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/JuceLibraryCode/BinaryData.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -4,11 +4,23 @@ */ +#include + namespace BinaryData { -//================== LaunchScreen.storyboard ================== +//================== JuceLV2Defines.h.in ================== static const unsigned char temp_binary_data_0[] = +"#pragma once\n" +"\n" +"#ifndef JucePlugin_LV2URI\n" +" #define JucePlugin_LV2URI \"${JUCE_LV2URI}\"\n" +"#endif\n"; + +const char* JuceLV2Defines_h_in = (const char*) temp_binary_data_0; + +//================== LaunchScreen.storyboard ================== +static const unsigned char temp_binary_data_1[] = "\n" "\n" @@ -27,10 +39,10 @@ " \n" "\n"; -const char* LaunchScreen_storyboard = (const char*) temp_binary_data_0; +const char* LaunchScreen_storyboard = (const char*) temp_binary_data_1; //================== PIPAudioProcessor.cpp.in ================== -static const unsigned char temp_binary_data_1[] = +static const unsigned char temp_binary_data_2[] = "/*\n" " ==============================================================================\n" "\n" @@ -48,10 +60,38 @@ " return new ${JUCE_PIP_MAIN_CLASS}();\n" "}\n"; -const char* PIPAudioProcessor_cpp_in = (const char*) temp_binary_data_1; +const char* PIPAudioProcessor_cpp_in = (const char*) temp_binary_data_2; + +//================== PIPAudioProcessorWithARA.cpp.in ================== +static const unsigned char temp_binary_data_3[] = +"/*\n" +" ==============================================================================\n" +"\n" +" This file was auto-generated and contains the startup code for a PIP.\n" +"\n" +" ==============================================================================\n" +"*/\n" +"\n" +"#include \n" +"#include \"${JUCE_PIP_HEADER}\"\n" +"\n" +"//==============================================================================\n" +"juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter()\n" +"{\n" +" return new ${JUCE_PIP_MAIN_CLASS}();\n" +"}\n" +"\n" +"#if JucePlugin_Enable_ARA\n" +"const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory()\n" +"{\n" +" return juce::ARADocumentControllerSpecialisation::createARAFactory<${JUCE_PIP_DOCUMENTCONTROLLER_CLASS}>();\n" +"}\n" +"#endif\n"; + +const char* PIPAudioProcessorWithARA_cpp_in = (const char*) temp_binary_data_3; //================== PIPComponent.cpp.in ================== -static const unsigned char temp_binary_data_2[] = +static const unsigned char temp_binary_data_4[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -121,10 +161,10 @@ "//==============================================================================\r\n" "START_JUCE_APPLICATION (Application)\r\n"; -const char* PIPComponent_cpp_in = (const char*) temp_binary_data_2; +const char* PIPComponent_cpp_in = (const char*) temp_binary_data_4; //================== PIPConsole.cpp.in ================== -static const unsigned char temp_binary_data_3[] = +static const unsigned char temp_binary_data_5[] = "/*\n" " ==============================================================================\n" "\n" @@ -136,10 +176,10 @@ "#include \n" "#include \"${JUCE_PIP_HEADER}\"\n"; -const char* PIPConsole_cpp_in = (const char*) temp_binary_data_3; +const char* PIPConsole_cpp_in = (const char*) temp_binary_data_5; //================== RecentFilesMenuTemplate.nib ================== -static const unsigned char temp_binary_data_4[] = +static const unsigned char temp_binary_data_6[] = { 98,112,108,105,115,116,48,48,212,0,1,0,2,0,3,0,4,0,5,0,6,1,53,1,54,88,36,118,101,114,115,105,111,110,88,36,111,98,106,101,99,116,115,89,36,97,114,99,104,105,118,101,114,84,36,116,111,112,18,0,1,134,160,175,16,74,0,7,0,8,0,31,0,35,0,36,0,42,0,46,0,50, 0,53,0,57,0,74,0,77,0,78,0,86,0,87,0,97,0,112,0,113,0,114,0,119,0,120,0,121,0,124,0,128,0,129,0,132,0,143,0,144,0,145,0,149,0,153,0,162,0,163,0,164,0,169,0,173,0,180,0,181,0,182,0,185,0,192,0,193,0,200,0,201,0,208,0,209,0,216,0,217,0,224,0,225,0,226, 0,229,0,230,0,232,0,249,1,11,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,47,1,50,85,36,110,117,108,108,219,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0, @@ -176,10 +216,10 @@ 7,157,7,159,7,161,7,163,7,165,7,167,7,169,7,171,7,173,7,175,7,177,7,179,7,181,7,190,7,192,7,225,7,227,7,229,7,231,7,233,7,235,7,237,7,239,7,241,7,243,7,245,7,247,7,249,7,251,7,253,7,255,8,2,8,5,8,8,8,11,8,14,8,17,8,20,8,23,8,26,8,29,8,32,8,35,8,38,8, 41,8,44,8,53,8,55,8,56,8,65,8,67,8,68,8,77,8,92,8,97,8,115,8,120,8,134,0,0,0,0,0,0,2,2,0,0,0,0,0,0,1,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,0,0 }; -const char* RecentFilesMenuTemplate_nib = (const char*) temp_binary_data_4; +const char* RecentFilesMenuTemplate_nib = (const char*) temp_binary_data_6; //================== UnityPluginGUIScript.cs.in ================== -static const unsigned char temp_binary_data_5[] = +static const unsigned char temp_binary_data_7[] = "#if UNITY_EDITOR\n" "\n" "using UnityEditor;\n" @@ -362,10 +402,10 @@ "\n" "#endif\n"; -const char* UnityPluginGUIScript_cs_in = (const char*) temp_binary_data_5; +const char* UnityPluginGUIScript_cs_in = (const char*) temp_binary_data_7; //================== gradle-wrapper.jar ================== -static const unsigned char temp_binary_data_6[] = +static const unsigned char temp_binary_data_8[] = { 80,75,3,4,10,0,0,8,8,0,42,178,149,71,0,0,0,0,2,0,0,0,0,0,0,0,9,0,0,0,77,69,84,65,45,73,78,70,47,3,0,80,75,3,4,10,0,0,8,8,0,42,178,149,71,215,149,152,82,63,0,0,0,85,0,0,0,20,0,0,0,77,69,84,65,45,73,78,70,47,77,65,78,73,70,69,83,84,46,77,70,243,77,204, 203,76,75,45,46,209,13,75,45,42,206,204,207,179,82,48,212,51,224,229,242,204,45,200,73,205,77,205,43,73,44,1,10,234,134,100,150,228,164,90,41,184,23,37,166,228,164,98,200,194,181,26,233,25,2,245,242,114,1,0,80,75,3,4,10,0,0,8,8,0,22,178,149,71,0,0,0, 0,2,0,0,0,0,0,0,0,4,0,0,0,111,114,103,47,3,0,80,75,3,4,10,0,0,8,8,0,22,178,149,71,0,0,0,0,2,0,0,0,0,0,0,0,11,0,0,0,111,114,103,47,103,114,97,100,108,101,47,3,0,80,75,3,4,10,0,0,8,8,0,22,178,149,71,0,0,0,0,2,0,0,0,0,0,0,0,19,0,0,0,111,114,103,47,103,114, @@ -1117,10 +1157,10 @@ 76,105,110,101,80,97,114,115,101,114,36,65,102,116,101,114,70,105,114,115,116,83,117,98,67,111,109,109,97,110,100,46,99,108,97,115,115,80,75,1,2,20,3,10,0,0,8,8,0,10,178,149,71,105,222,125,0,70,0,0,0,68,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,180,129,219,191, 0,0,103,114,97,100,108,101,45,99,108,105,45,99,108,97,115,115,112,97,116,104,46,112,114,111,112,101,114,116,105,101,115,80,75,5,6,0,0,0,0,49,0,49,0,16,17,0,0,94,192,0,0,0,0,0,0 }; -const char* gradlewrapper_jar = (const char*) temp_binary_data_6; +const char* gradlewrapper_jar = (const char*) temp_binary_data_8; //================== gradlew ================== -static const unsigned char temp_binary_data_7[] = +static const unsigned char temp_binary_data_9[] = "#!/usr/bin/env bash\n" "\n" "##############################################################################\n" @@ -1282,10 +1322,10 @@ "\n" "exec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"; -const char* gradlew = (const char*) temp_binary_data_7; +const char* gradlew = (const char*) temp_binary_data_9; //================== gradlew.bat ================== -static const unsigned char temp_binary_data_8[] = +static const unsigned char temp_binary_data_10[] = "@if \"%DEBUG%\" == \"\" @echo off\r\n" "@rem ##########################################################################\r\n" "@rem\r\n" @@ -1377,10 +1417,10 @@ "\r\n" ":omega\r\n"; -const char* gradlew_bat = (const char*) temp_binary_data_8; +const char* gradlew_bat = (const char*) temp_binary_data_10; //================== LICENSE ================== -static const unsigned char temp_binary_data_9[] = +static const unsigned char temp_binary_data_11[] = "Apache License\n" " Version 2.0, January 2004\n" " http://www.apache.org/licenses/\n" @@ -1584,10 +1624,10 @@ " limitations under the License.\n" "\n"; -const char* LICENSE = (const char*) temp_binary_data_9; +const char* LICENSE = (const char*) temp_binary_data_11; //================== background_logo.svg ================== -static const unsigned char temp_binary_data_10[] = +static const unsigned char temp_binary_data_12[] = "\n" " \n" " \n" @@ -1606,10 +1646,10 @@ "19.41 26.977 21.709 2.136.408 6.1.755 7.377.645.325-.028 1.48-.094 2.564-.147z\" fill=\"#b8b8b8\"/>\n" "\n"; -const char* background_logo_svg = (const char*) temp_binary_data_10; +const char* background_logo_svg = (const char*) temp_binary_data_12; //================== export_android.svg ================== -static const unsigned char temp_binary_data_11[] = +static const unsigned char temp_binary_data_13[] = "\n" "\n" " \n" @@ -1640,49 +1680,10 @@ " \n" ""; -const char* export_android_svg = (const char*) temp_binary_data_11; - -//================== export_clion.svg ================== -static const unsigned char temp_binary_data_12[] = -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" icon_CLion\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"\n"; - -const char* export_clion_svg = (const char*) temp_binary_data_12; +const char* export_android_svg = (const char*) temp_binary_data_13; //================== export_codeBlocks.svg ================== -static const unsigned char temp_binary_data_13[] = +static const unsigned char temp_binary_data_14[] = "\n" "\n" " \n" @@ -1704,10 +1705,10 @@ " \n" ""; -const char* export_codeBlocks_svg = (const char*) temp_binary_data_13; +const char* export_codeBlocks_svg = (const char*) temp_binary_data_14; //================== export_linux.svg ================== -static const unsigned char temp_binary_data_14[] = +static const unsigned char temp_binary_data_15[] = "\n" "\n" " \n" @@ -1857,10 +1858,10 @@ " \n" ""; -const char* export_linux_svg = (const char*) temp_binary_data_14; +const char* export_linux_svg = (const char*) temp_binary_data_15; //================== export_visualStudio.svg ================== -static const unsigned char temp_binary_data_15[] = +static const unsigned char temp_binary_data_16[] = "\n" "\n" " \n" @@ -1884,10 +1885,10 @@ " \n" ""; -const char* export_visualStudio_svg = (const char*) temp_binary_data_15; +const char* export_visualStudio_svg = (const char*) temp_binary_data_16; //================== export_xcode.svg ================== -static const unsigned char temp_binary_data_16[] = +static const unsigned char temp_binary_data_17[] = "\n" "\n" " \n" @@ -1959,10 +1960,10 @@ " \n" ""; -const char* export_xcode_svg = (const char*) temp_binary_data_16; +const char* export_xcode_svg = (const char*) temp_binary_data_17; //================== gpl_logo.svg ================== -static const unsigned char temp_binary_data_17[] = +static const unsigned char temp_binary_data_18[] = "\n" " \n" " \n" ""; -const char* gpl_logo_svg = (const char*) temp_binary_data_17; +const char* gpl_logo_svg = (const char*) temp_binary_data_18; //================== juce_icon.png ================== -static const unsigned char temp_binary_data_18[] = +static const unsigned char temp_binary_data_19[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,0,0,0,2,0,8,6,0,0,0,244,120,212,250,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,132,101,88,73,102,77,77,0,42,0,0,0,8,0,5,1,18,0,3,0,0,0,1,0,1,0,0,1,26,0,5,0,0,0,1,0,0,0,74,1,27,0,5,0,0,0,1,0,0,0,82, 1,40,0,3,0,0,0,1,0,2,0,0,135,105,0,4,0,0,0,1,0,0,0,90,0,0,0,0,0,0,0,144,0,0,0,1,0,0,0,144,0,0,0,1,0,3,160,1,0,3,0,0,0,1,0,1,0,0,160,2,0,4,0,0,0,1,0,0,2,0,160,3,0,4,0,0,0,1,0,0,2,0,0,0,0,0,25,192,84,16,0,0,0,9,112,72,89,115,0,0,22,37,0,0,22,37,1,73,82, 36,240,0,0,1,89,105,84,88,116,88,77,76,58,99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,120,58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116, @@ -3583,10 +3584,10 @@ 246,44,212,239,33,44,75,155,114,119,199,74,182,59,225,163,230,56,187,0,203,253,163,244,158,144,61,194,134,54,75,89,109,30,70,120,118,29,207,206,219,205,104,221,216,184,128,155,196,214,68,235,181,92,180,4,225,231,230,249,31,56,76,178,107,226,240,74,169, 60,174,167,167,149,58,7,146,87,83,147,170,92,246,47,193,107,255,83,221,119,125,168,20,16,4,4,1,245,55,199,228,93,104,231,183,98,169,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* juce_icon_png = (const char*) temp_binary_data_18; +const char* juce_icon_png = (const char*) temp_binary_data_19; //================== wizard_AnimatedApp.svg ================== -static const unsigned char temp_binary_data_19[] = +static const unsigned char temp_binary_data_20[] = "\n" "\n" "\n" @@ -3763,10 +3764,10 @@ " id=\"line44\"\n" " style=\"stroke:#a45c94;stroke-opacity:0.94117647\" />"; -const char* wizard_AnimatedApp_svg = (const char*) temp_binary_data_19; +const char* wizard_AnimatedApp_svg = (const char*) temp_binary_data_20; //================== wizard_AudioApp.svg ================== -static const unsigned char temp_binary_data_20[] = +static const unsigned char temp_binary_data_21[] = "\n" "\n" "\n" @@ -4520,10 +4521,10 @@ " id=\"line131\"\n" " style=\"stroke:#a45c94;stroke-opacity:1\" />"; -const char* wizard_AudioApp_svg = (const char*) temp_binary_data_20; +const char* wizard_AudioApp_svg = (const char*) temp_binary_data_21; //================== wizard_AudioPlugin.svg ================== -static const unsigned char temp_binary_data_21[] = +static const unsigned char temp_binary_data_22[] = "\n" "\n" "\n" @@ -5379,10 +5380,10 @@ " id=\"circle175\"\n" " style=\"stroke:#a45c94;stroke-opacity:1;fill:#a45c94;fill-opacity:1\" />"; -const char* wizard_AudioPlugin_svg = (const char*) temp_binary_data_21; +const char* wizard_AudioPlugin_svg = (const char*) temp_binary_data_22; //================== wizard_ConsoleApp.svg ================== -static const unsigned char temp_binary_data_22[] = +static const unsigned char temp_binary_data_23[] = "\n" "\n" "\n" @@ -5469,10 +5470,10 @@ " id=\"path19\"\n" " style=\"stroke:#a45c94;stroke-opacity:1;fill:#a45c94;fill-opacity:1\" />"; -const char* wizard_ConsoleApp_svg = (const char*) temp_binary_data_22; +const char* wizard_ConsoleApp_svg = (const char*) temp_binary_data_23; //================== wizard_DLL.svg ================== -static const unsigned char temp_binary_data_23[] = +static const unsigned char temp_binary_data_24[] = "\n" "\n" "\n" @@ -5743,10 +5744,10 @@ " id=\"path54\"\n" " style=\"stroke:#a45c94;stroke-opacity:1\" />"; -const char* wizard_DLL_svg = (const char*) temp_binary_data_23; +const char* wizard_DLL_svg = (const char*) temp_binary_data_24; //================== wizard_GUI.svg ================== -static const unsigned char temp_binary_data_24[] = +static const unsigned char temp_binary_data_25[] = "\n" "\n" "\n" @@ -5916,10 +5917,10 @@ " id=\"path47\"\n" " style=\"stroke:#a45c94;stroke-opacity:1\" />"; -const char* wizard_GUI_svg = (const char*) temp_binary_data_24; +const char* wizard_GUI_svg = (const char*) temp_binary_data_25; //================== wizard_Highlight.svg ================== -static const unsigned char temp_binary_data_25[] = +static const unsigned char temp_binary_data_26[] = "\n" "\n" "\n" @@ -5969,10 +5970,10 @@ " id=\"path3\"\n" " style=\"fill:#a45c94;fill-opacity:1\" />"; -const char* wizard_Highlight_svg = (const char*) temp_binary_data_25; +const char* wizard_Highlight_svg = (const char*) temp_binary_data_26; //================== wizard_Openfile.svg ================== -static const unsigned char temp_binary_data_26[] = +static const unsigned char temp_binary_data_27[] = "\n" "\n" "\n" @@ -6024,10 +6025,10 @@ " id=\"path3\"\n" " style=\"stroke:#a45c94;stroke-opacity:1\" />"; -const char* wizard_Openfile_svg = (const char*) temp_binary_data_26; +const char* wizard_Openfile_svg = (const char*) temp_binary_data_27; //================== wizard_OpenGL.svg ================== -static const unsigned char temp_binary_data_27[] = +static const unsigned char temp_binary_data_28[] = "\n" "\n" "\n" @@ -6155,10 +6156,10 @@ " id=\"path23\"\n" " style=\"stroke:#a45c94;stroke-opacity:1\" />"; -const char* wizard_OpenGL_svg = (const char*) temp_binary_data_27; +const char* wizard_OpenGL_svg = (const char*) temp_binary_data_28; //================== wizard_StaticLibrary.svg ================== -static const unsigned char temp_binary_data_28[] = +static const unsigned char temp_binary_data_29[] = "\n" "\n" "\n" @@ -6429,10 +6430,10 @@ " id=\"path54\"\n" " style=\"stroke:#a45c94;stroke-opacity:1\" />"; -const char* wizard_StaticLibrary_svg = (const char*) temp_binary_data_28; +const char* wizard_StaticLibrary_svg = (const char*) temp_binary_data_29; //================== jucer_AnimatedComponentSimpleTemplate.h ================== -static const unsigned char temp_binary_data_29[] = +static const unsigned char temp_binary_data_30[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -6490,10 +6491,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_AnimatedComponentSimpleTemplate_h = (const char*) temp_binary_data_29; +const char* jucer_AnimatedComponentSimpleTemplate_h = (const char*) temp_binary_data_30; //================== jucer_AnimatedComponentTemplate.cpp ================== -static const unsigned char temp_binary_data_30[] = +static const unsigned char temp_binary_data_31[] = "%%include_corresponding_header%%\r\n" "\r\n" "//==============================================================================\r\n" @@ -6532,10 +6533,10 @@ " // update their positions.\r\n" "}\r\n"; -const char* jucer_AnimatedComponentTemplate_cpp = (const char*) temp_binary_data_30; +const char* jucer_AnimatedComponentTemplate_cpp = (const char*) temp_binary_data_31; //================== jucer_AnimatedComponentTemplate.h ================== -static const unsigned char temp_binary_data_31[] = +static const unsigned char temp_binary_data_32[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -6567,10 +6568,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_AnimatedComponentTemplate_h = (const char*) temp_binary_data_31; +const char* jucer_AnimatedComponentTemplate_h = (const char*) temp_binary_data_32; //================== jucer_AudioComponentSimpleTemplate.h ================== -static const unsigned char temp_binary_data_32[] = +static const unsigned char temp_binary_data_33[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -6666,10 +6667,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_AudioComponentSimpleTemplate_h = (const char*) temp_binary_data_32; +const char* jucer_AudioComponentSimpleTemplate_h = (const char*) temp_binary_data_33; //================== jucer_AudioComponentTemplate.cpp ================== -static const unsigned char temp_binary_data_33[] = +static const unsigned char temp_binary_data_34[] = "%%include_corresponding_header%%\r\n" "\r\n" "//==============================================================================\r\n" @@ -6746,10 +6747,10 @@ " // update their positions.\r\n" "}\r\n"; -const char* jucer_AudioComponentTemplate_cpp = (const char*) temp_binary_data_33; +const char* jucer_AudioComponentTemplate_cpp = (const char*) temp_binary_data_34; //================== jucer_AudioComponentTemplate.h ================== -static const unsigned char temp_binary_data_34[] = +static const unsigned char temp_binary_data_35[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -6783,10 +6784,265 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_AudioComponentTemplate_h = (const char*) temp_binary_data_34; +const char* jucer_AudioComponentTemplate_h = (const char*) temp_binary_data_35; + +//================== jucer_AudioPluginARADocumentControllerTemplate.cpp ================== +static const unsigned char temp_binary_data_36[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated!\r\n" +"\r\n" +" It contains the basic framework code for an ARA document controller implementation.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"%%aradocumentcontroller_headers%%\r\n" +"%%araplaybackrenderer_headers%%\r\n" +"\r\n" +"//==============================================================================\r\n" +"ARA::PlugIn::PlaybackRenderer* %%aradocumentcontroller_class_name%%::doCreatePlaybackRenderer() noexcept\r\n" +"{\r\n" +" return new %%araplaybackrenderer_class_name%% (getDocumentController());\r\n" +"}\r\n" +"\r\n" +"//==============================================================================\r\n" +"bool %%aradocumentcontroller_class_name%%::doRestoreObjectsFromStream (juce::ARAInputStream& input, const juce::ARARestoreObjectsFilter* filter) noexcept\r\n" +"{\r\n" +" // You should use this method to read any persistent data associated with\r\n" +" // your ARA model graph stored in an archive using the supplied ARAInputStream.\r\n" +" // Be sure to check the ARARestoreObjectsFilter to determine which objects to restore.\r\n" +" return true;\r\n" +"}\r\n" +"\r\n" +"bool %%aradocumentcontroller_class_name%%::doStoreObjectsToStream (juce::ARAOutputStream& output, const juce::ARAStoreObjectsFilter* filter) noexcept\r\n" +"{\r\n" +" // You should use this method to write any persistent data associated with\r\n" +" // your ARA model graph into the an archive using the supplied ARAOutputStream.\r\n" +" // Be sure to check the ARAStoreObjectsFilter to determine which objects to store.\r\n" +" return true;\r\n" +"}\r\n" +"\r\n" +"//==============================================================================\r\n" +"// This creates the static ARAFactory instances for the plugin.\r\n" +"const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory()\r\n" +"{\r\n" +" return juce::ARADocumentControllerSpecialisation::createARAFactory<%%aradocumentcontroller_class_name%%>();\r\n" +"}\r\n"; + +const char* jucer_AudioPluginARADocumentControllerTemplate_cpp = (const char*) temp_binary_data_36; + +//================== jucer_AudioPluginARADocumentControllerTemplate.h ================== +static const unsigned char temp_binary_data_37[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated!\r\n" +"\r\n" +" It contains the basic framework code for an ARA document controller implementation.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"#pragma once\r\n" +"\r\n" +"#include \r\n" +"\r\n" +"//==============================================================================\r\n" +"/**\r\n" +"*/\r\n" +"class %%aradocumentcontroller_class_name%% : public juce::ARADocumentControllerSpecialisation\r\n" +"{\r\n" +"public:\r\n" +" //==============================================================================\r\n" +" using ARADocumentControllerSpecialisation::ARADocumentControllerSpecialisation;\r\n" +"\r\n" +"protected:\r\n" +" //==============================================================================\r\n" +" // Override document controller customization methods here\r\n" +"\r\n" +" ARAPlaybackRenderer* doCreatePlaybackRenderer() noexcept override;\r\n" +"\r\n" +" bool doRestoreObjectsFromStream (juce::ARAInputStream& input, const juce::ARARestoreObjectsFilter* filter) noexcept override;\r\n" +" bool doStoreObjectsToStream (juce::ARAOutputStream& output, const juce::ARAStoreObjectsFilter* filter) noexcept override;\r\n" +"\r\n" +"private:\r\n" +" //==============================================================================\r\n" +" JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%aradocumentcontroller_class_name%%)\r\n" +"};\r\n"; + +const char* jucer_AudioPluginARADocumentControllerTemplate_h = (const char*) temp_binary_data_37; + +//================== jucer_AudioPluginARAPlaybackRendererTemplate.cpp ================== +static const unsigned char temp_binary_data_38[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated!\r\n" +"\r\n" +" It contains the basic framework code for an ARA playback renderer implementation.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"%%araplaybackrenderer_headers%%\r\n" +"\r\n" +"//==============================================================================\r\n" +"void %%araplaybackrenderer_class_name%%::prepareToPlay (double sampleRateIn, int maximumSamplesPerBlockIn, int numChannelsIn, juce::AudioProcessor::ProcessingPrecision, AlwaysNonRealtime alwaysNonRealtime)\r\n" +"{\r\n" +" numChannels = numChannelsIn;\r\n" +" sampleRate = sampleRateIn;\r\n" +" maximumSamplesPerBlock = maximumSamplesPerBlockIn;\r\n" +" useBufferedAudioSourceReader = alwaysNonRealtime == AlwaysNonRealtime::no;\r\n" +"}\r\n" +"\r\n" +"void %%araplaybackrenderer_class_name%%::releaseResources()\r\n" +"{\r\n" +"}\r\n" +"\r\n" +"//==============================================================================\r\n" +"bool %%araplaybackrenderer_class_name%%::processBlock (juce::AudioBuffer& buffer, juce::AudioProcessor::Realtime realtime, const juce::AudioPlayHead::CurrentPositionInfo& positionInfo) noexcept\r\n" +"{\r\n" +" const auto numSamples = buffer.getNumSamples();\r\n" +" jassert (numSamples <= maximumSamplesPerBlock);\r\n" +" jassert (numChannels == buffer.getNumChannels());\r\n" +" jassert (realtime == juce::AudioProcessor::Realtime::no || useBufferedAudioSourceReader);\r\n" +" const auto timeInSamples = positionInfo.timeInSamples;\r\n" +" const auto isPlaying = positionInfo.isPlaying;\r\n" +"\r\n" +" bool success = true;\r\n" +" bool didRenderAnyRegion = false;\r\n" +"\r\n" +" if (isPlaying)\r\n" +" {\r\n" +" const auto blockRange = juce::Range::withStartAndLength (timeInSamples, numSamples);\r\n" +"\r\n" +" for (const auto& playbackRegion : getPlaybackRegions())\r\n" +" {\r\n" +" // Evaluate region borders in song time, calculate sample range to render in song time.\r\n" +" // Note that this example does not use head- or tailtime, so the includeHeadAndTail\r\n" +" // parameter is set to false here - this might need to be adjusted in actual plug-ins.\r\n" +" const auto playbackSampleRange = playbackRegion->getSampleRange (sampleRate,\r\n" +" juce::ARAPlaybackRegion::IncludeHeadAndTail::no);\r\n" +" auto renderRange = blockRange.getIntersectionWith (playbackSampleRange);\r\n" +"\r\n" +" if (renderRange.isEmpty())\r\n" +" continue;\r\n" +"\r\n" +" // Evaluate region borders in modification/source time and calculate offset between\r\n" +" // song and source samples, then clip song samples accordingly\r\n" +" // (if an actual plug-in supports time stretching, this must be taken into account here).\r\n" +" juce::Range modificationSampleRange { playbackRegion->getStartInAudioModificationSamples(),\r\n" +" playbackRegion->getEndInAudioModificationSamples() };\r\n" +" const auto modificationSampleOffset = modificationSampleRange.getStart() - playbackSampleRange.getStart();\r\n" +"\r\n" +" renderRange = renderRange.getIntersectionWith (modificationSampleRange.movedToStartAt (playbackSampleRange.getStart()));\r\n" +"\r\n" +" if (renderRange.isEmpty())\r\n" +" continue;\r\n" +"\r\n" +" // Now calculate the samples in renderRange for this PlaybackRegion based on the ARA model\r\n" +" // graph. If didRenderAnyRegion is true, add the region's output samples in renderRange to\r\n" +" // the buffer. Otherwise the buffer needs to be initialised so the sample value must be\r\n" +" // overwritten.\r\n" +" const int numSamplesToRead = (int) renderRange.getLength();\r\n" +" const int startInBuffer = (int) (renderRange.getStart() - blockRange.getStart());\r\n" +" const auto startInSource = renderRange.getStart() + modificationSampleOffset;\r\n" +"\r\n" +" for (int c = 0; c < numChannels; ++c)\r\n" +" {\r\n" +" auto* channelData = buffer.getWritePointer (c);\r\n" +"\r\n" +" for (int i = 0; i < numSamplesToRead; ++i)\r\n" +" {\r\n" +" // Calculate region output sample at index startInSource + i ...\r\n" +" float sample = 0.0f;\r\n" +"\r\n" +" if (didRenderAnyRegion)\r\n" +" channelData[startInBuffer + i] += sample;\r\n" +" else\r\n" +" channelData[startInBuffer + i] = sample;\r\n" +" }\r\n" +" }\r\n" +"\r\n" +" // If rendering first region, clear any excess at start or end of the region.\r\n" +" if (! didRenderAnyRegion)\r\n" +" {\r\n" +" if (startInBuffer != 0)\r\n" +" buffer.clear (0, startInBuffer);\r\n" +"\r\n" +" const int endInBuffer = startInBuffer + numSamples;\r\n" +" const int remainingSamples = numSamples - endInBuffer;\r\n" +"\r\n" +" if (remainingSamples != 0)\r\n" +" buffer.clear (endInBuffer, remainingSamples);\r\n" +"\r\n" +" didRenderAnyRegion = true;\r\n" +" }\r\n" +" }\r\n" +" }\r\n" +"\r\n" +" if (! didRenderAnyRegion)\r\n" +" buffer.clear();\r\n" +"\r\n" +" return success;\r\n" +"}\r\n"; + +const char* jucer_AudioPluginARAPlaybackRendererTemplate_cpp = (const char*) temp_binary_data_38; + +//================== jucer_AudioPluginARAPlaybackRendererTemplate.h ================== +static const unsigned char temp_binary_data_39[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated!\r\n" +"\r\n" +" It contains the basic framework code for an ARA playback renderer implementation.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"#pragma once\r\n" +"\r\n" +"#include \r\n" +"\r\n" +"//==============================================================================\r\n" +"/**\r\n" +"*/\r\n" +"class %%araplaybackrenderer_class_name%% : public juce::ARAPlaybackRenderer\r\n" +"{\r\n" +"public:\r\n" +" //==============================================================================\r\n" +" using juce::ARAPlaybackRenderer::ARAPlaybackRenderer;\r\n" +"\r\n" +" //==============================================================================\r\n" +" void prepareToPlay (double sampleRate,\r\n" +" int maximumSamplesPerBlock,\r\n" +" int numChannels,\r\n" +" juce::AudioProcessor::ProcessingPrecision,\r\n" +" AlwaysNonRealtime alwaysNonRealtime) override;\r\n" +" void releaseResources() override;\r\n" +"\r\n" +" //==============================================================================\r\n" +" bool processBlock (juce::AudioBuffer & buffer,\r\n" +" juce::AudioProcessor::Realtime realtime,\r\n" +" const juce::AudioPlayHead::CurrentPositionInfo& positionInfo) noexcept override;\r\n" +"\r\n" +"private:\r\n" +" //==============================================================================\r\n" +" double sampleRate = 44100.0;\r\n" +" int maximumSamplesPerBlock = 4096;\r\n" +" int numChannels = 1;\r\n" +" bool useBufferedAudioSourceReader = true;\r\n" +"\r\n" +" JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%araplaybackrenderer_class_name%%)\r\n" +"};\r\n"; + +const char* jucer_AudioPluginARAPlaybackRendererTemplate_h = (const char*) temp_binary_data_39; //================== jucer_AudioPluginEditorTemplate.cpp ================== -static const unsigned char temp_binary_data_35[] = +static const unsigned char temp_binary_data_40[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -6827,10 +7083,10 @@ " // subcomponents in your editor..\r\n" "}\r\n"; -const char* jucer_AudioPluginEditorTemplate_cpp = (const char*) temp_binary_data_35; +const char* jucer_AudioPluginEditorTemplate_cpp = (const char*) temp_binary_data_40; //================== jucer_AudioPluginEditorTemplate.h ================== -static const unsigned char temp_binary_data_36[] = +static const unsigned char temp_binary_data_41[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -6864,10 +7120,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%editor_class_name%%)\r\n" "};\r\n"; -const char* jucer_AudioPluginEditorTemplate_h = (const char*) temp_binary_data_36; +const char* jucer_AudioPluginEditorTemplate_h = (const char*) temp_binary_data_41; //================== jucer_AudioPluginFilterTemplate.cpp ================== -static const unsigned char temp_binary_data_37[] = +static const unsigned char temp_binary_data_42[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7059,10 +7315,10 @@ " return new %%filter_class_name%%();\r\n" "}\r\n"; -const char* jucer_AudioPluginFilterTemplate_cpp = (const char*) temp_binary_data_37; +const char* jucer_AudioPluginFilterTemplate_cpp = (const char*) temp_binary_data_42; //================== jucer_AudioPluginFilterTemplate.h ================== -static const unsigned char temp_binary_data_38[] = +static const unsigned char temp_binary_data_43[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7079,6 +7335,9 @@ "/**\r\n" "*/\r\n" "class %%filter_class_name%% : public juce::AudioProcessor\r\n" +" #if JucePlugin_Enable_ARA\r\n" +" , public juce::AudioProcessorARAExtension\r\n" +" #endif\r\n" "{\r\n" "public:\r\n" " //==============================================================================\r\n" @@ -7123,10 +7382,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%filter_class_name%%)\r\n" "};\r\n"; -const char* jucer_AudioPluginFilterTemplate_h = (const char*) temp_binary_data_38; +const char* jucer_AudioPluginFilterTemplate_h = (const char*) temp_binary_data_43; //================== jucer_ComponentTemplate.cpp ================== -static const unsigned char temp_binary_data_39[] = +static const unsigned char temp_binary_data_44[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7202,10 +7461,10 @@ "//[EndFile] You can add extra defines here...\r\n" "//[/EndFile]\r\n"; -const char* jucer_ComponentTemplate_cpp = (const char*) temp_binary_data_39; +const char* jucer_ComponentTemplate_cpp = (const char*) temp_binary_data_44; //================== jucer_ComponentTemplate.h ================== -static const unsigned char temp_binary_data_40[] = +static const unsigned char temp_binary_data_45[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7268,10 +7527,10 @@ "//[EndFile] You can add extra defines here...\r\n" "//[/EndFile]\r\n"; -const char* jucer_ComponentTemplate_h = (const char*) temp_binary_data_40; +const char* jucer_ComponentTemplate_h = (const char*) temp_binary_data_45; //================== jucer_ContentCompSimpleTemplate.h ================== -static const unsigned char temp_binary_data_41[] = +static const unsigned char temp_binary_data_46[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -7321,10 +7580,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_ContentCompSimpleTemplate_h = (const char*) temp_binary_data_41; +const char* jucer_ContentCompSimpleTemplate_h = (const char*) temp_binary_data_46; //================== jucer_ContentCompTemplate.cpp ================== -static const unsigned char temp_binary_data_42[] = +static const unsigned char temp_binary_data_47[] = "%%include_corresponding_header%%\r\n" "\r\n" "//==============================================================================\r\n" @@ -7355,10 +7614,10 @@ " // update their positions.\r\n" "}\r\n"; -const char* jucer_ContentCompTemplate_cpp = (const char*) temp_binary_data_42; +const char* jucer_ContentCompTemplate_cpp = (const char*) temp_binary_data_47; //================== jucer_ContentCompTemplate.h ================== -static const unsigned char temp_binary_data_43[] = +static const unsigned char temp_binary_data_48[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -7387,10 +7646,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_ContentCompTemplate_h = (const char*) temp_binary_data_43; +const char* jucer_ContentCompTemplate_h = (const char*) temp_binary_data_48; //================== jucer_InlineComponentTemplate.h ================== -static const unsigned char temp_binary_data_44[] = +static const unsigned char temp_binary_data_49[] = "//==============================================================================\r\n" "class %%component_class%% : public juce::Component\r\n" "{\r\n" @@ -7432,10 +7691,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%component_class%%)\r\n" "};\r\n"; -const char* jucer_InlineComponentTemplate_h = (const char*) temp_binary_data_44; +const char* jucer_InlineComponentTemplate_h = (const char*) temp_binary_data_49; //================== jucer_MainConsoleAppTemplate.cpp ================== -static const unsigned char temp_binary_data_45[] = +static const unsigned char temp_binary_data_50[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7456,10 +7715,10 @@ " return 0;\r\n" "}\r\n"; -const char* jucer_MainConsoleAppTemplate_cpp = (const char*) temp_binary_data_45; +const char* jucer_MainConsoleAppTemplate_cpp = (const char*) temp_binary_data_50; //================== jucer_MainTemplate_NoWindow.cpp ================== -static const unsigned char temp_binary_data_46[] = +static const unsigned char temp_binary_data_51[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7512,10 +7771,10 @@ "// This macro generates the main() routine that launches the app.\r\n" "START_JUCE_APPLICATION (%%app_class_name%%)\r\n"; -const char* jucer_MainTemplate_NoWindow_cpp = (const char*) temp_binary_data_46; +const char* jucer_MainTemplate_NoWindow_cpp = (const char*) temp_binary_data_51; //================== jucer_MainTemplate_Window.cpp ================== -static const unsigned char temp_binary_data_47[] = +static const unsigned char temp_binary_data_52[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7621,10 +7880,10 @@ "// This macro generates the main() routine that launches the app.\r\n" "START_JUCE_APPLICATION (%%app_class_name%%)\r\n"; -const char* jucer_MainTemplate_Window_cpp = (const char*) temp_binary_data_47; +const char* jucer_MainTemplate_Window_cpp = (const char*) temp_binary_data_52; //================== jucer_NewComponentTemplate.cpp ================== -static const unsigned char temp_binary_data_48[] = +static const unsigned char temp_binary_data_53[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7677,10 +7936,10 @@ "\r\n" "}\r\n"; -const char* jucer_NewComponentTemplate_cpp = (const char*) temp_binary_data_48; +const char* jucer_NewComponentTemplate_cpp = (const char*) temp_binary_data_53; //================== jucer_NewComponentTemplate.h ================== -static const unsigned char temp_binary_data_49[] = +static const unsigned char temp_binary_data_54[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7711,10 +7970,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%component_class%%)\r\n" "};\r\n"; -const char* jucer_NewComponentTemplate_h = (const char*) temp_binary_data_49; +const char* jucer_NewComponentTemplate_h = (const char*) temp_binary_data_54; //================== jucer_NewCppFileTemplate.cpp ================== -static const unsigned char temp_binary_data_50[] = +static const unsigned char temp_binary_data_55[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7727,10 +7986,10 @@ "\r\n" "%%include_corresponding_header%%\r\n"; -const char* jucer_NewCppFileTemplate_cpp = (const char*) temp_binary_data_50; +const char* jucer_NewCppFileTemplate_cpp = (const char*) temp_binary_data_55; //================== jucer_NewCppFileTemplate.h ================== -static const unsigned char temp_binary_data_51[] = +static const unsigned char temp_binary_data_56[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7743,10 +8002,10 @@ "\r\n" "#pragma once\r\n"; -const char* jucer_NewCppFileTemplate_h = (const char*) temp_binary_data_51; +const char* jucer_NewCppFileTemplate_h = (const char*) temp_binary_data_56; //================== jucer_NewInlineComponentTemplate.h ================== -static const unsigned char temp_binary_data_52[] = +static const unsigned char temp_binary_data_57[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7809,10 +8068,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%component_class%%)\r\n" "};\r\n"; -const char* jucer_NewInlineComponentTemplate_h = (const char*) temp_binary_data_52; +const char* jucer_NewInlineComponentTemplate_h = (const char*) temp_binary_data_57; //================== jucer_OpenGLComponentSimpleTemplate.h ================== -static const unsigned char temp_binary_data_53[] = +static const unsigned char temp_binary_data_58[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -7881,10 +8140,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_OpenGLComponentSimpleTemplate_h = (const char*) temp_binary_data_53; +const char* jucer_OpenGLComponentSimpleTemplate_h = (const char*) temp_binary_data_58; //================== jucer_OpenGLComponentTemplate.cpp ================== -static const unsigned char temp_binary_data_54[] = +static const unsigned char temp_binary_data_59[] = "%%include_corresponding_header%%\r\n" "\r\n" "//==============================================================================\r\n" @@ -7934,10 +8193,10 @@ " // update their positions.\r\n" "}\r\n"; -const char* jucer_OpenGLComponentTemplate_cpp = (const char*) temp_binary_data_54; +const char* jucer_OpenGLComponentTemplate_cpp = (const char*) temp_binary_data_59; //================== jucer_OpenGLComponentTemplate.h ================== -static const unsigned char temp_binary_data_55[] = +static const unsigned char temp_binary_data_60[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -7971,10 +8230,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_OpenGLComponentTemplate_h = (const char*) temp_binary_data_55; +const char* jucer_OpenGLComponentTemplate_h = (const char*) temp_binary_data_60; //================== jucer_PIPAudioProcessorTemplate.h ================== -static const unsigned char temp_binary_data_56[] = +static const unsigned char temp_binary_data_61[] = "class %%class_name%% : public juce::AudioProcessor\r\n" "{\r\n" "public:\r\n" @@ -8083,10 +8342,10 @@ " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%class_name%%)\r\n" "};\r\n"; -const char* jucer_PIPAudioProcessorTemplate_h = (const char*) temp_binary_data_56; +const char* jucer_PIPAudioProcessorTemplate_h = (const char*) temp_binary_data_61; //================== jucer_PIPTemplate.h ================== -static const unsigned char temp_binary_data_57[] = +static const unsigned char temp_binary_data_62[] = "/*******************************************************************************\r\n" " The block below describes the properties of this PIP. A PIP is a short snippet\r\n" " of code that can be read by the Projucer and used to generate a JUCE project.\r\n" @@ -8105,10 +8364,10 @@ "//==============================================================================\r\n" "%%pip_code%%\r\n"; -const char* jucer_PIPTemplate_h = (const char*) temp_binary_data_57; +const char* jucer_PIPTemplate_h = (const char*) temp_binary_data_62; //================== colourscheme_dark.xml ================== -static const unsigned char temp_binary_data_58[] = +static const unsigned char temp_binary_data_63[] = "\r\n" "\r\n" "\r\n" @@ -8133,10 +8392,10 @@ " \r\n" "\r\n"; -const char* colourscheme_dark_xml = (const char*) temp_binary_data_58; +const char* colourscheme_dark_xml = (const char*) temp_binary_data_63; //================== colourscheme_light.xml ================== -static const unsigned char temp_binary_data_59[] = +static const unsigned char temp_binary_data_64[] = "\r\n" "\r\n" "\r\n" @@ -8161,10 +8420,35 @@ " \r\n" "\r\n"; -const char* colourscheme_light_xml = (const char*) temp_binary_data_59; +const char* colourscheme_light_xml = (const char*) temp_binary_data_64; //================== juce_runtime_arch_detection.cpp ================== -static const unsigned char temp_binary_data_60[] = +static const unsigned char temp_binary_data_65[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file is part of the JUCE library.\r\n" +" Copyright (c) 2022 - Raw Material Software Limited\r\n" +"\r\n" +" JUCE is an open source library subject to commercial or open-source\r\n" +" licensing.\r\n" +"\r\n" +" By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r\n" +" Agreement and JUCE Privacy Policy.\r\n" +"\r\n" +" End User License Agreement: www.juce.com/juce-7-licence\r\n" +" Privacy Policy: www.juce.com/juce-privacy-policy\r\n" +"\r\n" +" Or: You may also use this code under the terms of the GPL v3 (see\r\n" +" www.gnu.org/licenses).\r\n" +"\r\n" +" JUCE IS PROVIDED \"AS IS\" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r\n" +" EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r\n" +" DISCLAIMED.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" "#if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(_M_ARM64) || defined(__aarch64__) || defined(__ARM64__)\r\n" "\r\n" " #if defined(_M_ARM64) || defined(__aarch64__) || defined(__ARM64__)\r\n" @@ -8225,7 +8509,7 @@ "\r\n" "#endif\r\n"; -const char* juce_runtime_arch_detection_cpp = (const char*) temp_binary_data_60; +const char* juce_runtime_arch_detection_cpp = (const char*) temp_binary_data_65; const char* getNamedResource (const char* resourceNameUTF8, int& numBytes); @@ -8239,8 +8523,10 @@ switch (hash) { + case 0xd764ff7e: numBytes = 91; return JuceLV2Defines_h_in; case 0x31d21131: numBytes = 1042; return LaunchScreen_storyboard; case 0x24e5a04d: numBytes = 483; return PIPAudioProcessor_cpp_in; + case 0x956e0109: numBytes = 689; return PIPAudioProcessorWithARA_cpp_in; case 0xd572ce5a: numBytes = 2275; return PIPComponent_cpp_in; case 0x1a77c680: numBytes = 299; return PIPConsole_cpp_in; case 0xa41e649d: numBytes = 2842; return RecentFilesMenuTemplate_nib; @@ -8251,7 +8537,6 @@ case 0x34bc1021: numBytes = 11325; return LICENSE; case 0x406db5c1: numBytes = 3249; return background_logo_svg; case 0xbe17d889: numBytes = 3586; return export_android_svg; - case 0x84c51a59: numBytes = 2244; return export_clion_svg; case 0x83f049e3: numBytes = 1726; return export_codeBlocks_svg; case 0x96d2a1ce: numBytes = 28184; return export_linux_svg; case 0x2505bd06: numBytes = 1706; return export_visualStudio_svg; @@ -8274,10 +8559,14 @@ case 0xfb6f6d96: numBytes = 3554; return jucer_AudioComponentSimpleTemplate_h; case 0xafccbd3f: numBytes = 2941; return jucer_AudioComponentTemplate_cpp; case 0x915d7304: numBytes = 1187; return jucer_AudioComponentTemplate_h; + case 0x744d44d6: numBytes = 1920; return jucer_AudioPluginARADocumentControllerTemplate_cpp; + case 0x3eb8f45b: numBytes = 1439; return jucer_AudioPluginARADocumentControllerTemplate_h; + case 0xea35a37d: numBytes = 5192; return jucer_AudioPluginARAPlaybackRendererTemplate_cpp; + case 0x78a6d0c2: numBytes = 1765; return jucer_AudioPluginARAPlaybackRendererTemplate_h; case 0x27c5a93a: numBytes = 1355; return jucer_AudioPluginEditorTemplate_cpp; case 0x4d0721bf: numBytes = 973; return jucer_AudioPluginEditorTemplate_h; case 0x51b49ac5: numBytes = 6218; return jucer_AudioPluginFilterTemplate_cpp; - case 0x488afa0a: numBytes = 2299; return jucer_AudioPluginFilterTemplate_h; + case 0x488afa0a: numBytes = 2462; return jucer_AudioPluginFilterTemplate_h; case 0xabad7041: numBytes = 2147; return jucer_ComponentTemplate_cpp; case 0xfc72fe86: numBytes = 2065; return jucer_ComponentTemplate_h; case 0x1657b643: numBytes = 1524; return jucer_ContentCompSimpleTemplate_h; @@ -8299,7 +8588,7 @@ case 0x0b16e320: numBytes = 517; return jucer_PIPTemplate_h; case 0x763d39dc: numBytes = 1050; return colourscheme_dark_xml; case 0xe8b08520: numBytes = 1050; return colourscheme_light_xml; - case 0x7c03d519: numBytes = 2129; return juce_runtime_arch_detection_cpp; + case 0x7c03d519: numBytes = 3005; return juce_runtime_arch_detection_cpp; default: break; } @@ -8309,8 +8598,10 @@ const char* namedResourceList[] = { + "JuceLV2Defines_h_in", "LaunchScreen_storyboard", "PIPAudioProcessor_cpp_in", + "PIPAudioProcessorWithARA_cpp_in", "PIPComponent_cpp_in", "PIPConsole_cpp_in", "RecentFilesMenuTemplate_nib", @@ -8321,7 +8612,6 @@ "LICENSE", "background_logo_svg", "export_android_svg", - "export_clion_svg", "export_codeBlocks_svg", "export_linux_svg", "export_visualStudio_svg", @@ -8344,6 +8634,10 @@ "jucer_AudioComponentSimpleTemplate_h", "jucer_AudioComponentTemplate_cpp", "jucer_AudioComponentTemplate_h", + "jucer_AudioPluginARADocumentControllerTemplate_cpp", + "jucer_AudioPluginARADocumentControllerTemplate_h", + "jucer_AudioPluginARAPlaybackRendererTemplate_cpp", + "jucer_AudioPluginARAPlaybackRendererTemplate_h", "jucer_AudioPluginEditorTemplate_cpp", "jucer_AudioPluginEditorTemplate_h", "jucer_AudioPluginFilterTemplate_cpp", @@ -8374,8 +8668,10 @@ const char* originalFilenames[] = { + "JuceLV2Defines.h.in", "LaunchScreen.storyboard", "PIPAudioProcessor.cpp.in", + "PIPAudioProcessorWithARA.cpp.in", "PIPComponent.cpp.in", "PIPConsole.cpp.in", "RecentFilesMenuTemplate.nib", @@ -8386,7 +8682,6 @@ "LICENSE", "background_logo.svg", "export_android.svg", - "export_clion.svg", "export_codeBlocks.svg", "export_linux.svg", "export_visualStudio.svg", @@ -8409,6 +8704,10 @@ "jucer_AudioComponentSimpleTemplate.h", "jucer_AudioComponentTemplate.cpp", "jucer_AudioComponentTemplate.h", + "jucer_AudioPluginARADocumentControllerTemplate.cpp", + "jucer_AudioPluginARADocumentControllerTemplate.h", + "jucer_AudioPluginARAPlaybackRendererTemplate.cpp", + "jucer_AudioPluginARAPlaybackRendererTemplate.h", "jucer_AudioPluginEditorTemplate.cpp", "jucer_AudioPluginEditorTemplate.h", "jucer_AudioPluginFilterTemplate.cpp", @@ -8441,10 +8740,8 @@ const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8) { for (unsigned int i = 0; i < (sizeof (namedResourceList) / sizeof (namedResourceList[0])); ++i) - { - if (namedResourceList[i] == resourceNameUTF8) + if (strcmp (namedResourceList[i], resourceNameUTF8) == 0) return originalFilenames[i]; - } return nullptr; } diff -Nru juce-6.1.5~ds0/extras/Projucer/JuceLibraryCode/BinaryData.h juce-7.0.0~ds0/extras/Projucer/JuceLibraryCode/BinaryData.h --- juce-6.1.5~ds0/extras/Projucer/JuceLibraryCode/BinaryData.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/JuceLibraryCode/BinaryData.h 2022-06-21 07:56:28.000000000 +0000 @@ -8,12 +8,18 @@ namespace BinaryData { + extern const char* JuceLV2Defines_h_in; + const int JuceLV2Defines_h_inSize = 91; + extern const char* LaunchScreen_storyboard; const int LaunchScreen_storyboardSize = 1042; extern const char* PIPAudioProcessor_cpp_in; const int PIPAudioProcessor_cpp_inSize = 483; + extern const char* PIPAudioProcessorWithARA_cpp_in; + const int PIPAudioProcessorWithARA_cpp_inSize = 689; + extern const char* PIPComponent_cpp_in; const int PIPComponent_cpp_inSize = 2275; @@ -44,9 +50,6 @@ extern const char* export_android_svg; const int export_android_svgSize = 3586; - extern const char* export_clion_svg; - const int export_clion_svgSize = 2244; - extern const char* export_codeBlocks_svg; const int export_codeBlocks_svgSize = 1726; @@ -113,6 +116,18 @@ extern const char* jucer_AudioComponentTemplate_h; const int jucer_AudioComponentTemplate_hSize = 1187; + extern const char* jucer_AudioPluginARADocumentControllerTemplate_cpp; + const int jucer_AudioPluginARADocumentControllerTemplate_cppSize = 1920; + + extern const char* jucer_AudioPluginARADocumentControllerTemplate_h; + const int jucer_AudioPluginARADocumentControllerTemplate_hSize = 1439; + + extern const char* jucer_AudioPluginARAPlaybackRendererTemplate_cpp; + const int jucer_AudioPluginARAPlaybackRendererTemplate_cppSize = 5192; + + extern const char* jucer_AudioPluginARAPlaybackRendererTemplate_h; + const int jucer_AudioPluginARAPlaybackRendererTemplate_hSize = 1765; + extern const char* jucer_AudioPluginEditorTemplate_cpp; const int jucer_AudioPluginEditorTemplate_cppSize = 1355; @@ -123,7 +138,7 @@ const int jucer_AudioPluginFilterTemplate_cppSize = 6218; extern const char* jucer_AudioPluginFilterTemplate_h; - const int jucer_AudioPluginFilterTemplate_hSize = 2299; + const int jucer_AudioPluginFilterTemplate_hSize = 2462; extern const char* jucer_ComponentTemplate_cpp; const int jucer_ComponentTemplate_cppSize = 2147; @@ -189,10 +204,10 @@ const int colourscheme_light_xmlSize = 1050; extern const char* juce_runtime_arch_detection_cpp; - const int juce_runtime_arch_detection_cppSize = 2129; + const int juce_runtime_arch_detection_cppSize = 3005; // Number of elements in the namedResourceList and originalFileNames arrays. - const int namedResourceListSize = 61; + const int namedResourceListSize = 66; // Points to the start of a list of resource names. extern const char* namedResourceList[]; diff -Nru juce-6.1.5~ds0/extras/Projucer/JuceLibraryCode/JuceHeader.h juce-7.0.0~ds0/extras/Projucer/JuceLibraryCode/JuceHeader.h --- juce-6.1.5~ds0/extras/Projucer/JuceLibraryCode/JuceHeader.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/JuceLibraryCode/JuceHeader.h 2022-06-21 07:56:28.000000000 +0000 @@ -44,7 +44,7 @@ { const char* const projectName = "Projucer"; const char* const companyName = "Raw Material Software Limited"; - const char* const versionString = "6.1.5"; - const int versionNumber = 0x60105; + const char* const versionString = "7.0.0"; + const int versionNumber = 0x70000; } #endif diff -Nru juce-6.1.5~ds0/extras/Projucer/Projucer.jucer juce-7.0.0~ds0/extras/Projucer/Projucer.jucer --- juce-6.1.5~ds0/extras/Projucer/Projucer.jucer 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Projucer.jucer 2022-06-21 07:56:28.000000000 +0000 @@ -1,7 +1,7 @@ @@ -27,25 +27,6 @@ - - - - - - - - - - - - - - - - @@ -187,10 +168,14 @@ file="Source/Application/jucer_MainWindow.h"/> + + - + + + + - setProperty ("file", getModulePackageName (module)); - moduleInfo.getDynamicObject()->setProperty ("info", module.moduleInfo.getModuleInfo()); + moduleInfo.getDynamicObject()->setProperty ("info", module.moduleDescription.getModuleInfo()); infoList.append (moduleInfo); } } @@ -715,7 +715,7 @@ static bool isValidPathIdentifier (const String& id, const String& os) { - return id == "vstLegacyPath" || (id == "aaxPath" && os != "linux") || (id == "rtasPath" && os != "linux") + return id == "vstLegacyPath" || (id == "aaxPath" && os != "linux") || id == "araPath" || id == "androidSDKPath" || id == "defaultJuceModulePath" || id == "defaultUserModulePath"; } @@ -877,7 +877,7 @@ << std::endl << " " << appName << " --set-global-search-path os identifier_to_set new_path" << std::endl << " Sets the global path for a specified os and identifier. The os should be either osx, windows or linux and the identifiers can be any of the following: " - << "defaultJuceModulePath, defaultUserModulePath, vstLegacyPath, aaxPath (not valid on linux), rtasPath (not valid on linux), or androidSDKPath. " << std::endl + << "defaultJuceModulePath, defaultUserModulePath, vstLegacyPath, aaxPath (not valid on linux), or androidSDKPath. " << std::endl << std::endl << " " << appName << " --create-project-from-pip path/to/PIP path/to/output path/to/JUCE/modules (optional) path/to/user/modules (optional)" << std::endl << " Generates a folder containing a JUCE project in the specified output path using the specified PIP file. Use the optional JUCE and user module paths to override " diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/jucer_CommandLine.h juce-7.0.0~ds0/extras/Projucer/Source/Application/jucer_CommandLine.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/jucer_CommandLine.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/jucer_CommandLine.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/jucer_CommonHeaders.h juce-7.0.0~ds0/extras/Projucer/Source/Application/jucer_CommonHeaders.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/jucer_CommonHeaders.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/jucer_CommonHeaders.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/jucer_Headers.h juce-7.0.0~ds0/extras/Projucer/Source/Application/jucer_Headers.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/jucer_Headers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/jucer_Headers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/jucer_Main.cpp juce-7.0.0~ds0/extras/Projucer/Source/Application/jucer_Main.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Application/jucer_Main.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/jucer_Main.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/jucer_MainWindow.cpp juce-7.0.0~ds0/extras/Projucer/Source/Application/jucer_MainWindow.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Application/jucer_MainWindow.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/jucer_MainWindow.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -1012,7 +1012,8 @@ auto screenLimits = Desktop::getInstance().getDisplays().getDisplayForRect (windowBounds)->userArea; if (auto* peer = windowToCheck.getPeer()) - peer->getFrameSize().subtractFrom (screenLimits); + if (const auto frameSize = peer->getFrameSizeIfPresent()) + frameSize->subtractFrom (screenLimits); auto constrainedX = jlimit (screenLimits.getX(), jmax (screenLimits.getX(), screenLimits.getRight() - windowBounds.getWidth()), windowBounds.getX()); auto constrainedY = jlimit (screenLimits.getY(), jmax (screenLimits.getY(), screenLimits.getBottom() - windowBounds.getHeight()), windowBounds.getY()); diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/jucer_MainWindow.h juce-7.0.0~ds0/extras/Projucer/Source/Application/jucer_MainWindow.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/jucer_MainWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/jucer_MainWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_ContentComponents.h juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_ContentComponents.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_ContentComponents.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_ContentComponents.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_NewProjectTemplates.h juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_NewProjectTemplates.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_NewProjectTemplates.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_NewProjectTemplates.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -53,7 +53,8 @@ main, header, headerAndCpp, - processorAndEditor + processorAndEditor, + araPluginFiles }; using FilenameAndContent = std::pair; @@ -94,6 +95,7 @@ if (opt == FileCreationOptions::header) return "header"; if (opt == FileCreationOptions::headerAndCpp) return "headercpp"; if (opt == FileCreationOptions::processorAndEditor) return "processoreditor"; + if (opt == FileCreationOptions::araPluginFiles) return "arapluginfiles"; jassertfalse; return {}; @@ -106,6 +108,7 @@ if (opt == "header") return FileCreationOptions::header; if (opt == "headercpp") return FileCreationOptions::headerAndCpp; if (opt == "processoreditor") return FileCreationOptions::processorAndEditor; + if (opt == "arapluginfiles") return FileCreationOptions::araPluginFiles; jassertfalse; return {}; @@ -118,6 +121,7 @@ if (opt == FileCreationOptions::header) return "Main.cpp + .h"; if (opt == FileCreationOptions::headerAndCpp) return "Main.cpp + .h/.cpp "; if (opt == FileCreationOptions::processorAndEditor) return "Processor and Editor"; + if (opt == FileCreationOptions::araPluginFiles) return "ARA Plugin Files"; jassertfalse; return {}; @@ -229,6 +233,24 @@ FileCreationOptions::processorAndEditor }, + { ProjectCategory::plugin, + "ARA", "Creates an ARA audio plug-in, augmenting the basic audio plug-in with ARA functionality.", + build_tools::ProjectType_ARAAudioPlugin::getTypeName(), + BinaryData::wizard_AudioPlugin_svg, + getModulesRequiredForAudioProcessor(), + { + { FileCreationOptions::araPluginFiles, { { "PluginProcessor.cpp", "jucer_AudioPluginFilterTemplate_cpp" }, + { "PluginProcessor.h", "jucer_AudioPluginFilterTemplate_h" }, + { "PluginEditor.cpp", "jucer_AudioPluginEditorTemplate_cpp" }, + { "PluginEditor.h", "jucer_AudioPluginEditorTemplate_h" }, + { "PluginARADocumentController.cpp", "jucer_AudioPluginARADocumentControllerTemplate_cpp" }, + { "PluginARADocumentController.h", "jucer_AudioPluginARADocumentControllerTemplate_h" }, + { "PluginARAPlaybackRenderer.cpp", "jucer_AudioPluginARAPlaybackRendererTemplate_cpp" }, + { "PluginARAPlaybackRenderer.h", "jucer_AudioPluginARAPlaybackRendererTemplate_h" }} } + }, + FileCreationOptions::araPluginFiles + }, + { ProjectCategory::library, "Static Library", "Creates a static library.", build_tools::ProjectType_StaticLibrary::getTypeName(), diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.cpp juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -121,11 +121,28 @@ processorClassName = processorClassName.substring (0, 1).toUpperCase() + processorClassName.substring (1); auto editorClassName = processorClassName + "Editor"; + const auto araDocumentControllerCppFile = sourceFolder.getChildFile ("PluginARADocumentController.cpp"); + const auto araDocumentControllerHFile = araDocumentControllerCppFile.withFileExtension (".h"); + const auto araPlaybackRendererCppFile = sourceFolder.getChildFile ("PluginARAPlaybackRenderer.cpp"); + const auto araPlaybackRendererHFile = araPlaybackRendererCppFile.withFileExtension (".h"); + + const auto araDocumentControllerHInclude = CodeHelpers::createIncludeStatement (araDocumentControllerHFile, araDocumentControllerCppFile); + const auto araPlaybackRendererHInclude = CodeHelpers::createIncludeStatement (araPlaybackRendererHFile, araPlaybackRendererCppFile); + + auto araDocumentControllerClassName = build_tools::makeValidIdentifier (name, true, true, false) + "DocumentController"; + araDocumentControllerClassName = araDocumentControllerClassName.substring (0, 1).toUpperCase() + araDocumentControllerClassName.substring (1); + auto araPlaybackRendererClassName = build_tools::makeValidIdentifier (name, true, true, false) + "PlaybackRenderer"; + araPlaybackRendererClassName = araPlaybackRendererClassName.substring (0, 1).toUpperCase() + araPlaybackRendererClassName.substring (1); + tokenReplacements.insert ({"%%filter_headers%%", processorHInclude + newLine + editorHInclude }); tokenReplacements.insert ({"%%filter_class_name%%", processorClassName }); tokenReplacements.insert ({"%%editor_class_name%%", editorClassName }); tokenReplacements.insert ({"%%editor_cpp_headers%%", processorHInclude + newLine + editorHInclude }); tokenReplacements.insert ({"%%editor_headers%%", getJuceHeaderInclude() + newLine + processorHInclude }); + tokenReplacements.insert ({"%%aradocumentcontroller_headers%%", araDocumentControllerHInclude }); + tokenReplacements.insert ({"%%aradocumentcontroller_class_name%%", araDocumentControllerClassName }); + tokenReplacements.insert ({"%%araplaybackrenderer_headers%%", araPlaybackRendererHInclude }); + tokenReplacements.insert ({"%%araplaybackrenderer_class_name%%", araPlaybackRendererClassName }); return tokenReplacements; } diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.h juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.cpp juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_StartPageTreeHolder.h juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_StartPageTreeHolder.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/StartPage/jucer_StartPageTreeHolder.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/StartPage/jucer_StartPageTreeHolder.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LicenseController.h juce-7.0.0~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LicenseController.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LicenseController.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LicenseController.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LicenseQueryThread.h juce-7.0.0~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LicenseQueryThread.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LicenseQueryThread.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LicenseQueryThread.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LicenseState.h juce-7.0.0~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LicenseState.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LicenseState.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LicenseState.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LoginFormComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LoginFormComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LoginFormComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/UserAccount/jucer_LoginFormComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_AboutWindowComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_AboutWindowComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_AboutWindowComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_AboutWindowComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_FloatingToolWindow.h juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_FloatingToolWindow.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_FloatingToolWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_FloatingToolWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -225,13 +225,13 @@ "If you are building a legacy VST plug-in then this path should point to a VST2 SDK. " "The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK or JUCE version 5.3.2. " "You also need a VST2 license from Steinberg to distribute VST2 plug-ins."); + builder.add (new FilePathPropertyComponent (araPathValue, "ARA SDK", true, isThisOS), + "If you are building ARA enabled plug-ins, this should be the path to the ARA SDK folder."); if (getSelectedOS() != TargetOS::linux) { builder.add (new FilePathPropertyComponent (aaxPathValue, "AAX SDK", true, isThisOS), "If you are building AAX plug-ins, this should be the path to the AAX SDK folder."); - builder.add (new FilePathPropertyComponent (rtasPathValue, "RTAS SDK (deprecated)", true, isThisOS), - "If you are building RTAS plug-ins, this should be the path to the RTAS SDK folder."); } builder.add (new FilePathPropertyComponent (androidSDKPathValue, "Android SDK", true, isThisOS), @@ -249,8 +249,6 @@ String exeLabel ("startup script"); #endif - builder.add (new FilePathPropertyComponent (clionExePathValue, "CLion " + exeLabel, false, isThisOS), - "This path will be used for the \"Save Project and Open in IDE...\" option of the CLion exporter."); builder.add (new FilePathPropertyComponent (androidStudioExePathValue, "Android Studio " + exeLabel, false, isThisOS), "This path will be used for the \"Save Project and Open in IDE...\" option of the Android Studio exporter."); } @@ -271,10 +269,9 @@ juceModulePathValue = settings.getStoredPath (Ids::defaultJuceModulePath, os); userModulePathValue = settings.getStoredPath (Ids::defaultUserModulePath, os); vstPathValue = settings.getStoredPath (Ids::vstLegacyPath, os); - rtasPathValue = settings.getStoredPath (Ids::rtasPath, os); aaxPathValue = settings.getStoredPath (Ids::aaxPath, os); + araPathValue = settings.getStoredPath (Ids::araPath, os); androidSDKPathValue = settings.getStoredPath (Ids::androidSDKPath, os); - clionExePathValue = settings.getStoredPath (Ids::clionExePath, os); androidStudioExePathValue = settings.getStoredPath (Ids::androidStudioExePath, os); } @@ -284,10 +281,9 @@ juceModulePathValue .resetToDefault(); userModulePathValue .resetToDefault(); vstPathValue .resetToDefault(); - rtasPathValue .resetToDefault(); aaxPathValue .resetToDefault(); + araPathValue .resetToDefault(); androidSDKPathValue .resetToDefault(); - clionExePathValue .resetToDefault(); androidStudioExePathValue.resetToDefault(); repaint(); @@ -297,8 +293,8 @@ Value selectedOSValue; ValueTreePropertyWithDefault jucePathValue, juceModulePathValue, userModulePathValue, - vstPathValue, rtasPathValue, aaxPathValue, androidSDKPathValue, - clionExePathValue, androidStudioExePathValue; + vstPathValue, aaxPathValue, araPathValue, androidSDKPathValue, + androidStudioExePathValue; Viewport propertyViewport; PropertyGroupComponent propertyGroup { "Global Paths", { getIcons().openFolder, Colours::transparentBlack } }; diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_PIPCreatorWindowComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_PIPCreatorWindowComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_PIPCreatorWindowComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_PIPCreatorWindowComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_SVGPathDataWindowComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_SVGPathDataWindowComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_SVGPathDataWindowComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_SVGPathDataWindowComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_TranslationToolWindowComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_TranslationToolWindowComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_TranslationToolWindowComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_TranslationToolWindowComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_UTF8WindowComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_UTF8WindowComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Application/Windows/jucer_UTF8WindowComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Application/Windows/jucer_UTF8WindowComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/BinaryData/Icons/export_clion.svg juce-7.0.0~ds0/extras/Projucer/Source/BinaryData/Icons/export_clion.svg --- juce-6.1.5~ds0/extras/Projucer/Source/BinaryData/Icons/export_clion.svg 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/BinaryData/Icons/export_clion.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - icon_CLion - - - - - - - - - - - - - diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.cpp juce-7.0.0~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,42 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic framework code for an ARA document controller implementation. + + ============================================================================== +*/ + +%%aradocumentcontroller_headers%% +%%araplaybackrenderer_headers%% + +//============================================================================== +ARA::PlugIn::PlaybackRenderer* %%aradocumentcontroller_class_name%%::doCreatePlaybackRenderer() noexcept +{ + return new %%araplaybackrenderer_class_name%% (getDocumentController()); +} + +//============================================================================== +bool %%aradocumentcontroller_class_name%%::doRestoreObjectsFromStream (juce::ARAInputStream& input, const juce::ARARestoreObjectsFilter* filter) noexcept +{ + // You should use this method to read any persistent data associated with + // your ARA model graph stored in an archive using the supplied ARAInputStream. + // Be sure to check the ARARestoreObjectsFilter to determine which objects to restore. + return true; +} + +bool %%aradocumentcontroller_class_name%%::doStoreObjectsToStream (juce::ARAOutputStream& output, const juce::ARAStoreObjectsFilter* filter) noexcept +{ + // You should use this method to write any persistent data associated with + // your ARA model graph into the an archive using the supplied ARAOutputStream. + // Be sure to check the ARAStoreObjectsFilter to determine which objects to store. + return true; +} + +//============================================================================== +// This creates the static ARAFactory instances for the plugin. +const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory() +{ + return juce::ARADocumentControllerSpecialisation::createARAFactory<%%aradocumentcontroller_class_name%%>(); +} diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h juce-7.0.0~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h --- juce-6.1.5~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,36 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic framework code for an ARA document controller implementation. + + ============================================================================== +*/ + +#pragma once + +#include + +//============================================================================== +/** +*/ +class %%aradocumentcontroller_class_name%% : public juce::ARADocumentControllerSpecialisation +{ +public: + //============================================================================== + using ARADocumentControllerSpecialisation::ARADocumentControllerSpecialisation; + +protected: + //============================================================================== + // Override document controller customization methods here + + ARAPlaybackRenderer* doCreatePlaybackRenderer() noexcept override; + + bool doRestoreObjectsFromStream (juce::ARAInputStream& input, const juce::ARARestoreObjectsFilter* filter) noexcept override; + bool doStoreObjectsToStream (juce::ARAOutputStream& output, const juce::ARAStoreObjectsFilter* filter) noexcept override; + +private: + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%aradocumentcontroller_class_name%%) +}; diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp juce-7.0.0~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,112 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic framework code for an ARA playback renderer implementation. + + ============================================================================== +*/ + +%%araplaybackrenderer_headers%% + +//============================================================================== +void %%araplaybackrenderer_class_name%%::prepareToPlay (double sampleRateIn, int maximumSamplesPerBlockIn, int numChannelsIn, juce::AudioProcessor::ProcessingPrecision, AlwaysNonRealtime alwaysNonRealtime) +{ + numChannels = numChannelsIn; + sampleRate = sampleRateIn; + maximumSamplesPerBlock = maximumSamplesPerBlockIn; + useBufferedAudioSourceReader = alwaysNonRealtime == AlwaysNonRealtime::no; +} + +void %%araplaybackrenderer_class_name%%::releaseResources() +{ +} + +//============================================================================== +bool %%araplaybackrenderer_class_name%%::processBlock (juce::AudioBuffer& buffer, juce::AudioProcessor::Realtime realtime, const juce::AudioPlayHead::CurrentPositionInfo& positionInfo) noexcept +{ + const auto numSamples = buffer.getNumSamples(); + jassert (numSamples <= maximumSamplesPerBlock); + jassert (numChannels == buffer.getNumChannels()); + jassert (realtime == juce::AudioProcessor::Realtime::no || useBufferedAudioSourceReader); + const auto timeInSamples = positionInfo.timeInSamples; + const auto isPlaying = positionInfo.isPlaying; + + bool success = true; + bool didRenderAnyRegion = false; + + if (isPlaying) + { + const auto blockRange = juce::Range::withStartAndLength (timeInSamples, numSamples); + + for (const auto& playbackRegion : getPlaybackRegions()) + { + // Evaluate region borders in song time, calculate sample range to render in song time. + // Note that this example does not use head- or tailtime, so the includeHeadAndTail + // parameter is set to false here - this might need to be adjusted in actual plug-ins. + const auto playbackSampleRange = playbackRegion->getSampleRange (sampleRate, + juce::ARAPlaybackRegion::IncludeHeadAndTail::no); + auto renderRange = blockRange.getIntersectionWith (playbackSampleRange); + + if (renderRange.isEmpty()) + continue; + + // Evaluate region borders in modification/source time and calculate offset between + // song and source samples, then clip song samples accordingly + // (if an actual plug-in supports time stretching, this must be taken into account here). + juce::Range modificationSampleRange { playbackRegion->getStartInAudioModificationSamples(), + playbackRegion->getEndInAudioModificationSamples() }; + const auto modificationSampleOffset = modificationSampleRange.getStart() - playbackSampleRange.getStart(); + + renderRange = renderRange.getIntersectionWith (modificationSampleRange.movedToStartAt (playbackSampleRange.getStart())); + + if (renderRange.isEmpty()) + continue; + + // Now calculate the samples in renderRange for this PlaybackRegion based on the ARA model + // graph. If didRenderAnyRegion is true, add the region's output samples in renderRange to + // the buffer. Otherwise the buffer needs to be initialised so the sample value must be + // overwritten. + const int numSamplesToRead = (int) renderRange.getLength(); + const int startInBuffer = (int) (renderRange.getStart() - blockRange.getStart()); + const auto startInSource = renderRange.getStart() + modificationSampleOffset; + + for (int c = 0; c < numChannels; ++c) + { + auto* channelData = buffer.getWritePointer (c); + + for (int i = 0; i < numSamplesToRead; ++i) + { + // Calculate region output sample at index startInSource + i ... + float sample = 0.0f; + + if (didRenderAnyRegion) + channelData[startInBuffer + i] += sample; + else + channelData[startInBuffer + i] = sample; + } + } + + // If rendering first region, clear any excess at start or end of the region. + if (! didRenderAnyRegion) + { + if (startInBuffer != 0) + buffer.clear (0, startInBuffer); + + const int endInBuffer = startInBuffer + numSamples; + const int remainingSamples = numSamples - endInBuffer; + + if (remainingSamples != 0) + buffer.clear (endInBuffer, remainingSamples); + + didRenderAnyRegion = true; + } + } + } + + if (! didRenderAnyRegion) + buffer.clear(); + + return success; +} diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.h juce-7.0.0~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.h --- juce-6.1.5~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,45 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic framework code for an ARA playback renderer implementation. + + ============================================================================== +*/ + +#pragma once + +#include + +//============================================================================== +/** +*/ +class %%araplaybackrenderer_class_name%% : public juce::ARAPlaybackRenderer +{ +public: + //============================================================================== + using juce::ARAPlaybackRenderer::ARAPlaybackRenderer; + + //============================================================================== + void prepareToPlay (double sampleRate, + int maximumSamplesPerBlock, + int numChannels, + juce::AudioProcessor::ProcessingPrecision, + AlwaysNonRealtime alwaysNonRealtime) override; + void releaseResources() override; + + //============================================================================== + bool processBlock (juce::AudioBuffer & buffer, + juce::AudioProcessor::Realtime realtime, + const juce::AudioPlayHead::CurrentPositionInfo& positionInfo) noexcept override; + +private: + //============================================================================== + double sampleRate = 44100.0; + int maximumSamplesPerBlock = 4096; + int numChannels = 1; + bool useBufferedAudioSourceReader = true; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%araplaybackrenderer_class_name%%) +}; diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h juce-7.0.0~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h --- juce-6.1.5~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h 2022-06-21 07:56:28.000000000 +0000 @@ -14,6 +14,9 @@ /** */ class %%filter_class_name%% : public juce::AudioProcessor + #if JucePlugin_Enable_ARA + , public juce::AudioProcessorARAExtension + #endif { public: //============================================================================== diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.cpp juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.h juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_ItemPreviewComponent.h juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_ItemPreviewComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_ItemPreviewComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_ItemPreviewComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.cpp juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.h juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.h --- juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.cpp juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.h juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.h --- juce-6.1.5~ds0/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ButtonHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ButtonHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ButtonHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ButtonHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComboBoxHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComboBoxHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComboBoxHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComboBoxHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentNameProperty.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentNameProperty.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentNameProperty.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentNameProperty.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_GenericComponentHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_GenericComponentHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_GenericComponentHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_GenericComponentHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_GroupComponentHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_GroupComponentHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_GroupComponentHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_GroupComponentHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -83,7 +83,7 @@ HyperlinkButton* const hb = dynamic_cast (comp); return quotedString (hb->getButtonText(), code.shouldUseTransMacro()) - + ",\nURL (" + + ",\njuce::URL (" + quotedString (hb->getURL().toString (false), false) + ")"; } diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ImageButtonHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ImageButtonHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ImageButtonHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ImageButtonHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_JucerComponentHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_JucerComponentHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_JucerComponentHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_JucerComponentHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_LabelHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_LabelHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_LabelHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_LabelHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_SliderHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_SliderHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_SliderHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_SliderHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TextButtonHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TextButtonHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TextButtonHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TextButtonHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TextEditorHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TextEditorHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TextEditorHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TextEditorHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TreeViewHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TreeViewHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TreeViewHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_TreeViewHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ViewportHandler.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ViewportHandler.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ViewportHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Components/jucer_ViewportHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_UtilityFunctions.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_UtilityFunctions.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/jucer_UtilityFunctions.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/jucer_UtilityFunctions.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_FillType.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_FillType.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_FillType.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_FillType.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementText.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementText.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementText.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementText.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PointComponent.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PointComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PointComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PointComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_StrokeType.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_StrokeType.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_StrokeType.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_StrokeType.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_JustificationProperty.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_JustificationProperty.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_JustificationProperty.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_JustificationProperty.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerCommandIDs.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerCommandIDs.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerCommandIDs.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerCommandIDs.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_SnapGridPainter.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_SnapGridPainter.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_SnapGridPainter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_SnapGridPainter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.cpp juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.h juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Licenses/jucer_LicenseController.cpp juce-7.0.0~ds0/extras/Projucer/Source/Licenses/jucer_LicenseController.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Licenses/jucer_LicenseController.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Licenses/jucer_LicenseController.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h juce-7.0.0~ds0/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h juce-7.0.0~ds0/extras/Projucer/Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h juce-7.0.0~ds0/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/jucer_Project.cpp juce-7.0.0~ds0/extras/Projucer/Source/Project/jucer_Project.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Project/jucer_Project.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/jucer_Project.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -162,6 +162,10 @@ bundleIdentifierValue. setDefault (getDefaultBundleIdentifierString()); pluginAUExportPrefixValue.setDefault (build_tools::makeValidIdentifier (projectName, false, true, false) + "AU"); pluginAAXIdentifierValue. setDefault (getDefaultAAXIdentifierString()); + pluginLV2URIValue. setDefault (getDefaultLV2URI()); + pluginARAFactoryIDValue. setDefault (getDefaultARAFactoryIDString()); + pluginARAArchiveIDValue. setDefault (getDefaultARADocumentArchiveID()); + pluginARACompatibleArchiveIDsValue.setDefault (getDefaultARACompatibleArchiveIDs()); } String Project::getDocumentTitle() @@ -172,12 +176,20 @@ void Project::updateCompanyNameDependencies() { bundleIdentifierValue.setDefault (getDefaultBundleIdentifierString()); + companyWebsiteValue.setDefault (getDefaultCompanyWebsiteString()); pluginAAXIdentifierValue.setDefault (getDefaultAAXIdentifierString()); + pluginARAFactoryIDValue.setDefault (getDefaultARAFactoryIDString()); + pluginARAArchiveIDValue.setDefault (getDefaultARADocumentArchiveID()); pluginManufacturerValue.setDefault (getDefaultPluginManufacturerString()); updateLicenseWarning(); } +void Project::updateWebsiteDependencies() +{ + pluginLV2URIValue.setDefault (getDefaultLV2URI()); +} + void Project::updateProjectSettings() { projectRoot.setProperty (Ids::name, getDocumentTitle(), nullptr); @@ -274,7 +286,7 @@ companyNameValue.referTo (projectRoot, Ids::companyName, getUndoManager()); companyCopyrightValue.referTo (projectRoot, Ids::companyCopyright, getUndoManager()); - companyWebsiteValue.referTo (projectRoot, Ids::companyWebsite, getUndoManager()); + companyWebsiteValue.referTo (projectRoot, Ids::companyWebsite, getUndoManager(), getDefaultCompanyWebsiteString()); companyEmailValue.referTo (projectRoot, Ids::companyEmail, getUndoManager()); projectTypeValue.referTo (projectRoot, Ids::projectType, getUndoManager(), build_tools::ProjectType_GUIApp::getTypeName()); @@ -330,6 +342,8 @@ pluginCodeValue.referTo (projectRoot, Ids::pluginCode, getUndoManager(), makeValid4CC (getProjectUIDString() + getProjectUIDString())); pluginChannelConfigsValue.referTo (projectRoot, Ids::pluginChannelConfigs, getUndoManager()); pluginAAXIdentifierValue.referTo (projectRoot, Ids::aaxIdentifier, getUndoManager(), getDefaultAAXIdentifierString()); + pluginARAFactoryIDValue.referTo (projectRoot, Ids::araFactoryID, getUndoManager(), getDefaultARAFactoryIDString()); + pluginARAArchiveIDValue.referTo (projectRoot, Ids::araDocumentArchiveID, getUndoManager(), getDefaultARADocumentArchiveID()); pluginAUExportPrefixValue.referTo (projectRoot, Ids::pluginAUExportPrefix, getUndoManager(), build_tools::makeValidIdentifier (getProjectNameString(), false, true, false) + "AU"); @@ -337,11 +351,17 @@ pluginAUSandboxSafeValue.referTo (projectRoot, Ids::pluginAUIsSandboxSafe, getUndoManager(), false); pluginVSTCategoryValue.referTo (projectRoot, Ids::pluginVSTCategory, getUndoManager(), getDefaultVSTCategories(), ","); pluginVST3CategoryValue.referTo (projectRoot, Ids::pluginVST3Category, getUndoManager(), getDefaultVST3Categories(), ","); - pluginRTASCategoryValue.referTo (projectRoot, Ids::pluginRTASCategory, getUndoManager(), getDefaultRTASCategories(), ","); pluginAAXCategoryValue.referTo (projectRoot, Ids::pluginAAXCategory, getUndoManager(), getDefaultAAXCategories(), ","); + pluginEnableARA.referTo (projectRoot, Ids::enableARA, getUndoManager(), shouldEnableARA(), ","); + pluginARAAnalyzableContentValue.referTo (projectRoot, Ids::pluginARAAnalyzableContent, getUndoManager(), getDefaultARAContentTypes(), ","); + pluginARATransformFlagsValue.referTo (projectRoot, Ids::pluginARATransformFlags, getUndoManager(), getDefaultARATransformationFlags(), ","); + pluginARACompatibleArchiveIDsValue.referTo (projectRoot, Ids::araCompatibleArchiveIDs, getUndoManager(), getDefaultARACompatibleArchiveIDs()); + pluginVSTNumMidiInputsValue.referTo (projectRoot, Ids::pluginVSTNumMidiInputs, getUndoManager(), 16); pluginVSTNumMidiOutputsValue.referTo (projectRoot, Ids::pluginVSTNumMidiOutputs, getUndoManager(), 16); + + pluginLV2URIValue.referTo (projectRoot, Ids::lv2Uri, getUndoManager(), getDefaultLV2URI()); } void Project::updateOldStyleConfigList() @@ -397,6 +417,10 @@ oldExporters.set ("VS2010", "Visual Studio 2010"); oldExporters.set ("VS2012", "Visual Studio 2012"); oldExporters.set ("VS2013", "Visual Studio 2013"); + oldExporters.set ("VS2015", "Visual Studio 2015"); + oldExporters.set ("CLION", "CLion"); + + std::vector removedExporterKeys; for (auto& key : oldExporters.getAllKeys()) { @@ -404,16 +428,36 @@ if (oldExporter.isValid()) { - if (ProjucerApplication::getApp().isRunningCommandLine) - std::cout << "WARNING! The " + oldExporters[key] + " Exporter is deprecated. The exporter will be removed from this project." << std::endl; - else - AlertWindow::showMessageBoxAsync (MessageBoxIconType::WarningIcon, - TRANS (oldExporters[key]), - TRANS ("The " + oldExporters[key] + " Exporter is deprecated. The exporter will be removed from this project.")); - + removedExporterKeys.push_back (key); exporters.removeChild (oldExporter, nullptr); } } + + if (! removedExporterKeys.empty()) + { + if (ProjucerApplication::getApp().isRunningCommandLine) + { + for (const auto& key : removedExporterKeys) + std::cout << "WARNING! The " + oldExporters[key] + + " Exporter is deprecated. The exporter will be removed from this project." + << std::endl; + } + else + { + const String warningTitle { TRANS ("Unsupported exporters") }; + + String warningMessage; + warningMessage << TRANS ("The following exporters are no longer supported") << "\n\n"; + + for (const auto& key : removedExporterKeys) + warningMessage << " - " + oldExporters[key] + "\n"; + + warningMessage << "\n" + << TRANS ("These exporters have been removed from the project. If you save the project they will be also erased from the .jucer file."); + + AlertWindow::showMessageBoxAsync (MessageBoxIconType::WarningIcon, warningTitle, warningMessage); + } + } } void Project::updateOldModulePaths() @@ -425,7 +469,7 @@ Array Project::getLegacyPluginFormatIdentifiers() noexcept { static Array legacyPluginFormatIdentifiers { Ids::buildVST, Ids::buildVST3, Ids::buildAU, Ids::buildAUv3, - Ids::buildRTAS, Ids::buildAAX, Ids::buildStandalone, Ids::enableIAA }; + Ids::buildAAX, Ids::buildStandalone, Ids::enableIAA }; return legacyPluginFormatIdentifiers; } @@ -433,8 +477,8 @@ Array Project::getLegacyPluginCharacteristicsIdentifiers() noexcept { static Array legacyPluginCharacteristicsIdentifiers { Ids::pluginIsSynth, Ids::pluginWantsMidiIn, Ids::pluginProducesMidiOut, - Ids::pluginIsMidiEffectPlugin, Ids::pluginEditorRequiresKeys, Ids::pluginRTASDisableBypass, - Ids::pluginRTASDisableMultiMono, Ids::pluginAAXDisableBypass, Ids::pluginAAXDisableMultiMono }; + Ids::pluginIsMidiEffectPlugin, Ids::pluginEditorRequiresKeys, + Ids::pluginAAXDisableBypass, Ids::pluginAAXDisableMultiMono }; return legacyPluginCharacteristicsIdentifiers; } @@ -496,15 +540,6 @@ } { - auto rtasCategory = projectRoot.getProperty (Ids::pluginRTASCategory, {}).toString(); - - if (getAllRTASCategoryVars().contains (rtasCategory)) - pluginRTASCategoryValue = rtasCategory; - else if (getAllRTASCategoryStrings().contains (rtasCategory)) - pluginRTASCategoryValue = Array (getAllRTASCategoryVars()[getAllRTASCategoryStrings().indexOf (rtasCategory)]); - } - - { auto vstCategory = projectRoot.getProperty (Ids::pluginVSTCategory, {}).toString(); if (vstCategory.isNotEmpty() && getAllVSTCategoryStrings().contains (vstCategory)) @@ -663,7 +698,6 @@ setChangedFlag (false); - updateExporterWarnings(); updateLicenseWarning(); return Result::ok(); @@ -826,6 +860,14 @@ } } +void Project::updateCodeWarning (Identifier identifier, String value) +{ + if (value.length() != 4 || value.toStdString().size() != 4) + addProjectMessage (identifier, {}); + else + removeProjectMessage (identifier); +} + void Project::updateModuleWarnings() { auto& modules = getEnabledModules(); @@ -855,20 +897,6 @@ updateModuleNotFoundWarning (moduleNotFound); } -void Project::updateExporterWarnings() -{ - auto isClionPresent = [this]() - { - for (ExporterIterator exporter (*this); exporter.next();) - if (exporter->isCLion()) - return true; - - return false; - }(); - - updateCLionWarning (isClionPresent); -} - void Project::updateCppStandardWarning (bool showWarning) { if (showWarning) @@ -934,14 +962,6 @@ removeProjectMessage (ProjectMessages::Ids::oldProjucer); } -void Project::updateCLionWarning (bool showWarning) -{ - if (showWarning) - addProjectMessage (ProjectMessages::Ids::cLion, {}); - else - removeProjectMessage (ProjectMessages::Ids::cLion); -} - void Project::updateModuleNotFoundWarning (bool showWarning) { if (showWarning) @@ -1063,6 +1083,10 @@ { updateCompanyNameDependencies(); } + else if (property == Ids::companyWebsite) + { + updateWebsiteDependencies(); + } else if (property == Ids::defines) { parsedPreprocessorDefs = parsePreprocessorDefs (preprocessorDefsValue.get()); @@ -1077,8 +1101,10 @@ pluginAUMainTypeValue.setDefault (getDefaultAUMainTypes()); pluginVSTCategoryValue.setDefault (getDefaultVSTCategories()); pluginVST3CategoryValue.setDefault (getDefaultVST3Categories()); - pluginRTASCategoryValue.setDefault (getDefaultRTASCategories()); pluginAAXCategoryValue.setDefault (getDefaultAAXCategories()); + pluginEnableARA.setDefault (getDefaultEnableARA()); + pluginARAAnalyzableContentValue.setDefault (getDefaultARAContentTypes()); + pluginARATransformFlagsValue.setDefault (getDefaultARATransformationFlags()); if (shouldWriteLegacyPluginCharacteristicsSettings) writeLegacyPluginCharacteristicsSettings(); @@ -1091,6 +1117,14 @@ { updateModuleWarnings(); } + else if (property == Ids::pluginCode) + { + updateCodeWarning (ProjectMessages::Ids::pluginCodeInvalid, pluginCodeValue.get()); + } + else if (property == Ids::pluginManufacturerCode) + { + updateCodeWarning (ProjectMessages::Ids::manufacturerCodeInvalid, pluginManufacturerCodeValue.get()); + } } changed(); @@ -1102,8 +1136,6 @@ if (child.getType() == Ids::MODULE) updateModuleWarnings(); - else if (parent.getType() == Ids::EXPORTFORMATS) - updateExporterWarnings(); changed(); } @@ -1114,8 +1146,6 @@ if (child.getType() == Ids::MODULE) updateModuleWarnings(); - else if (parent.getType() == Ids::EXPORTFORMATS) - updateExporterWarnings(); changed(); } @@ -1215,33 +1245,36 @@ if (! projectType.supportsTargetType (targetType)) return false; + using Target = build_tools::ProjectType::Target; + switch (targetType) { - case build_tools::ProjectType::Target::VSTPlugIn: + case Target::VSTPlugIn: return shouldBuildVST(); - case build_tools::ProjectType::Target::VST3PlugIn: + case Target::VST3PlugIn: return shouldBuildVST3(); - case build_tools::ProjectType::Target::AAXPlugIn: + case Target::AAXPlugIn: return shouldBuildAAX(); - case build_tools::ProjectType::Target::RTASPlugIn: - return shouldBuildRTAS(); - case build_tools::ProjectType::Target::AudioUnitPlugIn: + case Target::AudioUnitPlugIn: return shouldBuildAU(); - case build_tools::ProjectType::Target::AudioUnitv3PlugIn: + case Target::AudioUnitv3PlugIn: return shouldBuildAUv3(); - case build_tools::ProjectType::Target::StandalonePlugIn: + case Target::StandalonePlugIn: return shouldBuildStandalonePlugin(); - case build_tools::ProjectType::Target::UnityPlugIn: + case Target::UnityPlugIn: return shouldBuildUnityPlugin(); - case build_tools::ProjectType::Target::AggregateTarget: - case build_tools::ProjectType::Target::SharedCodeTarget: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: + return shouldBuildLV2(); + case Target::AggregateTarget: + case Target::SharedCodeTarget: return projectType.isAudioPlugin(); - case build_tools::ProjectType::Target::unspecified: + case Target::unspecified: return false; - case build_tools::ProjectType::Target::GUIApp: - case build_tools::ProjectType::Target::ConsoleApp: - case build_tools::ProjectType::Target::StaticLibrary: - case build_tools::ProjectType::Target::DynamicLibrary: + case Target::GUIApp: + case Target::ConsoleApp: + case Target::StaticLibrary: + case Target::DynamicLibrary: default: break; } @@ -1268,14 +1301,27 @@ return path.contains (prefix + ".") || path.contains (prefix + "_"); }; - if (isPluginClientSource ("AU") || isInPluginClientSubdir ("AU")) return build_tools::ProjectType::Target::AudioUnitPlugIn; - if (isPluginClientSource ("AUv3") || isInPluginClientSubdir ("AU")) return build_tools::ProjectType::Target::AudioUnitv3PlugIn; - if (isPluginClientSource ("AAX") || isInPluginClientSubdir ("AAX")) return build_tools::ProjectType::Target::AAXPlugIn; - if (isPluginClientSource ("RTAS") || isInPluginClientSubdir ("RTAS")) return build_tools::ProjectType::Target::RTASPlugIn; - if (isPluginClientSource ("VST2") || isInPluginClientSubdir ("VST")) return build_tools::ProjectType::Target::VSTPlugIn; - if (isPluginClientSource ("VST3") || isInPluginClientSubdir ("VST3")) return build_tools::ProjectType::Target::VST3PlugIn; - if (isPluginClientSource ("Standalone") || isInPluginClientSubdir ("Standalone")) return build_tools::ProjectType::Target::StandalonePlugIn; - if (isPluginClientSource ("Unity") || isInPluginClientSubdir ("Unity")) return build_tools::ProjectType::Target::UnityPlugIn; + using Target = build_tools::ProjectType::Target::Type; + + struct FormatInfo + { + const char* source; + const char* subdir; + Target target; + }; + + const FormatInfo formatInfo[] { { "AU", "AU", Target::AudioUnitPlugIn }, + { "AUv3", "AU", Target::AudioUnitv3PlugIn }, + { "AAX", "AAX", Target::AAXPlugIn }, + { "VST2", "VST", Target::VSTPlugIn }, + { "VST3", "VST3", Target::VST3PlugIn }, + { "Standalone", "Standalone", Target::StandalonePlugIn }, + { "Unity", "Unity", Target::UnityPlugIn }, + { "LV2", "LV2", Target::LV2PlugIn } }; + + for (const auto& info : formatInfo) + if (isPluginClientSource (info.source) || isInPluginClientSubdir (info.subdir)) + return info.target; return (returnSharedTargetIfNoValidSuffix ? build_tools::ProjectType::Target::SharedCodeTarget : build_tools::ProjectType::Target::unspecified); @@ -1320,7 +1366,7 @@ props.add (new ChoicePropertyComponent (displaySplashScreenValue, "Display the JUCE Splash Screen (required for closed source applications without an Indie or Pro JUCE license)"), "This option controls the display of the standard JUCE splash screen. " - "In accordance with the terms of the JUCE 6 End-Use License Agreement (www.juce.com/juce-6-licence), " + "In accordance with the terms of the JUCE 7 End-Use License Agreement (www.juce.com/juce-7-licence), " "this option can only be disabled for closed source applications if you have a JUCE Indie or Pro " "license, or are using JUCE under the GPL v3 license."); @@ -1401,20 +1447,29 @@ void Project::createAudioPluginPropertyEditors (PropertyListBuilder& props) { - props.add (new MultiChoicePropertyComponent (pluginFormatsValue, "Plugin Formats", - { "VST3", "AU", "AUv3", "RTAS (deprecated)", "AAX", "Standalone", "Unity", "Enable IAA", "VST (Legacy)" }, - { Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildAUv3.toString(), - Ids::buildRTAS.toString(), Ids::buildAAX.toString(), Ids::buildStandalone.toString(), Ids::buildUnity.toString(), - Ids::enableIAA.toString(), Ids::buildVST.toString() }), - "Plugin formats to build. If you have selected \"VST (Legacy)\" then you will need to ensure that you have a VST2 SDK " - "in your header search paths. The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK " - "or JUCE version 5.3.2. You also need a VST2 license from Steinberg to distribute VST2 plug-ins."); + { + StringArray pluginFormatChoices { "VST3", "AU", "AUv3", "AAX", "Standalone", "LV2", "Unity", "Enable IAA", "VST (Legacy)" }; + Array pluginFormatChoiceValues { Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildAUv3.toString(), + Ids::buildAAX.toString(), Ids::buildStandalone.toString(), + Ids::buildLV2.toString(), Ids::buildUnity.toString(), Ids::enableIAA.toString(), Ids::buildVST.toString() }; + if (! getProjectType().isARAAudioPlugin()) + { + pluginFormatChoices.add ("Enable ARA"); + pluginFormatChoiceValues.add (Ids::enableARA.toString()); + } + props.add (new MultiChoicePropertyComponent (pluginFormatsValue, "Plugin Formats", pluginFormatChoices, pluginFormatChoiceValues), + "Plugin formats to build. If you have selected \"VST (Legacy)\" then you will need to ensure that you have a VST2 SDK " + "in your header search paths. The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK " + "or JUCE version 5.3.2. You also need a VST2 license from Steinberg to distribute VST2 plug-ins. If you enable ARA you " + "will have to obtain the ARA SDK by recursively cloning https://github.com/Celemony/ARA_SDK and checking out the tag " + "releases/2.1.0."); + } props.add (new MultiChoicePropertyComponent (pluginCharacteristicsValue, "Plugin Characteristics", { "Plugin is a Synth", "Plugin MIDI Input", "Plugin MIDI Output", "MIDI Effect Plugin", "Plugin Editor Requires Keyboard Focus", - "Disable RTAS Bypass", "Disable AAX Bypass", "Disable RTAS Multi-Mono", "Disable AAX Multi-Mono" }, + "Disable AAX Bypass", "Disable AAX Multi-Mono" }, { Ids::pluginIsSynth.toString(), Ids::pluginWantsMidiIn.toString(), Ids::pluginProducesMidiOut.toString(), - Ids::pluginIsMidiEffectPlugin.toString(), Ids::pluginEditorRequiresKeys.toString(), Ids::pluginRTASDisableBypass.toString(), - Ids::pluginAAXDisableBypass.toString(), Ids::pluginRTASDisableMultiMono.toString(), Ids::pluginAAXDisableMultiMono.toString() }), + Ids::pluginIsMidiEffectPlugin.toString(), Ids::pluginEditorRequiresKeys.toString(), + Ids::pluginAAXDisableBypass.toString(), Ids::pluginAAXDisableMultiMono.toString() }), "Some characteristics of your plugin such as whether it is a synth, produces MIDI messages, accepts MIDI messages etc."); props.add (new TextPropertyComponent (pluginNameValue, "Plugin Name", 128, false), "The name of your plugin (keep it short!)"); @@ -1473,8 +1528,6 @@ "If neither of these are selected, the appropriate one will be automatically added based on the \"Plugin is a synth\" option."); } - props.add (new MultiChoicePropertyComponent (pluginRTASCategoryValue, "Plugin RTAS Category", getAllRTASCategoryStrings(), getAllRTASCategoryVars()), - "RTAS category."); props.add (new MultiChoicePropertyComponent (pluginAAXCategoryValue, "Plugin AAX Category", getAllAAXCategoryStrings(), getAllAAXCategoryVars()), "AAX category."); @@ -1486,6 +1539,30 @@ props.add (new MultiChoicePropertyComponent (pluginVSTCategoryValue, "Plugin VST (Legacy) Category", getAllVSTCategoryStrings(), vstCategoryVars, 1), "VST category."); } + + props.add (new TextPropertyComponent (pluginLV2URIValue, "LV2 URI", 128, false), + "This acts as a unique identifier for this plugin. " + "If you make any incompatible changes to your plugin (remove parameters, reorder parameters, change preset format etc.) " + "you MUST change this value. LV2 hosts will assume that any plugins with the same URI are interchangeable."); + + if (shouldEnableARA()) + { + props.add (new MultiChoicePropertyComponent (pluginARAAnalyzableContentValue, "Plugin ARA Analyzeable Content Types", getAllARAContentTypeStrings(), getAllARAContentTypeVars()), + "ARA Analyzeable Content Types."); + + props.add (new MultiChoicePropertyComponent (pluginARATransformFlagsValue, "Plugin ARA Transformation Flags", getAllARATransformationFlagStrings(), getAllARATransformationFlagVars()), + "ARA Transformation Flags."); + + props.add (new TextPropertyComponent (pluginARAFactoryIDValue, "Plugin ARA Factory ID", 256, false), + "ARA Factory ID."); + + props.add (new TextPropertyComponent (pluginARAArchiveIDValue, "Plugin ARA Document Archive ID", 256, false), + "ARA Document Archive ID."); + + props.add (new TextPropertyComponent (pluginARACompatibleArchiveIDsValue, "Plugin ARA Compatible Document Archive IDs", 1024, true), + "List of compatible ARA Document Archive IDs - one per line"); + + } } //============================================================================== @@ -2081,11 +2158,31 @@ + "." + build_tools::makeValidIdentifier (getProjectNameString(), false, true, false); } +String Project::getDefaultCompanyWebsiteString() const +{ + return "www." + build_tools::makeValidIdentifier (getCompanyNameOrDefault (getCompanyNameString()), false, true, false) + ".com"; +} + String Project::getDefaultPluginManufacturerString() const { return getCompanyNameOrDefault (getCompanyNameString()); } +String Project::getDefaultARAFactoryIDString() const +{ + return getDefaultBundleIdentifierString() + ".factory"; +} + +String Project::getDefaultARADocumentArchiveID() const +{ + return getDefaultBundleIdentifierString() + ".aradocumentarchive." + getVersionString(); +} + +String Project::getDefaultARACompatibleArchiveIDs() const +{ + return String(); +} + String Project::getAUMainTypeString() const noexcept { auto v = pluginAUMainTypeValue.get(); @@ -2165,21 +2262,6 @@ return res; } -int Project::getRTASCategory() const noexcept -{ - int res = 0; - - auto v = pluginRTASCategoryValue.get(); - - if (auto* arr = v.getArray()) - { - for (auto c : *arr) - res |= static_cast (c); - } - - return res; -} - String Project::getIAATypeCode() const { String s; @@ -2208,6 +2290,32 @@ return s; } +int Project::getARAContentTypes() const noexcept +{ + int res = 0; + + if (auto* arr = pluginARAAnalyzableContentValue.get().getArray()) + { + for (auto c : *arr) + res |= (int) c; + } + + return res; +} + +int Project::getARATransformationFlags() const noexcept +{ + int res = 0; + + if (auto* arr = pluginARATransformFlagsValue.get().getArray()) + { + for (auto c : *arr) + res |= (int) c; + } + + return res; +} + //============================================================================== bool Project::isAUPluginHost() { @@ -2224,6 +2332,21 @@ return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3", false); } +bool Project::isLV2PluginHost() +{ + return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_LV2", false); +} + +bool Project::isARAPluginHost() +{ + return (isVST3PluginHost() || isAUPluginHost()) && isConfigFlagEnabled ("JUCE_PLUGINHOST_ARA", false); +} + +void Project::disableStandaloneForARAPlugIn() +{ + pluginFormatsValue.referTo (projectRoot, Ids::pluginFormats, getUndoManager(), Array (Ids::buildVST3.toString(), Ids::buildAU.toString()), ","); +} + //============================================================================== StringArray Project::getAllAUMainTypeStrings() noexcept { @@ -2313,32 +2436,65 @@ return getAllAAXCategoryVars()[getAllAAXCategoryStrings().indexOf ("AAX_ePlugInCategory_None")]; } -StringArray Project::getAllRTASCategoryStrings() noexcept +bool Project::getDefaultEnableARA() const noexcept { - static StringArray rtasCategoryStrings { "ePlugInCategory_None", "ePlugInCategory_EQ", "ePlugInCategory_Dynamics", "ePlugInCategory_PitchShift", - "ePlugInCategory_Reverb", "ePlugInCategory_Delay", "ePlugInCategory_Modulation", "ePlugInCategory_Harmonic", - "ePlugInCategory_NoiseReduction", "ePlugInCategory_Dither", "ePlugInCategory_SoundField", "ePlugInCategory_HWGenerators", - "ePlugInCategory_SWGenerators", "ePlugInCategory_WrappedPlugin", "ePlugInCategory_Effect" }; - - return rtasCategoryStrings; + return false; } -Array Project::getAllRTASCategoryVars() noexcept +StringArray Project::getAllARAContentTypeStrings() noexcept { - static Array rtasCategoryVars { 0x00000000, 0x00000001, 0x00000002, 0x00000004, - 0x00000008, 0x00000010, 0x00000020, 0x00000040, - 0x00000080, 0x00000100, 0x00000200, 0x00000400, - 0x00000800, 0x00001000, 0x00002000 }; + static StringArray araContentTypes { "Notes", + "Tempo Entries", + "Bar Signatures", + "Static Tuning", + "Dynamic Tuning Offsets", + "Key Signatures", + "Sheet Chords" }; + return araContentTypes; +} + +Array Project::getAllARAContentTypeVars() noexcept +{ + static Array araContentVars { + /*kARAContentTypeNotes =*/ 1 << 0, + /*kARAContentTypeTempoEntries =*/ 1 << 1, + /*kARAContentTypeBarSignatures =*/ 1 << 2, + /*kARAContentTypeStaticTuning =*/ 1 << 3, + /*kARAContentTypeDynamicTuningOffsets =*/ 1 << 4, + /*kARAContentTypeKeySignatures =*/ 1 << 5, + /*kARAContentTypeSheetChords =*/ 1 << 6, + }; + return araContentVars; +} - return rtasCategoryVars; +Array Project::getDefaultARAContentTypes() const noexcept +{ + return {}; } -Array Project::getDefaultRTASCategories() const noexcept +StringArray Project::getAllARATransformationFlagStrings() noexcept { - if (isPluginSynth()) - return getAllRTASCategoryVars()[getAllRTASCategoryStrings().indexOf ("ePlugInCategory_SWGenerators")]; + static StringArray araTransformationFlags { "Time Stretch", + "Time Stretch (reflecting tempo)", + "Content Based Fades At Tail", + "Content Based Fades At Head" }; + return araTransformationFlags; +} + +Array Project::getAllARATransformationFlagVars() noexcept +{ + static Array araContentVars { + /*kARAPlaybackTransformationTimestretch =*/ 1 << 0, + /*kARAPlaybackTransformationTimestretchReflectingTempo =*/ 1 << 1, + /*kARAPlaybackTransformationContentBasedFadesAtTail =*/ 1 << 2, + /*kARAPlaybackTransformationContentBasedFadesAtHead =*/ 1 << 3 + }; + return araContentVars; +} - return getAllRTASCategoryVars()[getAllRTASCategoryStrings().indexOf ("ePlugInCategory_None")]; +Array Project::getDefaultARATransformationFlags() const noexcept +{ + return {}; } //============================================================================== @@ -2578,8 +2734,10 @@ uint32 hexRepresentation = 0; for (int i = 0; i < 4; ++i) - hexRepresentation = (hexRepresentation << 8u) - | (static_cast (fourCharCode[i]) & 0xffu); + { + const auto character = (unsigned int) (i < fourCharCode.length() ? fourCharCode[i] : 0); + hexRepresentation = (hexRepresentation << 8u) | (character & 0xffu); + } return "0x" + String::toHexString (static_cast (hexRepresentation)); }; @@ -2589,11 +2747,12 @@ flags.set ("JucePlugin_Build_VST3", boolToString (shouldBuildVST3())); flags.set ("JucePlugin_Build_AU", boolToString (shouldBuildAU())); flags.set ("JucePlugin_Build_AUv3", boolToString (shouldBuildAUv3())); - flags.set ("JucePlugin_Build_RTAS", boolToString (shouldBuildRTAS())); flags.set ("JucePlugin_Build_AAX", boolToString (shouldBuildAAX())); flags.set ("JucePlugin_Build_Standalone", boolToString (shouldBuildStandalonePlugin())); flags.set ("JucePlugin_Build_Unity", boolToString (shouldBuildUnityPlugin())); + flags.set ("JucePlugin_Build_LV2", boolToString (shouldBuildLV2())); flags.set ("JucePlugin_Enable_IAA", boolToString (shouldEnableIAA())); + flags.set ("JucePlugin_Enable_ARA", boolToString (shouldEnableARA())); flags.set ("JucePlugin_Name", toStringLiteral (getPluginNameString())); flags.set ("JucePlugin_Desc", toStringLiteral (getPluginDescriptionString())); flags.set ("JucePlugin_Manufacturer", toStringLiteral (getPluginManufacturerString())); @@ -2618,11 +2777,6 @@ flags.set ("JucePlugin_AUExportPrefixQuoted", toStringLiteral (getPluginAUExportPrefixString())); flags.set ("JucePlugin_AUManufacturerCode", "JucePlugin_ManufacturerCode"); flags.set ("JucePlugin_CFBundleIdentifier", getBundleIdentifierString()); - flags.set ("JucePlugin_RTASCategory", String (getRTASCategory())); - flags.set ("JucePlugin_RTASManufacturerCode", "JucePlugin_ManufacturerCode"); - flags.set ("JucePlugin_RTASProductId", "JucePlugin_PluginCode"); - flags.set ("JucePlugin_RTASDisableBypass", boolToString (isPluginRTASBypassDisabled())); - flags.set ("JucePlugin_RTASDisableMultiMono", boolToString (isPluginRTASMultiMonoDisabled())); flags.set ("JucePlugin_AAXIdentifier", getAAXIdentifierString()); flags.set ("JucePlugin_AAXManufacturerCode", "JucePlugin_ManufacturerCode"); flags.set ("JucePlugin_AAXProductId", "JucePlugin_PluginCode"); @@ -2634,6 +2788,11 @@ flags.set ("JucePlugin_IAAName", toStringLiteral (getIAAPluginName())); flags.set ("JucePlugin_VSTNumMidiInputs", getVSTNumMIDIInputsString()); flags.set ("JucePlugin_VSTNumMidiOutputs", getVSTNumMIDIOutputsString()); + flags.set ("JucePlugin_ARAContentTypes", String (getARAContentTypes())); + flags.set ("JucePlugin_ARATransformationFlags", String (getARATransformationFlags())); + flags.set ("JucePlugin_ARAFactoryID", toStringLiteral(getARAFactoryIDString())); + flags.set ("JucePlugin_ARADocumentArchiveID", toStringLiteral(getARADocumentArchiveIDString())); + flags.set ("JucePlugin_ARACompatibleArchiveIDs", toStringLiteral(getARACompatibleArchiveIDStrings())); { String plugInChannelConfig = getPluginChannelConfigsString(); diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/jucer_Project.h juce-7.0.0~ds0/extras/Projucer/Source/Project/jucer_Project.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/jucer_Project.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/jucer_Project.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -48,8 +48,9 @@ DECLARE_ID (jucerFileModified); DECLARE_ID (missingModuleDependencies); DECLARE_ID (oldProjucer); - DECLARE_ID (cLion); DECLARE_ID (newVersionAvailable); + DECLARE_ID (pluginCodeInvalid); + DECLARE_ID (manufacturerCodeInvalid); DECLARE_ID (notification); DECLARE_ID (warning); @@ -63,7 +64,7 @@ { static Identifier warnings[] = { Ids::incompatibleLicense, Ids::cppStandard, Ids::moduleNotFound, Ids::jucePath, Ids::jucerFileModified, Ids::missingModuleDependencies, - Ids::oldProjucer, Ids::cLion }; + Ids::oldProjucer, Ids::pluginCodeInvalid, Ids::manufacturerCodeInvalid }; if (std::find (std::begin (warnings), std::end (warnings), message) != std::end (warnings)) return Ids::warning; @@ -85,7 +86,8 @@ if (message == Ids::missingModuleDependencies) return "Missing Module Dependencies"; if (message == Ids::oldProjucer) return "Projucer Out of Date"; if (message == Ids::newVersionAvailable) return "New Version Available"; - if (message == Ids::cLion) return "Deprecated Exporter"; + if (message == Ids::pluginCodeInvalid) return "Invalid Plugin Code"; + if (message == Ids::manufacturerCodeInvalid) return "Invalid Manufacturer Code"; jassertfalse; return {}; @@ -101,7 +103,8 @@ if (message == Ids::missingModuleDependencies) return "Module(s) have missing dependencies."; if (message == Ids::oldProjucer) return "The version of the Projucer you are using is out of date."; if (message == Ids::newVersionAvailable) return "A new version of JUCE is available to download."; - if (message == Ids::cLion) return "The CLion exporter is deprecated. Use JUCE's CMake support instead."; + if (message == Ids::pluginCodeInvalid) return "The plugin code should be exactly four characters in length."; + if (message == Ids::manufacturerCodeInvalid) return "The manufacturer code should be exactly four characters in length."; jassertfalse; return {}; @@ -154,6 +157,8 @@ static String getAppConfigFilename() { return "AppConfig.h"; } static String getPluginDefinesFilename() { return "JucePluginDefines.h"; } static String getJuceSourceHFilename() { return "JuceHeader.h"; } + static String getJuceLV2DefinesFilename() { return "JuceLV2Defines.h"; } + static String getLV2FileWriterName() { return "juce_lv2_helper"; } //============================================================================== template @@ -191,8 +196,13 @@ String getBundleIdentifierString() const { return bundleIdentifierValue.get(); } String getDefaultBundleIdentifierString() const; + String getDefaultCompanyWebsiteString() const; String getDefaultAAXIdentifierString() const { return getDefaultBundleIdentifierString(); } String getDefaultPluginManufacturerString() const; + String getDefaultLV2URI() const { return getCompanyWebsiteString() + "/plugins/" + build_tools::makeValidIdentifier (getProjectNameString(), false, true, false); } + String getDefaultARAFactoryIDString() const; + String getDefaultARADocumentArchiveID() const; + String getDefaultARACompatibleArchiveIDs() const; String getCompanyNameString() const { return companyNameValue.get(); } String getCompanyCopyrightString() const { return companyCopyrightValue.get(); } @@ -239,7 +249,11 @@ String getPluginCodeString() const { return pluginCodeValue.get(); } String getPluginChannelConfigsString() const { return pluginChannelConfigsValue.get(); } String getAAXIdentifierString() const { return pluginAAXIdentifierValue.get(); } + String getARAFactoryIDString() const { return pluginARAFactoryIDValue.get(); } + String getARADocumentArchiveIDString() const { return pluginARAArchiveIDValue.get(); } + String getARACompatibleArchiveIDStrings() const { return pluginARACompatibleArchiveIDsValue.get(); } String getPluginAUExportPrefixString() const { return pluginAUExportPrefixValue.get(); } + String getPluginAUMainTypeString() const { return pluginAUMainTypeValue.get(); } String getVSTNumMIDIInputsString() const { return pluginVSTNumMidiInputsValue.get(); } String getVSTNumMIDIOutputsString() const { return pluginVSTNumMidiOutputsValue.get(); } @@ -262,22 +276,23 @@ bool shouldBuildVST3() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildVST3); } bool shouldBuildAU() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildAU); } bool shouldBuildAUv3() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildAUv3); } - bool shouldBuildRTAS() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildRTAS); } bool shouldBuildAAX() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildAAX); } bool shouldBuildStandalonePlugin() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildStandalone); } bool shouldBuildUnityPlugin() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildUnity); } + bool shouldBuildLV2() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildLV2); } bool shouldEnableIAA() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::enableIAA); } + bool shouldEnableARA() const { return (isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::enableARA)) || getProjectType().isARAAudioPlugin(); } bool isPluginSynth() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginIsSynth); } bool pluginWantsMidiInput() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginWantsMidiIn); } bool pluginProducesMidiOutput() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginProducesMidiOut); } bool isPluginMidiEffect() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginIsMidiEffectPlugin); } bool pluginEditorNeedsKeyFocus() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginEditorRequiresKeys); } - bool isPluginRTASBypassDisabled() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginRTASDisableBypass); } - bool isPluginRTASMultiMonoDisabled() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginRTASDisableMultiMono); } bool isPluginAAXBypassDisabled() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginAAXDisableBypass); } bool isPluginAAXMultiMonoDisabled() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginAAXDisableMultiMono); } + void disableStandaloneForARAPlugIn(); + static StringArray getAllAUMainTypeStrings() noexcept; static Array getAllAUMainTypeVars() noexcept; Array getDefaultAUMainTypes() const noexcept; @@ -292,16 +307,22 @@ static Array getAllAAXCategoryVars() noexcept; Array getDefaultAAXCategories() const noexcept; - static StringArray getAllRTASCategoryStrings() noexcept; - static Array getAllRTASCategoryVars() noexcept; - Array getDefaultRTASCategories() const noexcept; + bool getDefaultEnableARA() const noexcept; + static StringArray getAllARAContentTypeStrings() noexcept; + static Array getAllARAContentTypeVars() noexcept; + Array getDefaultARAContentTypes() const noexcept; + + static StringArray getAllARATransformationFlagStrings() noexcept; + static Array getAllARATransformationFlagVars() noexcept; + Array getDefaultARATransformationFlags() const noexcept; String getAUMainTypeString() const noexcept; bool isAUSandBoxSafe() const noexcept; String getVSTCategoryString() const noexcept; String getVST3CategoryString() const noexcept; int getAAXCategory() const noexcept; - int getRTASCategory() const noexcept; + int getARAContentTypes() const noexcept; + int getARATransformationFlags() const noexcept; String getIAATypeCode() const; String getIAAPluginName() const; @@ -315,10 +336,14 @@ return name; } + String getLV2URI() const { return pluginLV2URIValue.get(); } + //============================================================================== bool isAUPluginHost(); bool isVSTPluginHost(); bool isVST3PluginHost(); + bool isLV2PluginHost(); + bool isARAPluginHost(); //============================================================================== bool shouldBuildTargetType (build_tools::ProjectType::Target::Type targetType) const noexcept; @@ -549,8 +574,9 @@ ValueTreePropertyWithDefault pluginFormatsValue, pluginNameValue, pluginDescriptionValue, pluginManufacturerValue, pluginManufacturerCodeValue, pluginCodeValue, pluginChannelConfigsValue, pluginCharacteristicsValue, pluginAUExportPrefixValue, pluginAAXIdentifierValue, - pluginAUMainTypeValue, pluginAUSandboxSafeValue, pluginRTASCategoryValue, pluginVSTCategoryValue, pluginVST3CategoryValue, pluginAAXCategoryValue, - pluginVSTNumMidiInputsValue, pluginVSTNumMidiOutputsValue; + pluginAUMainTypeValue, pluginAUSandboxSafeValue, pluginVSTCategoryValue, pluginVST3CategoryValue, pluginAAXCategoryValue, + pluginEnableARA, pluginARAAnalyzableContentValue, pluginARAFactoryIDValue, pluginARAArchiveIDValue, pluginARACompatibleArchiveIDsValue, pluginARATransformFlagsValue, + pluginVSTNumMidiInputsValue, pluginVSTNumMidiOutputsValue, pluginLV2URIValue; //============================================================================== std::unique_ptr enabledModulesList; @@ -579,7 +605,6 @@ std::pair cachedFileState; //============================================================================== - friend class Item; StringPairArray parsedPreprocessorDefs; //============================================================================== @@ -595,6 +620,7 @@ void updateTitleDependencies(); void updateCompanyNameDependencies(); void updateProjectSettings(); + void updateWebsiteDependencies(); ValueTree getConfigurations() const; ValueTree getConfigNode(); @@ -612,12 +638,11 @@ void updateJUCEPathWarning(); void updateModuleWarnings(); - void updateExporterWarnings(); void updateCppStandardWarning (bool showWarning); void updateMissingModuleDependenciesWarning (bool showWarning); void updateOldProjucerWarning (bool showWarning); - void updateCLionWarning (bool showWarning); void updateModuleNotFoundWarning (bool showWarning); + void updateCodeWarning (Identifier identifier, String value); ValueTree projectMessages { ProjectMessages::Ids::projectMessages, {}, { { ProjectMessages::Ids::notification, {} }, { ProjectMessages::Ids::warning, {} } } }; diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/Modules/jucer_AvailableModulesList.h juce-7.0.0~ds0/extras/Projucer/Source/Project/Modules/jucer_AvailableModulesList.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/Modules/jucer_AvailableModulesList.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/Modules/jucer_AvailableModulesList.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/Modules/jucer_ModuleDescription.h juce-7.0.0~ds0/extras/Projucer/Source/Project/Modules/jucer_ModuleDescription.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/Modules/jucer_ModuleDescription.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/Modules/jucer_ModuleDescription.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/Modules/jucer_Modules.cpp juce-7.0.0~ds0/extras/Projucer/Source/Project/Modules/jucer_Modules.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Project/Modules/jucer_Modules.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/Modules/jucer_Modules.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -30,7 +30,7 @@ //============================================================================== LibraryModule::LibraryModule (const ModuleDescription& d) - : moduleInfo (d) + : moduleDescription (d) { } @@ -43,15 +43,15 @@ if (modules.shouldCopyModuleFilesLocally (moduleID)) { - auto juceModuleFolder = moduleInfo.getFolder(); + auto juceModuleFolder = moduleDescription.getFolder(); auto localModuleFolder = project.getLocalModuleFolder (moduleID); localModuleFolder.createDirectory(); projectSaver.copyFolder (juceModuleFolder, localModuleFolder); } - out << "#include <" << moduleInfo.getModuleFolder().getFileName() << "/" - << moduleInfo.getHeader().getFileName() + out << "#include <" << moduleDescription.getModuleFolder().getFileName() << "/" + << moduleDescription.getHeader().getFileName() << ">" << newLine; } @@ -78,7 +78,7 @@ if (moduleLibDir.exists()) exporter.addToModuleLibPaths ({ libSubdirPath, moduleRelativePath.getRoot() }); - auto extraInternalSearchPaths = moduleInfo.getExtraSearchPaths().trim(); + auto extraInternalSearchPaths = moduleDescription.getExtraSearchPaths().trim(); if (extraInternalSearchPaths.isNotEmpty()) { @@ -91,7 +91,7 @@ void LibraryModule::addDefinesToExporter (ProjectExporter& exporter) const { - auto extraDefs = moduleInfo.getPreprocessorDefs().trim(); + auto extraDefs = moduleDescription.getPreprocessorDefs().trim(); if (extraDefs.isNotEmpty()) exporter.getExporterPreprocessorDefsValue() = exporter.getExporterPreprocessorDefsString() + "\n" + extraDefs; @@ -105,7 +105,7 @@ auto moduleID = getID(); auto localModuleFolder = modules.shouldCopyModuleFilesLocally (moduleID) ? project.getLocalModuleFolder (moduleID) - : moduleInfo.getFolder(); + : moduleDescription.getFolder(); Array compiled; findAndAddCompiledUnits (exporter, &projectSaver, compiled); @@ -125,6 +125,8 @@ auto& project = exporter.getProject(); + auto moduleInfo = moduleDescription.getModuleInfo(); + if (exporter.isXcode()) { auto& xcodeExporter = dynamic_cast (exporter); @@ -137,26 +139,29 @@ xcodeExporter.xcodeFrameworks.add ("AudioUnit"); } - auto frameworks = moduleInfo.getModuleInfo() [xcodeExporter.isOSX() ? "OSXFrameworks" : "iOSFrameworks"].toString(); + auto frameworks = moduleInfo[xcodeExporter.isOSX() ? "OSXFrameworks" : "iOSFrameworks"].toString(); xcodeExporter.xcodeFrameworks.addTokens (frameworks, ", ", {}); - parseAndAddLibsToList (xcodeExporter.xcodeLibs, moduleInfo.getModuleInfo() [exporter.isOSX() ? "OSXLibs" : "iOSLibs"].toString()); + auto weakFrameworks = moduleInfo[xcodeExporter.isOSX() ? "WeakOSXFrameworks" : "WeakiOSFrameworks"].toString(); + xcodeExporter.xcodeWeakFrameworks.addTokens (weakFrameworks, ", ", {}); + + parseAndAddLibsToList (xcodeExporter.xcodeLibs, moduleInfo[exporter.isOSX() ? "OSXLibs" : "iOSLibs"].toString()); } else if (exporter.isLinux()) { - parseAndAddLibsToList (exporter.linuxLibs, moduleInfo.getModuleInfo() ["linuxLibs"].toString()); - parseAndAddLibsToList (exporter.linuxPackages, moduleInfo.getModuleInfo() ["linuxPackages"].toString()); + parseAndAddLibsToList (exporter.linuxLibs, moduleInfo["linuxLibs"].toString()); + parseAndAddLibsToList (exporter.linuxPackages, moduleInfo["linuxPackages"].toString()); } else if (exporter.isWindows()) { if (exporter.isCodeBlocks()) - parseAndAddLibsToList (exporter.mingwLibs, moduleInfo.getModuleInfo() ["mingwLibs"].toString()); + parseAndAddLibsToList (exporter.mingwLibs, moduleInfo["mingwLibs"].toString()); else - parseAndAddLibsToList (exporter.windowsLibs, moduleInfo.getModuleInfo() ["windowsLibs"].toString()); + parseAndAddLibsToList (exporter.windowsLibs, moduleInfo["windowsLibs"].toString()); } else if (exporter.isAndroid()) { - parseAndAddLibsToList (exporter.androidLibs, moduleInfo.getModuleInfo() ["androidLibs"].toString()); + parseAndAddLibsToList (exporter.androidLibs, moduleInfo["androidLibs"].toString()); } } @@ -170,7 +175,7 @@ void LibraryModule::getConfigFlags (Project& project, OwnedArray& flags) const { - auto header = moduleInfo.getHeader(); + auto header = moduleDescription.getHeader(); jassert (header.exists()); StringArray lines; @@ -355,7 +360,7 @@ auto sourceGroup = Project::Item::createGroup (exporter.getProject(), getID(), "__mainsourcegroup" + getID(), false); auto moduleFromProject = exporter.getModuleFolderRelativeToProject (getID()); - auto moduleHeader = moduleInfo.getHeader(); + auto moduleHeader = moduleDescription.getHeader(); auto& project = exporter.getProject(); diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/Modules/jucer_Modules.h juce-7.0.0~ds0/extras/Projucer/Source/Project/Modules/jucer_Modules.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/Modules/jucer_Modules.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/Modules/jucer_Modules.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -36,16 +36,16 @@ public: LibraryModule (const ModuleDescription&); - bool isValid() const { return moduleInfo.isValid(); } - String getID() const { return moduleInfo.getID(); } - String getVendor() const { return moduleInfo.getVendor(); } - String getVersion() const { return moduleInfo.getVersion(); } - String getName() const { return moduleInfo.getName(); } - String getDescription() const { return moduleInfo.getDescription(); } - String getLicense() const { return moduleInfo.getLicense(); } - String getMinimumCppStandard() const { return moduleInfo.getMinimumCppStandard(); } + bool isValid() const { return moduleDescription.isValid(); } + String getID() const { return moduleDescription.getID(); } + String getVendor() const { return moduleDescription.getVendor(); } + String getVersion() const { return moduleDescription.getVersion(); } + String getName() const { return moduleDescription.getName(); } + String getDescription() const { return moduleDescription.getDescription(); } + String getLicense() const { return moduleDescription.getLicense(); } + String getMinimumCppStandard() const { return moduleDescription.getMinimumCppStandard(); } - File getFolder() const { return moduleInfo.getFolder(); } + File getFolder() const { return moduleDescription.getFolder(); } void writeIncludes (ProjectSaver&, OutputStream&); void addSettingsForModuleToExporter (ProjectExporter&, ProjectSaver&) const; @@ -68,7 +68,7 @@ build_tools::ProjectType::Target::Type forTarget = build_tools::ProjectType::Target::unspecified) const; - ModuleDescription moduleInfo; + ModuleDescription moduleDescription; private: void addSearchPathsToExporter (ProjectExporter&) const; diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_ContentViewComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_ContentViewComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_ContentViewComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_ContentViewComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_ContentViewComponents.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_ContentViewComponents.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_ContentViewComponents.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_ContentViewComponents.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -302,8 +302,7 @@ for (auto& pp : properties) { - const auto propertyHeight = pp->getPreferredHeight() - + (getHeightMultiplier (pp.get()) * pp->getPreferredHeight()); + const auto propertyHeight = jmax (pp->getPreferredHeight(), getApproximateLabelHeight (*pp)); auto iter = std::find_if (propertyComponentsWithInfo.begin(), propertyComponentsWithInfo.end(), [&pp] (const std::unique_ptr& w) { return &w->propertyComponent == pp.get(); }); @@ -418,17 +417,17 @@ } } - int getHeightMultiplier (PropertyComponent* pp) + static int getApproximateLabelHeight (const PropertyComponent& pp) { auto availableTextWidth = ProjucerLookAndFeel::getTextWidthForPropertyComponent (pp); - auto font = ProjucerLookAndFeel::getPropertyComponentFont(); - auto nameWidth = font.getStringWidthFloat (pp->getName()); - if (availableTextWidth == 0) return 0; - return static_cast (nameWidth / (float) availableTextWidth); + const auto font = ProjucerLookAndFeel::getPropertyComponentFont(); + const auto labelWidth = font.getStringWidthFloat (pp.getName()); + const auto numLines = (int) (labelWidth / (float) availableTextWidth) + 1; + return (int) std::round ((float) numLines * font.getHeight() * 1.1f); } //============================================================================== diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_ProjectMessagesComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_ProjectMessagesComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_ProjectMessagesComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_ProjectMessagesComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_UserAvatarComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_UserAvatarComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/jucer_UserAvatarComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/jucer_UserAvatarComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_ExporterTreeItems.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_ExporterTreeItems.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_ExporterTreeItems.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_ExporterTreeItems.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -60,7 +60,6 @@ else if (e->isAndroid()) return Icon (getIcons().android, Colours::transparentBlack); else if (e->isCodeBlocks()) return Icon (getIcons().codeBlocks, Colours::transparentBlack); else if (e->isMakefile()) return Icon (getIcons().linux, Colours::transparentBlack); - else if (e->isCLion()) return Icon (getIcons().clion, Colours::transparentBlack); } return Icon(); diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -165,9 +165,6 @@ for (Project::ExporterIterator exporter (project); exporter.next();) { - if (exporter->isCLion()) - continue; - auto modulePathValue = exporter->getPathForModuleValue (moduleID); const auto fallbackPath = getAppSettings().getStoredPath (isJUCEModule (moduleID) ? Ids::defaultJuceModulePath : Ids::defaultUserModulePath, diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_Sidebar.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_Sidebar.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_Sidebar.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_Sidebar.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -185,7 +185,7 @@ findPanel = (1 << 2) }; - AdditionalComponents with (Type t) + JUCE_NODISCARD AdditionalComponents with (Type t) { auto copy = *this; copy.componentTypes |= t; diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_TreeItemTypes.h juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_TreeItemTypes.h --- juce-6.1.5~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_TreeItemTypes.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Project/UI/Sidebar/jucer_TreeItemTypes.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -36,7 +36,6 @@ bool isCodeBlocks() const override { return false; } bool isMakefile() const override { return false; } bool isAndroidStudio() const override { return true; } - bool isCLion() const override { return false; } bool isAndroid() const override { return true; } bool isWindows() const override { return false; } @@ -519,9 +518,12 @@ if (excludeFromBuild.size() > 0) { + mo << "set_source_files_properties(" << newLine; + for (auto& exclude : excludeFromBuild) - mo << "set_source_files_properties(\"" << exclude.toUnixStyle() << "\" PROPERTIES HEADER_FILE_ONLY TRUE)" << newLine; + mo << " \"" << exclude.toUnixStyle() << '"' << newLine; + mo << " PROPERTIES HEADER_FILE_ONLY TRUE)" << newLine; mo << newLine; } @@ -864,7 +866,7 @@ mo << " implementation files('libs/" << File (d).getFileName() << "')" << newLine; if (isInAppBillingEnabled()) - mo << " implementation 'com.android.billingclient:billing:2.1.0'" << newLine; + mo << " implementation 'com.android.billingclient:billing:5.0.0'" << newLine; if (areRemoteNotificationsEnabled()) { @@ -1639,7 +1641,7 @@ setAttributeIfNotPresent (*manifest, "xmlns:android", "http://schemas.android.com/apk/res/android"); setAttributeIfNotPresent (*manifest, "android:versionCode", androidVersionCode.get()); setAttributeIfNotPresent (*manifest, "android:versionName", project.getVersionString()); - setAttributeIfNotPresent (*manifest, "package", project.getBundleIdentifierString()); + setAttributeIfNotPresent (*manifest, "package", project.getBundleIdentifierString().toLowerCase()); return manifest; } @@ -1670,7 +1672,15 @@ } for (int i = permissions.size(); --i >= 0;) - manifest.createNewChildElement ("uses-permission")->setAttribute ("android:name", permissions[i]); + { + const auto permission = permissions[i]; + auto* usesPermission = manifest.createNewChildElement ("uses-permission"); + usesPermission->setAttribute ("android:name", permission); + + // This permission only has an effect on SDK version 28 and lower + if (permission == "android.permission.WRITE_EXTERNAL_STORAGE") + usesPermission->setAttribute ("android:maxSdkVersion", "28"); + } } void createOpenGlFeatureElement (XmlElement& manifest) const diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,1216 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-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. - - ============================================================================== -*/ - -#pragma once - -#include "jucer_ProjectExport_CodeBlocks.h" -#include "jucer_ProjectExport_Make.h" -#include "jucer_ProjectExport_Xcode.h" - -//============================================================================== -class CLionProjectExporter : public ProjectExporter -{ -protected: - //============================================================================== - class CLionBuildConfiguration : public BuildConfiguration - { - public: - CLionBuildConfiguration (Project& p, const ValueTree& settings, const ProjectExporter& e) - : BuildConfiguration (p, settings, e) - { - } - - void createConfigProperties (PropertyListBuilder&) override {} - String getModuleLibraryArchName() const override { return {}; } - }; - - BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override - { - return *new CLionBuildConfiguration (project, tree, *this); - } - -public: - //============================================================================== - static String getDisplayName() { return "CLion [Deprecated]"; } - static String getValueTreeTypeName() { return "CLION"; } - static String getTargetFolderName() { return "CLion"; } - - Identifier getExporterIdentifier() const override { return getValueTreeTypeName(); } - - static CLionProjectExporter* createForSettings (Project& projectToUse, const ValueTree& settingsToUse) - { - if (settingsToUse.hasType (getValueTreeTypeName())) - return new CLionProjectExporter (projectToUse, settingsToUse); - - return nullptr; - } - - static bool isExporterSupported (const ProjectExporter& exporter) - { - return exporter.isMakefile() - || (exporter.isXcode() && ! exporter.isiOS()) - || (exporter.isCodeBlocks() && exporter.isWindows()); - } - - //============================================================================== - CLionProjectExporter (Project& p, const ValueTree& t) : ProjectExporter (p, t) - { - name = getDisplayName(); - targetLocationValue.setDefault (getDefaultBuildsRootFolder() + getTargetFolderName()); - } - - //============================================================================== - bool usesMMFiles() const override { return false; } - bool canCopeWithDuplicateFiles() override { return false; } - bool supportsUserDefinedConfigurations() const override { return false; } - - bool isXcode() const override { return false; } - bool isVisualStudio() const override { return false; } - bool isCodeBlocks() const override { return false; } - bool isMakefile() const override { return false; } - bool isAndroidStudio() const override { return false; } - bool isCLion() const override { return true; } - - bool isAndroid() const override { return false; } - bool isWindows() const override { return false; } - bool isLinux() const override { return false; } - bool isOSX() const override { return false; } - bool isiOS() const override { return false; } - - String getNewLineString() const override { return "\n"; } - - bool supportsTargetType (build_tools::ProjectType::Target::Type) const override { return true; } - - void addPlatformSpecificSettingsForProjectType (const build_tools::ProjectType&) override {} - - //============================================================================== - bool canLaunchProject() override - { - #if JUCE_MAC - static Identifier exporterName (XcodeProjectExporter::getValueTreeTypeNameMac()); - #elif JUCE_WINDOWS - static Identifier exporterName (CodeBlocksProjectExporter::getValueTreeTypeNameWindows()); - #elif JUCE_LINUX || JUCE_BSD - static Identifier exporterName (MakefileProjectExporter::getValueTreeTypeName()); - #else - static Identifier exporterName; - #endif - - if (getProject().getExporters().getChildWithName (exporterName).isValid()) - return getCLionExecutableOrApp().exists(); - - return false; - } - - bool launchProject() override - { - return getCLionExecutableOrApp().startAsProcess (getTargetFolder().getFullPathName().quoted()); - } - - String getDescription() override - { - String description; - - description << "*****" << newLine - << newLine - << "This exporter is deprecated." << newLine - << newLine - << "CLion can open any CMake-based projects and JUCE's direct CMake support provides a much more " - << "flexible way of configuring CMake. To get started using JUCE with CMake please see the guide in " - << "the 'docs/CMake API.md' file in the JUCE source code." << newLine - << newLine - << "This exporter will no longer be updated and will eventually be removed from the Projucer." << newLine - << newLine - << "*****" << newLine - << newLine - << "This CLion exporter produces a single CMakeLists.txt file with " - << "multiple platform dependent sections, where the configuration for each section " - << "is inherited from other exporters added to this project." << newLine - << newLine - << "The exporters which provide the CLion configuration for the corresponding platform are:" << newLine - << newLine; - - for (auto& exporterInfo : getExporterTypeInfos()) - { - std::unique_ptr exporter (createNewExporter (getProject(), exporterInfo.identifier)); - - if (isExporterSupported (*exporter)) - description << exporterInfo.displayName << newLine; - } - - description << newLine - << "Add these exporters to the project to enable CLion builds." << newLine - << newLine - << "Not all features of all the exporters are currently supported. Notable omissions are AUv3 " - << "plug-ins, embedding resources and fat binaries on MacOS. On Windows the CLion exporter " - << "requires a GCC-based compiler like MinGW."; - - return description; - } - - void createExporterProperties (PropertyListBuilder& properties) override - { - for (Project::ExporterIterator exporter (getProject()); exporter.next();) - if (isExporterSupported (*exporter)) - properties.add (new BooleanPropertyComponent (getExporterEnabledValue (*exporter), "Import settings from exporter", exporter->getUniqueName()), - "If this is enabled then settings from the corresponding exporter will " - "be used in the generated CMakeLists.txt"); - } - - void createDefaultConfigs() override {} - - void create (const OwnedArray&) const override - { - // We'll append to this later. - build_tools::writeStreamToFile (getTargetFolder().getChildFile ("CMakeLists.txt"), [this] (MemoryOutputStream& mo) - { - mo.setNewLineString (getNewLineString()); - - mo << "# Automatically generated CMakeLists, created by the Projucer" << newLine - << "# Do not edit this file! Your changes will be overwritten when you re-save the Projucer project!" << newLine - << newLine; - - mo << "cmake_minimum_required (VERSION 3.4.1)" << newLine - << newLine; - - mo << "if (NOT CMAKE_BUILD_TYPE)" << newLine - << " set (CMAKE_BUILD_TYPE \"Debug\" CACHE STRING \"Choose the type of build.\" FORCE)" << newLine - << "endif (NOT CMAKE_BUILD_TYPE)" << newLine - << newLine; - }); - - // CMake has stopped adding PkgInfo files to bundles, so we need to do it manually - build_tools::writeStreamToFile (getTargetFolder().getChildFile ("PkgInfo"), - [] (MemoryOutputStream& mo) { mo << "BNDL????"; }); - } - - void writeCMakeListsExporterSection (ProjectExporter* exporter) const - { - if (! (isExporterSupported (*exporter) && isExporterEnabled (*exporter))) - return; - - MemoryBlock existingContent; - getTargetFolder().getChildFile ("CMakeLists.txt").loadFileAsData (existingContent); - - MemoryOutputStream out (existingContent, true); - out.setNewLineString (getNewLineString()); - - out << "###############################################################################" << newLine - << "# " << exporter->getUniqueName() << newLine - << "###############################################################################" << newLine - << newLine; - - if (auto* makefileExporter = dynamic_cast (exporter)) - { - out << "if (UNIX AND NOT APPLE)" << newLine << newLine; - writeCMakeListsMakefileSection (out, *makefileExporter); - } - else if (auto* xcodeExporter = dynamic_cast (exporter)) - { - out << "if (APPLE)" << newLine << newLine; - writeCMakeListsXcodeSection (out, *xcodeExporter); - } - else if (auto* codeBlocksExporter = dynamic_cast (exporter)) - { - out << "if (WIN32)" << newLine << newLine; - writeCMakeListsCodeBlocksSection (out, *codeBlocksExporter); - } - - out << "endif()" << newLine << newLine; - - build_tools::overwriteFileIfDifferentOrThrow (getTargetFolder().getChildFile ("CMakeLists.txt"), out); - } - -private: - //============================================================================== - static File getCLionExecutableOrApp() - { - File clionExeOrApp (getAppSettings() - .getStoredPath (Ids::clionExePath, TargetOS::getThisOS()).get() - .toString() - .replace ("${user.home}", File::getSpecialLocation (File::userHomeDirectory).getFullPathName())); - - #if JUCE_MAC - if (clionExeOrApp.getFullPathName().endsWith ("/Contents/MacOS/clion")) - clionExeOrApp = clionExeOrApp.getParentDirectory() - .getParentDirectory() - .getParentDirectory(); - #endif - - return clionExeOrApp; - } - - //============================================================================== - Identifier getExporterEnabledId (const ProjectExporter& exporter) const - { - jassert (isExporterSupported (exporter)); - - if (exporter.isMakefile()) return Ids::clionMakefileEnabled; - else if (exporter.isXcode()) return Ids::clionXcodeEnabled; - else if (exporter.isCodeBlocks()) return Ids::clionCodeBlocksEnabled; - - jassertfalse; - return {}; - } - - bool isExporterEnabled (const ProjectExporter& exporter) const - { - auto setting = settings[getExporterEnabledId (exporter)]; - return setting.isVoid() || setting; - } - - Value getExporterEnabledValue (const ProjectExporter& exporter) - { - auto enabledID = getExporterEnabledId (exporter); - getSetting (enabledID) = isExporterEnabled (exporter); - return getSetting (enabledID); - } - - //============================================================================== - static bool isWindowsAbsolutePath (const String& path) - { - return path.length() > 1 && path[1] == ':'; - } - - static bool isUnixAbsolutePath (const String& path) - { - return path.isNotEmpty() && (path[0] == '/' || path[0] == '~' || path.startsWith ("$ENV{HOME}")); - } - - //============================================================================== - static String setCMakeVariable (const String& variableName, const String& value) - { - return "set (" + variableName + " \"" + value + "\")"; - } - - static String addToCMakeVariable (const String& variableName, const String& value) - { - return setCMakeVariable (variableName, "${" + variableName + "} " + value); - } - - static String getTargetVarName (build_tools::ProjectType::Target& target) - { - return String (target.getName()).toUpperCase().replaceCharacter (L' ', L'_'); - } - - template - void getFileInfoList (Target& target, Exporter& exporter, const Project::Item& projectItem, std::vector>& fileInfoList) const - { - auto targetType = (getProject().isAudioPluginProject() ? target.type : Target::Type::SharedCodeTarget); - - if (projectItem.isGroup()) - { - for (int i = 0; i < projectItem.getNumChildren(); ++i) - getFileInfoList (target, exporter, projectItem.getChild(i), fileInfoList); - } - else if (projectItem.shouldBeAddedToTargetProject() && projectItem.shouldBeAddedToTargetExporter (*this) - && getProject().getTargetTypeFromFilePath (projectItem.getFile(), true) == targetType ) - { - auto path = build_tools::RelativePath (projectItem.getFile(), exporter.getTargetFolder(), build_tools::RelativePath::buildTargetFolder).toUnixStyle(); - - fileInfoList.push_back (std::make_tuple (path, - projectItem.shouldBeCompiled(), - exporter.compilerFlagSchemesMap[projectItem.getCompilerFlagSchemeString()].get().toString())); - } - } - - template - void writeCMakeTargets (OutputStream& out, Exporter& exporter) const - { - for (auto* target : exporter.targets) - { - if (target->type == build_tools::ProjectType::Target::Type::AggregateTarget - || target->type == build_tools::ProjectType::Target::Type::AudioUnitv3PlugIn) - continue; - - String functionName; - StringArray properties; - - switch (target->getTargetFileType()) - { - case build_tools::ProjectType::Target::TargetFileType::executable: - functionName = "add_executable"; - - if (exporter.isCodeBlocks() && exporter.isWindows() - && target->type != - build_tools::ProjectType::Target::Type::ConsoleApp) - properties.add ("WIN32"); - - break; - case build_tools::ProjectType::Target::TargetFileType::staticLibrary: - case build_tools::ProjectType::Target::TargetFileType::sharedLibraryOrDLL: - case build_tools::ProjectType::Target::TargetFileType::pluginBundle: - functionName = "add_library"; - - if (target->getTargetFileType() == - build_tools::ProjectType::Target::TargetFileType::staticLibrary) - properties.add ("STATIC"); - else if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::sharedLibraryOrDLL) - properties.add ("SHARED"); - else - properties.add ("MODULE"); - - break; - case build_tools::ProjectType::Target::TargetFileType::macOSAppex: - case build_tools::ProjectType::Target::TargetFileType::unknown: - default: - continue; - } - - out << functionName << " (" << getTargetVarName (*target); - - if (! properties.isEmpty()) - out << " " << properties.joinIntoString (" "); - - out << newLine; - - std::vector> fileInfoList; - for (auto& group : exporter.getAllGroups()) - getFileInfoList (*target, exporter, group, fileInfoList); - - for (auto& fileInfo : fileInfoList) - out << " " << std::get<0> (fileInfo).quoted() << newLine; - - auto isCMakeBundle = exporter.isXcode() - && target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle; - auto pkgInfoPath = String ("PkgInfo").quoted(); - - if (isCMakeBundle) - out << " " << pkgInfoPath << newLine; - - auto xcodeIcnsFilePath = [&]() -> String - { - if (exporter.isXcode() - && target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::executable) - { - StringArray pathComponents = { "..", "MacOSX", "Icon.icns" }; - auto xcodeIcnsFile = getTargetFolder(); - - for (auto& comp : pathComponents) - xcodeIcnsFile = xcodeIcnsFile.getChildFile (comp); - - if (xcodeIcnsFile.existsAsFile()) - return pathComponents.joinIntoString ("/").quoted(); - } - - return {}; - }(); - - if (xcodeIcnsFilePath.isNotEmpty()) - out << " " << xcodeIcnsFilePath << newLine; - - if (exporter.isCodeBlocks() - && target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::executable) - { - StringArray pathComponents = { "..", "CodeBlocksWindows", "resources.rc" }; - auto windowsRcFile = getTargetFolder(); - - for (auto& comp : pathComponents) - windowsRcFile = windowsRcFile.getChildFile (comp); - - if (windowsRcFile.existsAsFile()) - out << " " << pathComponents.joinIntoString ("/").quoted() << newLine; - } - - out << ")" << newLine << newLine; - - if (isCMakeBundle) - out << "set_source_files_properties (" << pkgInfoPath << " PROPERTIES MACOSX_PACKAGE_LOCATION .)" << newLine; - - if (xcodeIcnsFilePath.isNotEmpty()) - out << "set_source_files_properties (" << xcodeIcnsFilePath << " PROPERTIES MACOSX_PACKAGE_LOCATION \"Resources\")" << newLine; - - for (auto& fileInfo : fileInfoList) - { - if (std::get<1> (fileInfo)) - { - auto extraCompilerFlags = std::get<2> (fileInfo); - - if (extraCompilerFlags.isNotEmpty()) - out << "set_source_files_properties(" << std::get<0> (fileInfo).quoted() << " PROPERTIES COMPILE_FLAGS " << extraCompilerFlags << " )" << newLine; - } - else - { - out << "set_source_files_properties (" << std::get<0> (fileInfo).quoted() << " PROPERTIES HEADER_FILE_ONLY TRUE)" << newLine; - } - } - - out << newLine; - } - } - - //============================================================================== - void writeCMakeListsMakefileSection (OutputStream& out, MakefileProjectExporter& exporter) const - { - out << "project (" << getProject().getProjectNameString().quoted() << " C CXX)" << newLine - << newLine; - - out << "find_package (PkgConfig REQUIRED)" << newLine; - - for (auto& package : exporter.getCompilePackages()) - out << "pkg_search_module (" << package.toUpperCase() << " REQUIRED " << package << ")" << newLine; - - out << newLine; - - writeCMakeTargets (out, exporter); - - for (auto* target : exporter.targets) - { - if (target->type == build_tools::ProjectType::Target::Type::AggregateTarget) - continue; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle) - out << "set_target_properties (" << getTargetVarName (*target) << " PROPERTIES PREFIX \"\")" << newLine; - - out << "set_target_properties (" << getTargetVarName (*target) << " PROPERTIES SUFFIX \"" << target->getTargetFileSuffix() << "\")" << newLine - << newLine; - } - - for (ProjectExporter::ConstConfigIterator c (exporter); c.next();) - { - auto& config = dynamic_cast (*c); - - out << "#------------------------------------------------------------------------------" << newLine - << "# Config: " << config.getName() << newLine - << "#------------------------------------------------------------------------------" << newLine - << newLine; - - auto buildTypeCondition = String ("CMAKE_BUILD_TYPE STREQUAL " + config.getName()); - out << "if (" << buildTypeCondition << ")" << newLine - << newLine; - - out << "execute_process (COMMAND uname -m OUTPUT_VARIABLE JUCE_ARCH_LABEL OUTPUT_STRIP_TRAILING_WHITESPACE)" << newLine - << newLine; - - out << "include_directories (" << newLine; - - for (auto& path : exporter.getHeaderSearchPaths (config)) - out << " " << path.quoted() << newLine; - - for (auto& package : exporter.getCompilePackages()) - out << " ${" << package.toUpperCase() << "_INCLUDE_DIRS}" << newLine; - - out << ")" << newLine << newLine; - - StringArray cmakeFoundLibraries; - - for (auto& library : exporter.getLibraryNames (config)) - { - String cmakeLibraryID (library.toUpperCase()); - cmakeFoundLibraries.add (String ("${") + cmakeLibraryID + "}"); - out << "find_library (" << cmakeLibraryID << " " << library << newLine; - - for (auto& path : exporter.getLibrarySearchPaths (config)) - out << " " << path.quoted() << newLine; - - out << ")" << newLine - << newLine; - } - - for (auto* target : exporter.targets) - { - if (target->type == build_tools::ProjectType::Target::Type::AggregateTarget) - continue; - - auto targetVarName = getTargetVarName (*target); - - out << "set_target_properties (" << targetVarName << " PROPERTIES" << newLine - << " OUTPUT_NAME " << config.getTargetBinaryNameString().quoted() << newLine; - - auto cxxStandard = project.getCppStandardString(); - - if (cxxStandard == "latest") - cxxStandard = project.getLatestNumberedCppStandardString(); - - out << " CXX_STANDARD " << cxxStandard << newLine; - - if (! shouldUseGNUExtensions()) - out << " CXX_EXTENSIONS OFF" << newLine; - - out << ")" << newLine << newLine; - - auto defines = exporter.getDefines (config); - defines.addArray (target->getDefines (config)); - - out << "target_compile_definitions (" << targetVarName << " PRIVATE" << newLine; - - for (auto& key : defines.getAllKeys()) - out << " " << key << "=" << defines[key] << newLine; - - out << ")" << newLine << newLine; - - auto targetFlags = target->getCompilerFlags(); - - if (! targetFlags.isEmpty()) - { - out << "target_compile_options (" << targetVarName << " PRIVATE" << newLine; - - for (auto& flag : targetFlags) - out << " " << flag << newLine; - - out << ")" << newLine << newLine; - } - - out << "target_link_libraries (" << targetVarName << " PRIVATE" << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle - || target->type == build_tools::ProjectType::Target::Type::StandalonePlugIn) - out << " SHARED_CODE" << newLine; - - out << " " << exporter.getArchFlags (config) << newLine; - - for (auto& flag : target->getLinkerFlags()) - out << " " << flag << newLine; - - for (auto& flag : exporter.getLinkerFlags (config)) - out << " " << flag << newLine; - - for (auto& lib : cmakeFoundLibraries) - out << " " << lib << newLine; - - for (auto& package : exporter.getLinkPackages()) - out << " ${" << package.toUpperCase() << "_LIBRARIES}" << newLine; - - out << ")" << newLine << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle - || target->type == build_tools::ProjectType::Target::Type::StandalonePlugIn) - out << "add_dependencies (" << targetVarName << " " << "SHARED_CODE)" << newLine << newLine; - } - - StringArray cFlags; - cFlags.add (exporter.getArchFlags (config)); - cFlags.addArray (exporter.getCPreprocessorFlags (config)); - cFlags.addArray (exporter.getCFlags (config)); - out << addToCMakeVariable ("CMAKE_C_FLAGS", cFlags.joinIntoString (" ")) << newLine; - - String cxxFlags; - - for (auto& flag : exporter.getCXXFlags (config)) - if (! flag.startsWith ("-std=")) - cxxFlags += " " + flag; - - out << addToCMakeVariable ("CMAKE_CXX_FLAGS", "${CMAKE_C_FLAGS} " + cxxFlags) << newLine - << newLine; - - out << "endif (" << buildTypeCondition << ")" << newLine - << newLine; - } - } - - //============================================================================== - void writeCMakeListsCodeBlocksSection (OutputStream& out, CodeBlocksProjectExporter& exporter) const - { - out << "project (" << getProject().getProjectNameString().quoted() << " C CXX)" << newLine - << newLine; - - writeCMakeTargets (out, exporter); - - for (auto* target : exporter.targets) - { - if (target->type == build_tools::ProjectType::Target::Type::AggregateTarget) - continue; - - out << "set_target_properties (" << getTargetVarName (*target) << " PROPERTIES PREFIX \"\")" << newLine - << "set_target_properties (" << getTargetVarName (*target) << " PROPERTIES SUFFIX " << target->getTargetSuffix().quoted() << ")" << newLine - << newLine; - } - - for (ProjectExporter::ConstConfigIterator c (exporter); c.next();) - { - auto& config = dynamic_cast (*c); - - out << "#------------------------------------------------------------------------------" << newLine - << "# Config: " << config.getName() << newLine - << "#------------------------------------------------------------------------------" << newLine - << newLine; - - auto buildTypeCondition = String ("CMAKE_BUILD_TYPE STREQUAL " + config.getName()); - out << "if (" << buildTypeCondition << ")" << newLine - << newLine; - - out << "include_directories (" << newLine; - - for (auto& path : exporter.getIncludePaths (config)) - out << " " << path.replace ("\\", "/").quoted() << newLine; - - out << ")" << newLine << newLine; - - for (auto* target : exporter.targets) - { - if (target->type == build_tools::ProjectType::Target::Type::AggregateTarget) - continue; - - auto targetVarName = getTargetVarName (*target); - - out << "set_target_properties (" << targetVarName << " PROPERTIES" << newLine - << " OUTPUT_NAME " << config.getTargetBinaryNameString().quoted() << newLine; - - auto cxxStandard = project.getCppStandardString(); - - if (cxxStandard == "latest") - cxxStandard = project.getLatestNumberedCppStandardString(); - - out << " CXX_STANDARD " << cxxStandard << newLine; - - if (! shouldUseGNUExtensions()) - out << " CXX_EXTENSIONS OFF" << newLine; - - out << ")" << newLine << newLine; - - out << "target_compile_definitions (" << targetVarName << " PRIVATE" << newLine; - - for (auto& def : exporter.getDefines (config, *target)) - out << " " << def << newLine; - - out << ")" << newLine << newLine; - - out << "target_compile_options (" << targetVarName << " PRIVATE" << newLine; - - for (auto& option : exporter.getCompilerFlags (config, *target)) - if (! option.startsWith ("-std=")) - out << " " << option.quoted() << newLine; - - out << ")" << newLine << newLine; - - out << "target_link_libraries (" << targetVarName << " PRIVATE" << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle - || target->type == build_tools::ProjectType::Target::Type::StandalonePlugIn) - out << " SHARED_CODE" << newLine - << " -L." << newLine; - - for (auto& path : exporter.getLinkerSearchPaths (config, *target)) - { - out << " \"-L\\\""; - - if (! isWindowsAbsolutePath (path)) - out << "${CMAKE_CURRENT_SOURCE_DIR}/"; - - out << path.replace ("\\", "/").unquoted() << "\\\"\"" << newLine; - } - - for (auto& flag : exporter.getLinkerFlags (config, *target)) - out << " " << flag << newLine; - - for (auto& flag : exporter.getProjectLinkerLibs()) - out << " -l" << flag << newLine; - - for (auto& lib : exporter.mingwLibs) - out << " -l" << lib << newLine; - - out << ")" << newLine << newLine; - } - - out << addToCMakeVariable ("CMAKE_CXX_FLAGS", exporter.getProjectCompilerOptions().joinIntoString (" ")) << newLine - << addToCMakeVariable ("CMAKE_C_FLAGS", "${CMAKE_CXX_FLAGS}") << newLine - << newLine; - - out << "endif (" << buildTypeCondition << ")" << newLine - << newLine; - } - } - - //============================================================================== - void writeCMakeListsXcodeSection (OutputStream& out, XcodeProjectExporter& exporter) const - { - // We need to find out the SDK root before defining the project. Unfortunately this is - // set per-target in the Xcode project, but we want it per-configuration. - for (ProjectExporter::ConstConfigIterator c (exporter); c.next();) - { - auto& config = dynamic_cast (*c); - - for (auto* target : exporter.targets) - { - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::macOSAppex - || target->type == build_tools::ProjectType::Target::Type::AggregateTarget - || target->type == build_tools::ProjectType::Target::Type::AudioUnitv3PlugIn) - continue; - - auto targetAttributes = target->getTargetSettings (config); - auto targetAttributeKeys = targetAttributes.getAllKeys(); - - if (targetAttributes.getAllKeys().contains ("SDKROOT")) - { - out << "if (CMAKE_BUILD_TYPE STREQUAL " + config.getName() << ")" << newLine - << " set (CMAKE_OSX_SYSROOT " << targetAttributes["SDKROOT"] << ")" << newLine - << "endif()" << newLine << newLine; - break; - } - } - } - - out << "project (" << getProject().getProjectNameString().quoted() << " C CXX)" << newLine << newLine; - - writeCMakeTargets (out, exporter); - - for (auto* target : exporter.targets) - { - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::macOSAppex - || target->type == build_tools::ProjectType::Target::Type::AggregateTarget - || target->type == build_tools::ProjectType::Target::Type::AudioUnitv3PlugIn) - continue; - - if (target->type == build_tools::ProjectType::Target::Type::AudioUnitPlugIn) - out << "find_program (RC_COMPILER Rez NO_DEFAULT_PATHS PATHS \"/Applications/Xcode.app/Contents/Developer/usr/bin\")" << newLine - << "if (NOT RC_COMPILER)" << newLine - << " message (WARNING \"failed to find Rez; older resource-based AU plug-ins may not work correctly\")" << newLine - << "endif (NOT RC_COMPILER)" << newLine << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::staticLibrary - || target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::sharedLibraryOrDLL) - out << "set_target_properties (" << getTargetVarName (*target) << " PROPERTIES SUFFIX \"" << target->xcodeBundleExtension << "\")" << newLine - << newLine; - } - - for (ProjectExporter::ConstConfigIterator c (exporter); c.next();) - { - auto& config = dynamic_cast (*c); - - out << "#------------------------------------------------------------------------------" << newLine - << "# Config: " << config.getName() << newLine - << "#------------------------------------------------------------------------------" << newLine - << newLine; - - auto buildTypeCondition = String ("CMAKE_BUILD_TYPE STREQUAL " + config.getName()); - out << "if (" << buildTypeCondition << ")" << newLine - << newLine; - - out << "execute_process (COMMAND uname -m OUTPUT_VARIABLE JUCE_ARCH_LABEL OUTPUT_STRIP_TRAILING_WHITESPACE)" << newLine - << newLine; - - auto configSettings = exporter.getProjectSettings (config); - auto configSettingsKeys = configSettings.getAllKeys(); - - auto binaryName = config.getTargetBinaryNameString(); - - if (configSettingsKeys.contains ("PRODUCT_NAME")) - binaryName = configSettings["PRODUCT_NAME"].unquoted(); - - for (auto* target : exporter.targets) - { - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::macOSAppex - || target->type == build_tools::ProjectType::Target::Type::AggregateTarget - || target->type == build_tools::ProjectType::Target::Type::AudioUnitv3PlugIn) - continue; - - auto targetVarName = getTargetVarName (*target); - - auto targetAttributes = target->getTargetSettings (config); - auto targetAttributeKeys = targetAttributes.getAllKeys(); - - StringArray headerSearchPaths; - - if (targetAttributeKeys.contains ("HEADER_SEARCH_PATHS")) - { - auto paths = targetAttributes["HEADER_SEARCH_PATHS"].trim().substring (1).dropLastCharacters (1); - paths = paths.replace ("\"$(inherited)\"", {}) - .replace ("$(HOME)", "$ENV{HOME}") - .replace ("~", "$ENV{HOME}"); - headerSearchPaths.addTokens (paths, ",\"\t\\", {}); - headerSearchPaths.removeEmptyStrings(); - targetAttributeKeys.removeString ("HEADER_SEARCH_PATHS"); - } - - out << "target_include_directories (" << targetVarName << " PRIVATE" << newLine; - - for (auto& path : headerSearchPaths) - out << " " << path.quoted() << newLine; - - out << ")" << newLine << newLine; - - StringArray defines; - - if (targetAttributeKeys.contains ("GCC_PREPROCESSOR_DEFINITIONS")) - { - defines.addTokens (targetAttributes["GCC_PREPROCESSOR_DEFINITIONS"], "(),\t", {}); - defines.removeEmptyStrings(); - targetAttributeKeys.removeString ("GCC_PREPROCESSOR_DEFINITIONS"); - } - - out << "target_compile_definitions (" << targetVarName << " PRIVATE" << newLine; - - for (auto& def : defines) - out << " " << def.replace ("\\\\\\\"", "\\\"").replace ("\\\\ ", " ") << newLine; - - out << ")" << newLine << newLine; - - StringArray cppFlags; - - String archLabel ("${JUCE_ARCH_LABEL}"); - - // Fat binaries are not supported. - if (targetAttributeKeys.contains ("ARCHS")) - { - auto value = targetAttributes["ARCHS"].unquoted(); - - if (value.contains ("NATIVE_ARCH_ACTUAL")) - { - cppFlags.add ("-march=native"); - } - else if (value.contains ("ARCHS_STANDARD_32_BIT")) - { - archLabel = "i386"; - cppFlags.add ("-arch x86"); - } - else if (value.contains ("ARCHS_STANDARD_32_64_BIT") - || value.contains ("ARCHS_STANDARD_64_BIT")) - { - archLabel = "x86_64"; - cppFlags.add ("-arch x86_64"); - } - - targetAttributeKeys.removeString ("ARCHS"); - } - - if (targetAttributeKeys.contains ("MACOSX_DEPLOYMENT_TARGET")) - { - cppFlags.add ("-mmacosx-version-min=" + targetAttributes["MACOSX_DEPLOYMENT_TARGET"]); - targetAttributeKeys.removeString ("MACOSX_DEPLOYMENT_TARGET"); - } - - if (targetAttributeKeys.contains ("OTHER_CPLUSPLUSFLAGS")) - { - cppFlags.add (targetAttributes["OTHER_CPLUSPLUSFLAGS"].unquoted()); - targetAttributeKeys.removeString ("OTHER_CPLUSPLUSFLAGS"); - } - - if (targetAttributeKeys.contains ("GCC_OPTIMIZATION_LEVEL")) - { - cppFlags.add ("-O" + targetAttributes["GCC_OPTIMIZATION_LEVEL"]); - targetAttributeKeys.removeString ("GCC_OPTIMIZATION_LEVEL"); - } - - if (targetAttributeKeys.contains ("LLVM_LTO")) - { - cppFlags.add ("-flto"); - targetAttributeKeys.removeString ("LLVM_LTO"); - } - - if (targetAttributeKeys.contains ("GCC_FAST_MATH")) - { - cppFlags.add ("-ffast-math"); - targetAttributeKeys.removeString ("GCC_FAST_MATH"); - } - - // We'll take this setting from the project - targetAttributeKeys.removeString ("CLANG_CXX_LANGUAGE_STANDARD"); - - if (targetAttributeKeys.contains ("CLANG_CXX_LIBRARY")) - { - cppFlags.add ("-stdlib=" + targetAttributes["CLANG_CXX_LIBRARY"].unquoted()); - targetAttributeKeys.removeString ("CLANG_CXX_LIBRARY"); - } - - out << "target_compile_options (" << targetVarName << " PRIVATE" << newLine; - - for (auto& flag : cppFlags) - out << " " << flag << newLine; - - out << ")" << newLine << newLine; - - StringArray libSearchPaths; - - if (targetAttributeKeys.contains ("LIBRARY_SEARCH_PATHS")) - { - auto paths = targetAttributes["LIBRARY_SEARCH_PATHS"].trim().substring (1).dropLastCharacters (1); - paths = paths.replace ("\"$(inherited)\"", {}); - paths = paths.replace ("$(HOME)", "$ENV{HOME}"); - libSearchPaths.addTokens (paths, ",\"\t\\", {}); - libSearchPaths.removeEmptyStrings(); - - for (auto& libPath : libSearchPaths) - { - libPath = libPath.replace ("${CURRENT_ARCH}", archLabel); - - if (! isUnixAbsolutePath (libPath)) - libPath = "${CMAKE_CURRENT_SOURCE_DIR}/" + libPath; - } - - targetAttributeKeys.removeString ("LIBRARY_SEARCH_PATHS"); - } - - StringArray linkerFlags; - - if (targetAttributeKeys.contains ("OTHER_LDFLAGS")) - { - // CMake adds its own SHARED_CODE library linking flags - auto flagsWithReplacedSpaces = targetAttributes["OTHER_LDFLAGS"].unquoted().replace ("\\\\ ", "^^%%^^"); - linkerFlags.addTokens (flagsWithReplacedSpaces, true); - linkerFlags.removeString ("-bundle"); - linkerFlags.removeString ("-l" + binaryName.replace (" ", "^^%%^^")); - - for (auto& flag : linkerFlags) - flag = flag.replace ("^^%%^^", " "); - - targetAttributeKeys.removeString ("OTHER_LDFLAGS"); - } - - if (target->type == build_tools::ProjectType::Target::Type::AudioUnitPlugIn) - { - String rezFlags; - - if (targetAttributeKeys.contains ("OTHER_REZFLAGS")) - { - rezFlags = targetAttributes["OTHER_REZFLAGS"]; - targetAttributeKeys.removeString ("OTHER_REZFLAGS"); - } - - for (auto& item : exporter.getAllGroups()) - { - if (item.getName() == ProjectSaver::getJuceCodeGroupName()) - { - auto resSourcesVar = targetVarName + "_REZ_SOURCES"; - auto resOutputVar = targetVarName + "_REZ_OUTPUT"; - - auto sdkVersion = config.getMacOSBaseSDKString().upToFirstOccurrenceOf (" ", false, false); - auto sysroot = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX" + sdkVersion + ".sdk"; - - build_tools::RelativePath rFile ("JuceLibraryCode/include_juce_audio_plugin_client_AU.r", build_tools::RelativePath::projectFolder); - rFile = rebaseFromProjectFolderToBuildTarget (rFile); - - out << "if (RC_COMPILER)" << newLine - << " set (" << resSourcesVar << newLine - << " " << ("${CMAKE_CURRENT_SOURCE_DIR}/" + rFile.toUnixStyle()).quoted() << newLine - << " )" << newLine - << " set (" << resOutputVar << " " << ("${CMAKE_CURRENT_BINARY_DIR}/" + binaryName + ".rsrc").quoted() << ")" << newLine - << " target_sources (" << targetVarName << " PRIVATE" << newLine - << " ${" << resSourcesVar << "}" << newLine - << " ${" << resOutputVar << "}" << newLine - << " )" << newLine - << " execute_process (COMMAND" << newLine - << " ${RC_COMPILER}" << newLine - << " " << rezFlags.unquoted().removeCharacters ("\\") << newLine - << " -isysroot " << sysroot.quoted() << newLine; - - for (auto& path : headerSearchPaths) - { - out << " -I \""; - - if (! isUnixAbsolutePath (path)) - out << "${PROJECT_SOURCE_DIR}/"; - - out << path << "\"" << newLine; - } - - out << " ${" << resSourcesVar << "}" << newLine - << " -o ${" << resOutputVar << "}" << newLine - << " )" << newLine - << " set_source_files_properties (${" << resOutputVar << "} PROPERTIES" << newLine - << " GENERATED TRUE" << newLine - << " MACOSX_PACKAGE_LOCATION Resources" << newLine - << " )" << newLine - << "endif (RC_COMPILER)" << newLine << newLine; - break; - } - } - } - - if (targetAttributeKeys.contains ("INFOPLIST_FILE")) - { - auto plistFile = exporter.getTargetFolder().getChildFile (targetAttributes["INFOPLIST_FILE"]); - - if (auto plist = parseXML (plistFile)) - { - if (auto* dict = plist->getChildByName ("dict")) - { - if (auto* entry = dict->getChildByName ("key")) - { - while (entry != nullptr) - { - if (entry->getAllSubText() == "CFBundleExecutable") - { - if (auto* bundleName = entry->getNextElementWithTagName ("string")) - { - bundleName->deleteAllTextElements(); - bundleName->addTextElement (binaryName); - } - } - - entry = entry->getNextElementWithTagName ("key"); - } - } - } - - auto updatedPlist = getTargetFolder().getChildFile (config.getName() + "-" + plistFile.getFileName()); - - XmlElement::TextFormat format; - format.dtd = ""; - plist->writeTo (updatedPlist, format); - - targetAttributes.set ("INFOPLIST_FILE", ("${CMAKE_CURRENT_SOURCE_DIR}/" + updatedPlist.getFileName()).quoted()); - } - else - { - targetAttributeKeys.removeString ("INFOPLIST_FILE"); - } - } - - targetAttributeKeys.sort (false); - - out << "set_target_properties (" << targetVarName << " PROPERTIES" << newLine - << " OUTPUT_NAME " << binaryName.quoted() << newLine; - - auto cxxStandard = project.getCppStandardString(); - - if (cxxStandard == "latest") - cxxStandard = project.getLatestNumberedCppStandardString(); - - out << " CXX_STANDARD " << cxxStandard << newLine; - - if (! shouldUseGNUExtensions()) - out << " CXX_EXTENSIONS OFF" << newLine; - - if (targetAttributeKeys.contains ("MTL_HEADER_SEARCH_PATHS")) - { - auto pathsString = targetAttributes["MTL_HEADER_SEARCH_PATHS"].trim().substring (1).dropLastCharacters (1); - - pathsString = pathsString.replace ("\"$(inherited)\"", {}) - .replace ("$(HOME)", "$ENV{HOME}") - .replace ("~", "$ENV{HOME}"); - - auto paths = StringArray::fromTokens (pathsString, ",\"\t\\", {}); - paths.removeEmptyStrings(); - - out << " XCODE_ATTRIBUTE_MTL_HEADER_SEARCH_PATHS" << " " << paths.joinIntoString (" ").quoted() << newLine; - targetAttributeKeys.removeString ("MTL_HEADER_SEARCH_PATHS"); - } - - for (auto& key : targetAttributeKeys) - out << " XCODE_ATTRIBUTE_" << key << " " << targetAttributes[key] << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::executable - || target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle) - { - out << " MACOSX_BUNDLE_INFO_PLIST " << targetAttributes.getValue ("INFOPLIST_FILE", "\"\"") << newLine - << " XCODE_ATTRIBUTE_PRODUCT_NAME " << binaryName.quoted() << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::executable) - { - out << " MACOSX_BUNDLE TRUE" << newLine; - } - else - { - out << " BUNDLE TRUE" << newLine - << " BUNDLE_EXTENSION " << targetAttributes.getValue ("WRAPPER_EXTENSION", "\"\"") << newLine - << " XCODE_ATTRIBUTE_MACH_O_TYPE \"mh_bundle\"" << newLine; - } - } - - out << ")" << newLine << newLine; - - out << "target_link_libraries (" << targetVarName << " PRIVATE" << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle - || target->type == build_tools::ProjectType::Target::Type::StandalonePlugIn) - out << " SHARED_CODE" << newLine; - - for (auto& path : libSearchPaths) - out << " \"-L\\\"" << path << "\\\"\"" << newLine; - - for (auto& flag : linkerFlags) - out << " " << flag.quoted() << newLine; - - for (auto& framework : target->frameworkNames) - out << " \"-framework " << framework << "\"" << newLine; - - out << ")" << newLine << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle - || target->type == build_tools::ProjectType::Target::Type::StandalonePlugIn) - { - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle - && targetAttributeKeys.contains("INSTALL_PATH")) - { - auto installPath = targetAttributes["INSTALL_PATH"].unquoted().replace ("$(HOME)", "$ENV{HOME}"); - auto productFilename = binaryName + (targetAttributeKeys.contains ("WRAPPER_EXTENSION") ? "." + targetAttributes["WRAPPER_EXTENSION"] : String()); - auto productPath = (installPath + productFilename).quoted(); - out << "add_custom_command (TARGET " << targetVarName << " POST_BUILD" << newLine - << " COMMAND ${CMAKE_COMMAND} -E remove_directory " << productPath << newLine - << " COMMAND ${CMAKE_COMMAND} -E copy_directory \"${CMAKE_BINARY_DIR}/" << productFilename << "\" " << productPath << newLine - << " COMMENT \"Copying \\\"" << productFilename << "\\\" to \\\"" << installPath.unquoted() << "\\\"\"" << newLine - << ")" << newLine << newLine; - } - } - } - - std::map basicWarnings - { - { "CLANG_WARN_BOOL_CONVERSION", "bool-conversion" }, - { "CLANG_WARN_COMMA", "comma" }, - { "CLANG_WARN_CONSTANT_CONVERSION", "constant-conversion" }, - { "CLANG_WARN_EMPTY_BODY", "empty-body" }, - { "CLANG_WARN_ENUM_CONVERSION", "enum-conversion" }, - { "CLANG_WARN_INFINITE_RECURSION", "infinite-recursion" }, - { "CLANG_WARN_INT_CONVERSION", "int-conversion" }, - { "CLANG_WARN_RANGE_LOOP_ANALYSIS", "range-loop-analysis" }, - { "CLANG_WARN_STRICT_PROTOTYPES", "strict-prototypes" }, - { "GCC_WARN_CHECK_SWITCH_STATEMENTS", "switch" }, - { "GCC_WARN_UNUSED_VARIABLE", "unused-variable" }, - { "GCC_WARN_MISSING_PARENTHESES", "parentheses" }, - { "GCC_WARN_NON_VIRTUAL_DESTRUCTOR", "non-virtual-dtor" }, - { "GCC_WARN_64_TO_32_BIT_CONVERSION", "shorten-64-to-32" }, - { "GCC_WARN_UNDECLARED_SELECTOR", "undeclared-selector" }, - { "GCC_WARN_UNUSED_FUNCTION", "unused-function" } - }; - - StringArray compilerFlags; - - for (auto& key : configSettingsKeys) - { - auto basicWarning = basicWarnings.find (key); - - if (basicWarning != basicWarnings.end()) - { - compilerFlags.add (configSettings[key] == "YES" ? "-W" + basicWarning->second : "-Wno-" + basicWarning->second); - } - else if (key == "CLANG_WARN_SUSPICIOUS_MOVE" && configSettings[key] == "YES") compilerFlags.add ("-Wmove"); - else if (key == "CLANG_WARN_UNREACHABLE_CODE" && configSettings[key] == "YES") compilerFlags.add ("-Wunreachable-code"); - else if (key == "CLANG_WARN__DUPLICATE_METHOD_MATCH" && configSettings[key] == "YES") compilerFlags.add ("-Wduplicate-method-match"); - else if (key == "GCC_INLINES_ARE_PRIVATE_EXTERN" && configSettings[key] == "YES") compilerFlags.add ("-fvisibility-inlines-hidden"); - else if (key == "GCC_NO_COMMON_BLOCKS" && configSettings[key] == "YES") compilerFlags.add ("-fno-common"); - else if (key == "GCC_WARN_ABOUT_RETURN_TYPE" && configSettings[key] != "YES") compilerFlags.add (configSettings[key] == "YES_ERROR" ? "-Werror=return-type" : "-Wno-return-type"); - else if (key == "GCC_WARN_TYPECHECK_CALLS_TO_PRINTF" && configSettings[key] != "YES") compilerFlags.add ("-Wno-format"); - else if (key == "GCC_WARN_UNINITIALIZED_AUTOS") - { - if (configSettings[key] == "YES") compilerFlags.add ("-Wuninitialized"); - else if (configSettings[key] == "YES_AGGRESSIVE") compilerFlags.add ("--Wconditional-uninitialized"); - else compilerFlags.add (")-Wno-uninitialized"); - } - else if (key == "WARNING_CFLAGS") compilerFlags.add (configSettings[key].unquoted()); - } - - out << addToCMakeVariable ("CMAKE_CXX_FLAGS", compilerFlags.joinIntoString (" ")) << newLine - << addToCMakeVariable ("CMAKE_C_FLAGS", "${CMAKE_CXX_FLAGS}") << newLine - << newLine; - - out << "endif (" << buildTypeCondition << ")" << newLine - << newLine; - } - } - - //============================================================================== - JUCE_DECLARE_NON_COPYABLE (CLionProjectExporter) -}; diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -90,7 +90,6 @@ bool isCodeBlocks() const override { return true; } bool isMakefile() const override { return false; } bool isAndroidStudio() const override { return false; } - bool isCLion() const override { return false; } bool isAndroid() const override { return false; } bool isWindows() const override { return os == windowsTarget; } @@ -107,24 +106,27 @@ bool supportsTargetType (build_tools::ProjectType::Target::Type type) const override { + using Target = build_tools::ProjectType::Target; + switch (type) { - case build_tools::ProjectType::Target::StandalonePlugIn: - case build_tools::ProjectType::Target::GUIApp: - case build_tools::ProjectType::Target::ConsoleApp: - case build_tools::ProjectType::Target::StaticLibrary: - case build_tools::ProjectType::Target::SharedCodeTarget: - case build_tools::ProjectType::Target::AggregateTarget: - case build_tools::ProjectType::Target::VSTPlugIn: - case build_tools::ProjectType::Target::DynamicLibrary: + case Target::StandalonePlugIn: + case Target::GUIApp: + case Target::ConsoleApp: + case Target::StaticLibrary: + case Target::SharedCodeTarget: + case Target::AggregateTarget: + case Target::VSTPlugIn: + case Target::DynamicLibrary: return true; - case build_tools::ProjectType::Target::AAXPlugIn: - case build_tools::ProjectType::Target::RTASPlugIn: - case build_tools::ProjectType::Target::UnityPlugIn: - case build_tools::ProjectType::Target::VST3PlugIn: - case build_tools::ProjectType::Target::AudioUnitPlugIn: - case build_tools::ProjectType::Target::AudioUnitv3PlugIn: - case build_tools::ProjectType::Target::unspecified: + case Target::AAXPlugIn: + case Target::UnityPlugIn: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: + case Target::VST3PlugIn: + case Target::AudioUnitPlugIn: + case Target::AudioUnitv3PlugIn: + case Target::unspecified: default: break; } @@ -823,7 +825,5 @@ OwnedArray targets; - friend class CLionProjectExporter; - JUCE_DECLARE_NON_COPYABLE (CodeBlocksProjectExporter) }; diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -33,8 +33,6 @@ #include "jucer_ProjectExport_Android.h" #include "jucer_ProjectExport_CodeBlocks.h" -#include "jucer_ProjectExport_CLion.h" - #include "../Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h" //============================================================================== @@ -76,7 +74,6 @@ createExporterTypeInfo (export_visualStudio_svg, export_visualStudio_svgSize), createExporterTypeInfo (export_visualStudio_svg, export_visualStudio_svgSize), createExporterTypeInfo (export_visualStudio_svg, export_visualStudio_svgSize), - createExporterTypeInfo (export_visualStudio_svg, export_visualStudio_svgSize), createExporterTypeInfo (export_linux_svg, export_linux_svgSize), @@ -89,9 +86,7 @@ { CodeBlocksProjectExporter::getValueTreeTypeNameLinux(), CodeBlocksProjectExporter::getDisplayNameLinux(), CodeBlocksProjectExporter::getTargetFolderNameLinux(), - createIcon (export_codeBlocks_svg, export_codeBlocks_svgSize) }, - - createExporterTypeInfo (export_clion_svg, export_clion_svgSize) + createIcon (export_codeBlocks_svg, export_codeBlocks_svgSize) } }; return infos; @@ -159,11 +154,9 @@ Tag{}, Tag{}, Tag{}, - Tag{}, Tag{}, Tag{}, - Tag{}, - Tag{}); + Tag{}); } bool ProjectExporter::canProjectBeLaunched (Project* project) @@ -179,7 +172,6 @@ MSVCProjectExporterVC2022::getValueTreeTypeName(), MSVCProjectExporterVC2019::getValueTreeTypeName(), MSVCProjectExporterVC2017::getValueTreeTypeName(), - MSVCProjectExporterVC2015::getValueTreeTypeName(), #endif AndroidProjectExporter::getValueTreeTypeName() }; @@ -259,60 +251,57 @@ //============================================================================== void ProjectExporter::createPropertyEditors (PropertyListBuilder& props) { - if (! isCLion()) + props.add (new TextPropertyComponent (targetLocationValue, "Target Project Folder", 2048, false), + "The location of the folder in which the " + name + " project will be created. " + "This path can be absolute, but it's much more sensible to make it relative to the jucer project directory."); + + if ((shouldBuildTargetType (build_tools::ProjectType::Target::VSTPlugIn) && project.shouldBuildVST()) || (project.isVSTPluginHost() && supportsTargetType (build_tools::ProjectType::Target::VSTPlugIn))) { - props.add (new TextPropertyComponent (targetLocationValue, "Target Project Folder", 2048, false), - "The location of the folder in which the " + name + " project will be created. " - "This path can be absolute, but it's much more sensible to make it relative to the jucer project directory."); + props.add (new FilePathPropertyComponent (vstLegacyPathValueWrapper.getWrappedValueTreePropertyWithDefault(), "VST (Legacy) SDK Folder", true, + getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()), + "If you're building a VST plug-in or host, you can use this field to override the global VST (Legacy) SDK path with a project-specific path. " + "This can be an absolute path, or a path relative to the Projucer project file."); + } - if ((shouldBuildTargetType (build_tools::ProjectType::Target::VSTPlugIn) && project.shouldBuildVST()) || (project.isVSTPluginHost() && supportsTargetType (build_tools::ProjectType::Target::VSTPlugIn))) - { - props.add (new FilePathPropertyComponent (vstLegacyPathValueWrapper.getWrappedValueTreePropertyWithDefault(), "VST (Legacy) SDK Folder", true, - getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()), - "If you're building a VST plug-in or host, you can use this field to override the global VST (Legacy) SDK path with a project-specific path. " - "This can be an absolute path, or a path relative to the Projucer project file."); - } + if (shouldBuildTargetType (build_tools::ProjectType::Target::AAXPlugIn) && project.shouldBuildAAX()) + { + props.add (new FilePathPropertyComponent (aaxPathValueWrapper.getWrappedValueTreePropertyWithDefault(), "AAX SDK Folder", true, + getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()), + "If you're building an AAX plug-in, this must be the folder containing the AAX SDK. This can be an absolute path, or a path relative to the Projucer project file."); + } - if (shouldBuildTargetType (build_tools::ProjectType::Target::AAXPlugIn) && project.shouldBuildAAX()) - { - props.add (new FilePathPropertyComponent (aaxPathValueWrapper.getWrappedValueTreePropertyWithDefault(), "AAX SDK Folder", true, - getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()), - "If you're building an AAX plug-in, this must be the folder containing the AAX SDK. This can be an absolute path, or a path relative to the Projucer project file."); - } + if (project.shouldEnableARA() || project.isARAPluginHost()) + { + props.add (new FilePathPropertyComponent (araPathValueWrapper.getWrappedValueTreePropertyWithDefault(), "ARA SDK Folder", true, + getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()), + "If you're building an ARA enabled plug-in, this must be the folder containing the ARA SDK. This can be an absolute path, or a path relative to the Projucer project file."); + } - if (shouldBuildTargetType (build_tools::ProjectType::Target::RTASPlugIn) && project.shouldBuildRTAS()) - { - props.add (new FilePathPropertyComponent (rtasPathValueWrapper.getWrappedValueTreePropertyWithDefault(), "RTAS SDK Folder", true, - getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()), - "If you're building an RTAS plug-in, this must be the folder containing the RTAS SDK. This can be an absolute path, or a path relative to the Projucer project file."); - } + props.add (new TextPropertyComponent (extraPPDefsValue, "Extra Preprocessor Definitions", 32768, true), + "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, " + "or new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash."); - props.add (new TextPropertyComponent (extraPPDefsValue, "Extra Preprocessor Definitions", 32768, true), - "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, " - "or new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash."); - - props.add (new TextPropertyComponent (extraCompilerFlagsValue, "Extra Compiler Flags", 8192, true), - "Extra command-line flags to be passed to the compiler. This string can contain references to preprocessor definitions in the " - "form ${NAME_OF_DEFINITION}, which will be replaced with their values."); - - for (HashMap::Iterator i (compilerFlagSchemesMap); i.next();) - props.add (new TextPropertyComponent (compilerFlagSchemesMap.getReference (i.getKey()), "Compiler Flags for " + i.getKey().quoted(), 8192, false), - "The exporter-specific compiler flags that will be added to files using this scheme."); - - props.add (new TextPropertyComponent (extraLinkerFlagsValue, "Extra Linker Flags", 8192, true), - "Extra command-line flags to be passed to the linker. You might want to use this for adding additional libraries. " - "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); - - props.add (new TextPropertyComponent (externalLibrariesValue, "External Libraries to Link", 8192, true), - "Additional libraries to link (one per line). You should not add any platform specific decoration to these names. " - "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); - - if (! isVisualStudio()) - props.add (new ChoicePropertyComponent (gnuExtensionsValue, "GNU Compiler Extensions"), - "Enabling this will use the GNU C++ language standard variant for compilation."); + props.add (new TextPropertyComponent (extraCompilerFlagsValue, "Extra Compiler Flags", 8192, true), + "Extra command-line flags to be passed to the compiler. This string can contain references to preprocessor definitions in the " + "form ${NAME_OF_DEFINITION}, which will be replaced with their values."); - createIconProperties (props); - } + for (HashMap::Iterator i (compilerFlagSchemesMap); i.next();) + props.add (new TextPropertyComponent (compilerFlagSchemesMap.getReference (i.getKey()), "Compiler Flags for " + i.getKey().quoted(), 8192, false), + "The exporter-specific compiler flags that will be added to files using this scheme."); + + props.add (new TextPropertyComponent (extraLinkerFlagsValue, "Extra Linker Flags", 8192, true), + "Extra command-line flags to be passed to the linker. You might want to use this for adding additional libraries. " + "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); + + props.add (new TextPropertyComponent (externalLibrariesValue, "External Libraries to Link", 8192, true), + "Additional libraries to link (one per line). You should not add any platform specific decoration to these names. " + "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); + + if (! isVisualStudio()) + props.add (new ChoicePropertyComponent (gnuExtensionsValue, "GNU Compiler Extensions"), + "Enabling this will use the GNU C++ language standard variant for compilation."); + + createIconProperties (props); createExporterProperties (props); @@ -347,7 +336,9 @@ //============================================================================== void ProjectExporter::addSettingsForProjectType (const build_tools::ProjectType& type) { - addVSTPathsIfPluginOrHost(); + addExtraIncludePathsIfPluginOrHost(); + + addARAPathsIfPluginOrHost(); if (type.isAudioPlugin()) addCommonAudioPluginSettings(); @@ -355,25 +346,61 @@ addPlatformSpecificSettingsForProjectType (type); } -void ProjectExporter::addVSTPathsIfPluginOrHost() +void ProjectExporter::addExtraIncludePathsIfPluginOrHost() { - if (((shouldBuildTargetType (build_tools::ProjectType::Target::VSTPlugIn) && project.shouldBuildVST()) || project.isVSTPluginHost()) - || ((shouldBuildTargetType (build_tools::ProjectType::Target::VST3PlugIn) && project.shouldBuildVST3()) || project.isVST3PluginHost())) + using Target = build_tools::ProjectType::Target; + + if (((shouldBuildTargetType (Target::VSTPlugIn) && project.shouldBuildVST()) || project.isVSTPluginHost()) + || ((shouldBuildTargetType (Target::VST3PlugIn) && project.shouldBuildVST3()) || project.isVST3PluginHost())) { addLegacyVSTFolderToPathIfSpecified(); if (! project.isConfigFlagEnabled ("JUCE_CUSTOM_VST3_SDK")) addToExtraSearchPaths (getInternalVST3SDKPath(), 0); } + + const auto lv2BasePath = getModuleFolderRelativeToProject ("juce_audio_processors").getChildFile ("format_types") + .getChildFile ("LV2_SDK"); + + if ((shouldBuildTargetType (Target::LV2PlugIn) && project.shouldBuildLV2()) || project.isLV2PluginHost()) + { + const std::vector paths[] { { "" }, + { "lv2" }, + { "serd" }, + { "sord" }, + { "sord", "src" }, + { "sratom" }, + { "lilv" }, + { "lilv", "src" } }; + + for (const auto& components : paths) + { + const auto appendComponent = [] (const build_tools::RelativePath& f, const char* component) + { + return f.getChildFile (component); + }; + + const auto includePath = std::accumulate (components.begin(), + components.end(), + lv2BasePath, + appendComponent); + + addToExtraSearchPaths (includePath, 0); + } + } +} + +void ProjectExporter::addARAPathsIfPluginOrHost() +{ + if (project.shouldEnableARA() || project.isARAPluginHost()) + addARAFoldersToPath(); } void ProjectExporter::addCommonAudioPluginSettings() { if (shouldBuildTargetType (build_tools::ProjectType::Target::AAXPlugIn)) addAAXFoldersToPath(); - - // Note: RTAS paths are platform-dependent, impl -> addPlatformSpecificSettingsForProjectType - } +} void ProjectExporter::addLegacyVSTFolderToPathIfSpecified() { @@ -404,6 +431,14 @@ } } +void ProjectExporter::addARAFoldersToPath() +{ + const auto araFolder = getARAPathString(); + + if (araFolder.isNotEmpty()) + addToExtraSearchPaths (build_tools::RelativePath (araFolder, build_tools::RelativePath::projectFolder)); +} + //============================================================================== StringPairArray ProjectExporter::getAllPreprocessorDefs (const BuildConfiguration& config, const build_tools::ProjectType::Target::Type targetType) const { @@ -430,16 +465,15 @@ void ProjectExporter::addTargetSpecificPreprocessorDefs (StringPairArray& defs, const build_tools::ProjectType::Target::Type targetType) const { - std::pair targetFlags[] = { - {"JucePlugin_Build_VST", build_tools::ProjectType::Target::VSTPlugIn}, - {"JucePlugin_Build_VST3", build_tools::ProjectType::Target::VST3PlugIn}, - {"JucePlugin_Build_AU", build_tools::ProjectType::Target::AudioUnitPlugIn}, - {"JucePlugin_Build_AUv3", build_tools::ProjectType::Target::AudioUnitv3PlugIn}, - {"JucePlugin_Build_RTAS", build_tools::ProjectType::Target::RTASPlugIn}, - {"JucePlugin_Build_AAX", build_tools::ProjectType::Target::AAXPlugIn}, - {"JucePlugin_Build_Standalone", build_tools::ProjectType::Target::StandalonePlugIn}, - {"JucePlugin_Build_Unity", build_tools::ProjectType::Target::UnityPlugIn} - }; + using Target = build_tools::ProjectType::Target::Type; + const std::pair targetFlags[] { { "JucePlugin_Build_VST", Target::VSTPlugIn }, + { "JucePlugin_Build_VST3", Target::VST3PlugIn }, + { "JucePlugin_Build_AU", Target::AudioUnitPlugIn }, + { "JucePlugin_Build_AUv3", Target::AudioUnitv3PlugIn }, + { "JucePlugin_Build_AAX", Target::AAXPlugIn }, + { "JucePlugin_Build_Standalone", Target::StandalonePlugIn }, + { "JucePlugin_Build_Unity", Target::UnityPlugIn }, + { "JucePlugin_Build_LV2", Target::LV2PlugIn } }; if (targetType == build_tools::ProjectType::Target::SharedCodeTarget) { @@ -453,6 +487,10 @@ for (auto& flag : targetFlags) defs.set (flag.first, (targetType == flag.second ? "1" : "0")); } + if (project.shouldEnableARA()) + { + defs.set ("JucePlugin_Enable_ARA", "1"); + } } void ProjectExporter::addDefaultPreprocessorDefs (StringPairArray& defs) const @@ -603,7 +641,7 @@ if (isWindows()) targetOS = TargetOS::windows; else if (isOSX() || isiOS()) targetOS = TargetOS::osx; else if (isLinux()) targetOS = TargetOS::linux; - else if (isAndroid() || isCLion()) targetOS = TargetOS::getThisOS(); + else if (isAndroid()) targetOS = TargetOS::getThisOS(); return targetOS; } @@ -862,17 +900,21 @@ llvmFlags.common.addArray ({ "-Wshorten-64-to-32", "-Wconversion", "-Wint-conversion", "-Wconditional-uninitialized", "-Wconstant-conversion", "-Wbool-conversion", - "-Wextra-semi", "-Wshift-sign-overflow", "-Wno-missing-field-initializers", - "-Wshadow-all", "-Wnullable-to-nonnull-conversion" + "-Wextra-semi", "-Wshift-sign-overflow", + "-Wshadow-all", "-Wnullable-to-nonnull-conversion", + "-Wmissing-prototypes" }); llvmFlags.cpp.addArray ({ "-Wunused-private-field", "-Winconsistent-missing-destructor-override" }); + llvmFlags.objc.addArray ({ + "-Wunguarded-availability", "-Wunguarded-availability-new" + }); auto& gccFlags = recommendedCompilerWarningFlags[CompilerNames::gcc] = BuildConfiguration::CompilerWarningFlags::getRecommendedForGCCAndLLVM(); gccFlags.common.addArray ({ "-Wextra", "-Wsign-compare", "-Wno-implicit-fallthrough", "-Wno-maybe-uninitialized", - "-Wno-missing-field-initializers", "-Wredundant-decls", "-Wno-strict-overflow", + "-Wredundant-decls", "-Wno-strict-overflow", "-Wshadow" }); } diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -80,7 +80,6 @@ virtual bool isCodeBlocks() const = 0; virtual bool isMakefile() const = 0; virtual bool isAndroidStudio() const = 0; - virtual bool isCLion() const = 0; // operating system targeted by exporter virtual bool isAndroid() const = 0; @@ -151,7 +150,7 @@ String getVSTLegacyPathString() const { return vstLegacyPathValueWrapper.getCurrentValue(); } String getAAXPathString() const { return aaxPathValueWrapper.getCurrentValue(); } - String getRTASPathString() const { return rtasPathValueWrapper.getCurrentValue(); } + String getARAPathString() const { return araPathValueWrapper.getCurrentValue(); } // NB: this is the path to the parent "modules" folder that contains the named module, not the // module folder itself. @@ -188,6 +187,13 @@ void createPropertyEditors (PropertyListBuilder&); void addSettingsForProjectType (const build_tools::ProjectType&); + build_tools::RelativePath getLV2TurtleDumpProgramSource() const + { + return getModuleFolderRelativeToProject ("juce_audio_plugin_client") + .getChildFile ("LV2") + .getChildFile ("juce_LV2TurtleDumpProgram.cpp"); + } + //============================================================================== void copyMainGroupFromProject(); Array& getAllGroups() noexcept { jassert (itemGroups.size() > 0); return itemGroups; } @@ -289,8 +295,7 @@ return result; } - StringArray common; - StringArray cpp; + StringArray common, cpp, objc; }; CompilerWarningFlags getRecommendedCompilerWarningFlags() const; @@ -407,7 +412,7 @@ const File projectFolder; //============================================================================== - ValueTreePropertyWithDefaultWrapper vstLegacyPathValueWrapper, rtasPathValueWrapper, aaxPathValueWrapper; + ValueTreePropertyWithDefaultWrapper vstLegacyPathValueWrapper, aaxPathValueWrapper, araPathValueWrapper; ValueTreePropertyWithDefault targetLocationValue, extraCompilerFlagsValue, extraLinkerFlagsValue, externalLibrariesValue, userNotesValue, gnuExtensionsValue, bigIconValue, smallIconValue, extraPPDefsValue; @@ -467,13 +472,14 @@ : name + suffix; } - void createDependencyPathProperties (PropertyListBuilder&); void createIconProperties (PropertyListBuilder&); - void addVSTPathsIfPluginOrHost(); + void addExtraIncludePathsIfPluginOrHost(); + void addARAPathsIfPluginOrHost(); void addCommonAudioPluginSettings(); void addLegacyVSTFolderToPathIfSpecified(); build_tools::RelativePath getInternalVST3SDKPath(); void addAAXFoldersToPath(); + void addARAFoldersToPath(); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjectExporter) }; diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -40,6 +40,7 @@ pluginBinaryCopyStepValue (config, Ids::enablePluginBinaryCopyStep, getUndoManager(), true), vstBinaryLocation (config, Ids::vstBinaryLocation, getUndoManager(), "$(HOME)/.vst"), vst3BinaryLocation (config, Ids::vst3BinaryLocation, getUndoManager(), "$(HOME)/.vst3"), + lv2BinaryLocation (config, Ids::lv2BinaryLocation, getUndoManager(), "$(HOME)/.lv2"), unityPluginBinaryLocation (config, Ids::unityPluginBinaryLocation, getUndoManager(), "$(HOME)/UnityPlugins") { linkTimeOptimisationValue.setDefault (false); @@ -57,7 +58,7 @@ "Specifies the 32/64-bit architecture to use. If you don't see the required architecture in this list, you can also specify the desired " "flag on the command-line when invoking make by passing \"TARGET_ARCH=-march=\""); - auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildUnityPlugin()); + auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildUnityPlugin() || project.shouldBuildLV2()); if (isBuildingAnyPlugins) { @@ -69,6 +70,11 @@ 1024, false), "The folder in which the compiled VST3 binary should be placed."); + if (project.shouldBuildLV2()) + props.add (new TextPropertyComponentWithEnablement (lv2BinaryLocation, pluginBinaryCopyStepValue, "LV2 Binary Location", + 1024, false), + "The folder in which the compiled LV2 binary should be placed."); + if (project.shouldBuildUnityPlugin()) props.add (new TextPropertyComponentWithEnablement (unityPluginBinaryLocation, pluginBinaryCopyStepValue, "Unity Binary Location", 1024, false), @@ -103,12 +109,13 @@ bool isPluginBinaryCopyStepEnabled() const { return pluginBinaryCopyStepValue.get(); } String getVSTBinaryLocationString() const { return vstBinaryLocation.get(); } String getVST3BinaryLocationString() const { return vst3BinaryLocation.get(); } + String getLV2BinaryLocationString() const { return lv2BinaryLocation.get(); } String getUnityPluginBinaryLocationString() const { return unityPluginBinaryLocation.get(); } private: //============================================================================== ValueTreePropertyWithDefault architectureTypeValue, pluginBinaryCopyStepValue, - vstBinaryLocation, vst3BinaryLocation, unityPluginBinaryLocation; + vstBinaryLocation, vst3BinaryLocation, lv2BinaryLocation, unityPluginBinaryLocation; }; BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override @@ -209,10 +216,20 @@ s.add ("JUCE_UNITYDIR := Unity"); targetName = "$(JUCE_UNITYDIR)/" + targetName; } + else if (type == LV2PlugIn) + { + s.add ("JUCE_LV2DIR := " + targetName + ".lv2"); + targetName = "$(JUCE_LV2DIR)/" + targetName + ".so"; + } + else if (type == LV2TurtleProgram) + { + targetName = Project::getLV2FileWriterName(); + } s.add ("JUCE_TARGET_" + getTargetVarName() + String (" := ") + escapeQuotesAndSpaces (targetName)); - if (config.isPluginBinaryCopyStepEnabled() && (type == VST3PlugIn || type == VSTPlugIn || type == UnityPlugIn)) + if (config.isPluginBinaryCopyStepEnabled() + && (type == VST3PlugIn || type == VSTPlugIn || type == UnityPlugIn || type == LV2PlugIn)) { String copyCmd ("JUCE_COPYCMD_" + getTargetVarName() + String (" := $(JUCE_OUTDIR)/")); @@ -231,6 +248,12 @@ s.add ("JUCE_UNITYDESTDIR := " + config.getUnityPluginBinaryLocationString()); s.add (copyCmd + "$(JUCE_UNITYDIR)/. $(JUCE_UNITYDESTDIR)"); } + else if (type == LV2PlugIn) + { + s.add ("JUCE_LV2DESTDIR := " + config.getLV2BinaryLocationString()); + s.add ("JUCE_LV2_FULL_PATH := $(JUCE_OUTDIR)/$(JUCE_TARGET_LV2_PLUGIN)"); + s.add (copyCmd + "$(JUCE_LV2DIR) $(JUCE_LV2DESTDIR)"); + } } return s; @@ -289,6 +312,9 @@ String getPhonyName() const { + if (type == LV2TurtleProgram) + return "LV2_MANIFEST_HELPER"; + return String (getName()).upToFirstOccurrenceOf (" ", false, false); } @@ -302,12 +328,15 @@ if (type != SharedCodeTarget && owner.shouldBuildTargetType (SharedCodeTarget)) out << " $(JUCE_OUTDIR)/$(JUCE_TARGET_SHARED_CODE)"; + if (type == LV2PlugIn) + out << " $(JUCE_OUTDIR)/$(JUCE_TARGET_LV2_MANIFEST_HELPER)"; + out << newLine; if (! packages.isEmpty()) { - out << "\t@command -v pkg-config >/dev/null 2>&1 || { echo >&2 \"pkg-config not installed. Please, install it.\"; exit 1; }" << newLine - << "\t@pkg-config --print-errors"; + out << "\t@command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 \"pkg-config not installed. Please, install it.\"; exit 1; }" << newLine + << "\t@$(PKG_CONFIG) --print-errors"; for (auto& pkg : packages) out << " " << pkg; @@ -324,6 +353,8 @@ out << "\t-$(V_AT)mkdir -p $(JUCE_OUTDIR)/$(JUCE_VST3DIR)/$(JUCE_VST3SUBDIR)" << newLine; else if (type == UnityPlugIn) out << "\t-$(V_AT)mkdir -p $(JUCE_OUTDIR)/$(JUCE_UNITYDIR)" << newLine; + else if (type == LV2PlugIn) + out << "\t-$(V_AT)mkdir -p $(JUCE_OUTDIR)/$(JUCE_LV2DIR)" << newLine; if (owner.projectType.isStaticLibrary() || type == SharedCodeTarget) { @@ -369,6 +400,13 @@ << "\t-$(V_AT)mkdir -p $(JUCE_UNITYDESTDIR)" << newLine << "\t-$(V_AT)cp -R $(JUCE_COPYCMD_UNITY_PLUGIN)" << newLine; } + else if (type == LV2PlugIn) + { + out << "\t$(V_AT) $(JUCE_OUTDIR)/$(JUCE_TARGET_LV2_MANIFEST_HELPER) " + "$(abspath $(JUCE_LV2_FULL_PATH))" << newLine + << "\t-$(V_AT)mkdir -p $(JUCE_LV2DESTDIR)" << newLine + << "\t-$(V_AT)cp -R $(JUCE_COPYCMD_LV2_PLUGIN)" << newLine; + } out << newLine; } @@ -412,7 +450,6 @@ bool isCodeBlocks() const override { return false; } bool isMakefile() const override { return true; } bool isAndroidStudio() const override { return false; } - bool isCLion() const override { return false; } bool isAndroid() const override { return false; } bool isWindows() const override { return false; } @@ -424,24 +461,27 @@ bool supportsTargetType (build_tools::ProjectType::Target::Type type) const override { + using Target = build_tools::ProjectType::Target; + switch (type) { - case build_tools::ProjectType::Target::GUIApp: - case build_tools::ProjectType::Target::ConsoleApp: - case build_tools::ProjectType::Target::StaticLibrary: - case build_tools::ProjectType::Target::SharedCodeTarget: - case build_tools::ProjectType::Target::AggregateTarget: - case build_tools::ProjectType::Target::VSTPlugIn: - case build_tools::ProjectType::Target::VST3PlugIn: - case build_tools::ProjectType::Target::StandalonePlugIn: - case build_tools::ProjectType::Target::DynamicLibrary: - case build_tools::ProjectType::Target::UnityPlugIn: + case Target::GUIApp: + case Target::ConsoleApp: + case Target::StaticLibrary: + case Target::SharedCodeTarget: + case Target::AggregateTarget: + case Target::VSTPlugIn: + case Target::VST3PlugIn: + case Target::StandalonePlugIn: + case Target::DynamicLibrary: + case Target::UnityPlugIn: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: return true; - case build_tools::ProjectType::Target::AAXPlugIn: - case build_tools::ProjectType::Target::RTASPlugIn: - case build_tools::ProjectType::Target::AudioUnitPlugIn: - case build_tools::ProjectType::Target::AudioUnitv3PlugIn: - case build_tools::ProjectType::Target::unspecified: + case Target::AAXPlugIn: + case Target::AudioUnitPlugIn: + case Target::AudioUnitv3PlugIn: + case Target::unspecified: default: break; } @@ -562,7 +602,7 @@ auto compilePackages = getCompilePackages(); if (compilePackages.size() > 0) - return "$(shell pkg-config --cflags " + compilePackages.joinIntoString (" ") + ")"; + return "$(shell $(PKG_CONFIG) --cflags " + compilePackages.joinIntoString (" ") + ")"; return {}; } @@ -572,7 +612,7 @@ auto linkPackages = getLinkPackages(); if (linkPackages.size() > 0) - return "$(shell pkg-config --libs " + linkPackages.joinIntoString (" ") + ")"; + return "$(shell $(PKG_CONFIG) --libs " + linkPackages.joinIntoString (" ") + ")"; return {}; } @@ -935,6 +975,11 @@ << "DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD)" << newLine << newLine; + out << "ifndef PKG_CONFIG" << newLine + << " PKG_CONFIG=pkg-config" << newLine + << "endif" << newLine + << newLine; + out << "ifndef STRIP" << newLine << " STRIP=strip" << newLine << "endif" << newLine @@ -963,9 +1008,9 @@ writeCompilerFlagSchemes (out, filesToCompile); - auto getFilesForTarget = [] (const Array>& files, - MakefileTarget* target, - const Project& p) -> Array> + auto getFilesForTarget = [this] (const Array>& files, + MakefileTarget* target, + const Project& p) -> Array> { Array> targetFiles; @@ -975,6 +1020,9 @@ if (p.getTargetTypeFromFilePath (f.first, true) == targetType) targetFiles.add (f); + if (targetType == MakefileTarget::LV2TurtleProgram) + targetFiles.add ({ project.resolveFilename (getLV2TurtleDumpProgramSource().toUnixStyle()), {} }); + return targetFiles; }; @@ -1032,8 +1080,6 @@ return phonyTargetLine.toString(); } - friend class CLionProjectExporter; - OwnedArray targets; JUCE_DECLARE_NON_COPYABLE (MakefileProjectExporter) diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -34,6 +34,14 @@ return str; } +inline StringArray msBuildEscape (StringArray range) +{ + for (auto& i : range) + i = msBuildEscape (i); + + return range; +} + //============================================================================== class MSVCProjectExporterBase : public ProjectExporter { @@ -131,8 +139,8 @@ aaxPathValueWrapper.init ({ settings, Ids::aaxFolder, nullptr }, getAppSettings().getStoredPath (Ids::aaxPath, TargetOS::windows), TargetOS::windows); - rtasPathValueWrapper.init ({ settings, Ids::rtasFolder, nullptr }, - getAppSettings().getStoredPath (Ids::rtasPath, TargetOS::windows), TargetOS::windows); + araPathValueWrapper.init ({ settings, Ids::araFolder, nullptr }, + getAppSettings().getStoredPath (Ids::araPath, TargetOS::windows), TargetOS::windows); } //============================================================================== @@ -159,8 +167,8 @@ pluginBinaryCopyStepValue (config, Ids::enablePluginBinaryCopyStep, getUndoManager(), false), vstBinaryLocation (config, Ids::vstBinaryLocation, getUndoManager()), vst3BinaryLocation (config, Ids::vst3BinaryLocation, getUndoManager()), - rtasBinaryLocation (config, Ids::rtasBinaryLocation, getUndoManager()), aaxBinaryLocation (config, Ids::aaxBinaryLocation, getUndoManager()), + lv2BinaryLocation (config, Ids::aaxBinaryLocation, getUndoManager()), unityPluginBinaryLocation (config, Ids::unityPluginBinaryLocation, getUndoManager(), {}) { setPluginBinaryCopyLocationDefaults(); @@ -178,8 +186,8 @@ String getPostbuildCommandString() const { return postbuildCommandValue.get(); } String getVSTBinaryLocationString() const { return vstBinaryLocation.get(); } String getVST3BinaryLocationString() const { return vst3BinaryLocation.get(); } - String getRTASBinaryLocationString() const { return rtasBinaryLocation.get();} String getAAXBinaryLocationString() const { return aaxBinaryLocation.get();} + String getLV2BinaryLocationString() const { return lv2BinaryLocation.get();} String getUnityPluginBinaryLocationString() const { return unityPluginBinaryLocation.get(); } String getIntermediatesPathString() const { return intermediatesPathValue.get(); } String getCharacterSetString() const { return characterSetValue.get(); } @@ -203,8 +211,16 @@ return getName() + "|" + (is64Bit() ? "x64" : "Win32"); } - String getOutputFilename (const String& suffix, bool forceSuffix, bool forceUnityPrefix) const + String getOutputFilename (const String& suffix, + bool forceSuffix, + build_tools::ProjectType::Target::Type type) const { + using Target = build_tools::ProjectType::Target::Type; + + if (type == Target::LV2TurtleProgram) + return Project::getLV2FileWriterName() + suffix; + + const auto forceUnityPrefix = type == Target::UnityPlugIn; auto target = File::createLegalFileName (getTargetBinaryNameString (forceUnityPrefix).trim()); if (forceSuffix || ! target.containsChar ('.')) @@ -315,14 +331,14 @@ intermediatesPathValue, characterSetValue, architectureTypeValue, fastMathValue, debugInformationFormatValue, pluginBinaryCopyStepValue; - ValueTreePropertyWithDefault vstBinaryLocation, vst3BinaryLocation, rtasBinaryLocation, aaxBinaryLocation, unityPluginBinaryLocation; + ValueTreePropertyWithDefault vstBinaryLocation, vst3BinaryLocation, aaxBinaryLocation, lv2BinaryLocation, unityPluginBinaryLocation; Value architectureValueToListenTo; //============================================================================== void addVisualStudioPluginInstallPathProperties (PropertyListBuilder& props) { - auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildRTAS() + auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildAAX() || project.shouldBuildUnityPlugin()); if (isBuildingAnyPlugins) @@ -334,16 +350,16 @@ 1024, false), "The folder in which the compiled VST3 binary should be placed."); - if (project.shouldBuildRTAS()) - props.add (new TextPropertyComponentWithEnablement (rtasBinaryLocation, pluginBinaryCopyStepValue, "RTAS Binary Location", - 1024, false), - "The folder in which the compiled RTAS binary should be placed."); - if (project.shouldBuildAAX()) props.add (new TextPropertyComponentWithEnablement (aaxBinaryLocation, pluginBinaryCopyStepValue, "AAX Binary Location", 1024, false), "The folder in which the compiled AAX binary should be placed."); + if (project.shouldBuildLV2()) + props.add (new TextPropertyComponentWithEnablement (lv2BinaryLocation, pluginBinaryCopyStepValue, "LV2 Binary Location", + 1024, false), + "The folder in which the compiled LV2 binary should be placed."); + if (project.shouldBuildUnityPlugin()) props.add (new TextPropertyComponentWithEnablement (unityPluginBinaryLocation, pluginBinaryCopyStepValue, "Unity Binary Location", 1024, false), @@ -364,8 +380,8 @@ : "%CommonProgramFiles(x86)%"; vst3BinaryLocation.setDefault (prefix + String ("\\VST3")); - rtasBinaryLocation.setDefault (prefix + String ("\\Digidesign\\DAE\\Plug-Ins")); aaxBinaryLocation.setDefault (prefix + String ("\\Avid\\Audio\\Plug-Ins")); + lv2BinaryLocation.setDefault ("%APPDATA%\\LV2"); } void valueChanged (Value&) override @@ -509,11 +525,10 @@ intdir->addTextElement (build_tools::windowsStylePath (intermediatesPath)); } - { auto* targetName = props->createNewChildElement ("TargetName"); setConditionAttribute (*targetName, config); - targetName->addTextElement (msBuildEscape (config.getOutputFilename ("", false, type == UnityPlugIn))); + targetName->addTextElement (msBuildEscape (config.getOutputFilename ("", false, type))); } { @@ -539,6 +554,22 @@ { auto& config = dynamic_cast (*i); + enum class EscapeQuotes { no, yes }; + + // VS doesn't correctly escape double quotes in preprocessor definitions, so we have + // to add our own layer of escapes + const auto addIncludePathsAndPreprocessorDefinitions = [this, &config] (XmlElement& xml, EscapeQuotes escapeQuotes) + { + auto includePaths = getOwner().getHeaderSearchPaths (config); + includePaths.add ("%(AdditionalIncludeDirectories)"); + xml.createNewChildElement ("AdditionalIncludeDirectories")->addTextElement (includePaths.joinIntoString (";")); + + const auto preprocessorDefs = getPreprocessorDefs (config, ";") + ";%(PreprocessorDefinitions)"; + const auto preprocessorDefsEscaped = escapeQuotes == EscapeQuotes::yes ? preprocessorDefs.replace ("\"", "\\\"") + : preprocessorDefs; + xml.createNewChildElement ("PreprocessorDefinitions")->addTextElement (preprocessorDefsEscaped); + }; + bool isDebug = config.isDebug(); auto* group = projectXml.createNewChildElement ("ItemDefinitionGroup"); @@ -555,7 +586,7 @@ } bool isUsingEditAndContinue = false; - const auto pdbFilename = getOwner().getIntDirFile (config, config.getOutputFilename (".pdb", true, type == UnityPlugIn)); + const auto pdbFilename = getOwner().getIntDirFile (config, config.getOutputFilename (".pdb", true, type)); { auto* cl = group->createNewChildElement ("ClCompile"); @@ -565,15 +596,10 @@ if (isDebug || config.shouldGenerateDebugSymbols()) { cl->createNewChildElement ("DebugInformationFormat") - ->addTextElement (config.getDebugInformationFormatString()); + ->addTextElement (config.getDebugInformationFormatString()); } - auto includePaths = getOwner().getHeaderSearchPaths (config); - includePaths.addArray (getExtraSearchPaths()); - includePaths.add ("%(AdditionalIncludeDirectories)"); - - cl->createNewChildElement ("AdditionalIncludeDirectories")->addTextElement (includePaths.joinIntoString (";")); - cl->createNewChildElement ("PreprocessorDefinitions")->addTextElement (getPreprocessorDefs (config, ";") + ";%(PreprocessorDefinitions)"); + addIncludePathsAndPreprocessorDefinitions (*cl, EscapeQuotes::no); cl->createNewChildElement ("RuntimeLibrary")->addTextElement (config.isUsingRuntimeLibDLL() ? (isDebug ? "MultiThreadedDebugDLL" : "MultiThreadedDLL") : (isDebug ? "MultiThreadedDebug" : "MultiThreaded")); @@ -602,29 +628,28 @@ { auto* res = group->createNewChildElement ("ResourceCompile"); - res->createNewChildElement ("PreprocessorDefinitions")->addTextElement (isDebug ? "_DEBUG;%(PreprocessorDefinitions)" - : "NDEBUG;%(PreprocessorDefinitions)"); + addIncludePathsAndPreprocessorDefinitions (*res, EscapeQuotes::yes); } auto externalLibraries = getExternalLibraries (config, getOwner().getExternalLibrariesStringArray()); - auto additionalDependencies = type != SharedCodeTarget && ! externalLibraries.isEmpty() + auto additionalDependencies = type != SharedCodeTarget && type != LV2TurtleProgram && ! externalLibraries.isEmpty() ? externalLibraries.joinIntoString (";") + ";%(AdditionalDependencies)" : String(); auto librarySearchPaths = config.getLibrarySearchPaths(); - auto additionalLibraryDirs = type != SharedCodeTarget && librarySearchPaths.size() > 0 + auto additionalLibraryDirs = type != SharedCodeTarget && type != LV2TurtleProgram && librarySearchPaths.size() > 0 ? getOwner().replacePreprocessorTokens (config, librarySearchPaths.joinIntoString (";")) + ";%(AdditionalLibraryDirectories)" : String(); { auto* link = group->createNewChildElement ("Link"); - link->createNewChildElement ("OutputFile")->addTextElement (getOutputFilePath (config, type == UnityPlugIn)); + link->createNewChildElement ("OutputFile")->addTextElement (getOutputFilePath (config)); link->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true"); link->createNewChildElement ("IgnoreSpecificDefaultLibraries")->addTextElement (isDebug ? "libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries)" : "%(IgnoreSpecificDefaultLibraries)"); link->createNewChildElement ("GenerateDebugInformation")->addTextElement ((isDebug || config.shouldGenerateDebugSymbols()) ? "true" : "false"); link->createNewChildElement ("ProgramDatabaseFile")->addTextElement (pdbFilename); - link->createNewChildElement ("SubSystem")->addTextElement (type == ConsoleApp ? "Console" : "Windows"); + link->createNewChildElement ("SubSystem")->addTextElement (type == ConsoleApp || type == LV2TurtleProgram ? "Console" : "Windows"); if (! config.is64Bit()) link->createNewChildElement ("TargetMachine")->addTextElement ("MachineX86"); @@ -654,7 +679,7 @@ link->createNewChildElement ("AdditionalOptions")->addTextElement (getOwner().replacePreprocessorTokens (config, extraLinkerOptions).trim() + " %(AdditionalOptions)"); - auto delayLoadedDLLs = getDelayLoadedDLLs(); + auto delayLoadedDLLs = getOwner().msvcDelayLoadedDLLs; if (delayLoadedDLLs.isNotEmpty()) link->createNewChildElement ("DelayLoadDLLs")->addTextElement (delayLoadedDLLs); @@ -667,10 +692,10 @@ { auto* bsc = group->createNewChildElement ("Bscmake"); bsc->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true"); - bsc->createNewChildElement ("OutputFile")->addTextElement (getOwner().getIntDirFile (config, config.getOutputFilename (".bsc", true, type == UnityPlugIn))); + bsc->createNewChildElement ("OutputFile")->addTextElement (getOwner().getIntDirFile (config, config.getOutputFilename (".bsc", true, type))); } - if (type != SharedCodeTarget) + if (type != SharedCodeTarget && type != LV2TurtleProgram) { auto* lib = group->createNewChildElement ("Lib"); @@ -725,6 +750,12 @@ if (group.getNumChildren() > 0) addFilesToCompile (group, *cppFiles, *headerFiles, *otherFilesGroup); } + + if (type == LV2TurtleProgram) + { + cppFiles->createNewChildElement ("ClCompile") + ->setAttribute ("Include", owner.getLV2TurtleDumpProgramSource().toWindowsStyle()); + } } if (getOwner().iconFile.existsAsFile()) @@ -855,9 +886,6 @@ auto* e = cpps.createNewChildElement ("ClCompile"); e->setAttribute ("Include", path.toWindowsStyle()); - if (shouldUseStdCall (path)) - e->createNewChildElement ("CallingConvention")->addTextElement ("StdCall"); - if (projectItem.shouldBeCompiled()) { auto extraCompilerFlags = owner.compilerFlagSchemesMap[projectItem.getCompilerFlagSchemeString()].get().toString(); @@ -1055,8 +1083,12 @@ String getConfigTargetPath (const BuildConfiguration& config) const { - auto solutionTargetFolder = getSolutionTargetPath (config); - return solutionTargetFolder + "\\" + getName(); + const auto result = getSolutionTargetPath (config) + "\\" + getName(); + + if (type == LV2PlugIn) + return result + "\\" + config.getTargetBinaryNameString() + ".lv2"; + + return result; } String getIntermediatesPath (const MSVCBuildConfiguration& config) const @@ -1093,7 +1125,6 @@ { if (type == VST3PlugIn) return ".vst3"; if (type == AAXPlugIn) return ".aaxdll"; - if (type == RTASPlugIn) return ".dpm"; return ".dll"; } @@ -1101,13 +1132,6 @@ return {}; } - XmlElement* createToolElement (XmlElement& parent, const String& toolName) const - { - auto* e = parent.createNewChildElement ("Tool"); - e->setAttribute ("Name", toolName); - return e; - } - String getPreprocessorDefs (const BuildConfiguration& config, const String& joinString) const { auto defines = getOwner().msvcExtraPreprocessorDefs; @@ -1168,13 +1192,13 @@ build_tools::RelativePath bundleScript = aaxSDK.getChildFile ("Utilities").getChildFile ("CreatePackage.bat"); build_tools::RelativePath iconFilePath = getAAXIconFile(); - auto outputFilename = config.getOutputFilename (".aaxplugin", true, false); + auto outputFilename = config.getOutputFilename (".aaxplugin", true, type); auto bundleDir = getOwner().getOutDirFile (config, outputFilename); auto bundleContents = bundleDir + "\\Contents"; auto archDir = bundleContents + String ("\\") + (config.is64Bit() ? "x64" : "Win32"); auto executablePath = archDir + String ("\\") + outputFilename; - auto pkgScript = String ("copy /Y ") + getOutputFilePath (config, false).quoted() + String (" ") + executablePath.quoted() + String ("\r\ncall ") + auto pkgScript = String ("copy /Y ") + getOutputFilePath (config).quoted() + String (" ") + executablePath.quoted() + String ("\r\ncall ") + createRebasedPath (bundleScript) + String (" ") + archDir.quoted() + String (" ") + createRebasedPath (iconFilePath); if (config.isPluginBinaryCopyStepEnabled()) @@ -1183,11 +1207,12 @@ return pkgScript; } - else if (type == UnityPlugIn) + + if (type == UnityPlugIn) { build_tools::RelativePath scriptPath (config.project.getGeneratedCodeFolder().getChildFile (config.project.getUnityScriptName()), - getOwner().getTargetFolder(), - build_tools::RelativePath::projectFolder); + getOwner().getTargetFolder(), + build_tools::RelativePath::projectFolder); auto pkgScript = String ("copy /Y ") + scriptPath.toWindowsStyle().quoted() + " \"$(OutDir)\""; @@ -1201,13 +1226,40 @@ return pkgScript; } - else if (config.isPluginBinaryCopyStepEnabled()) + + if (type == LV2PlugIn) + { + const auto* writerTarget = [&]() -> MSVCTargetBase* + { + for (auto* target : owner.targets) + if (target->type == LV2TurtleProgram) + return target; + + return nullptr; + }(); + + const auto writer = writerTarget->getConfigTargetPath (config) + + "\\" + + writerTarget->getBinaryNameWithSuffix (config); + + const auto copyScript = [&]() -> String + { + if (! config.isPluginBinaryCopyStepEnabled()) + return ""; + + return "xcopy /E /H /I /K /R /Y \"$(OutDir)\" \"" + config.getLV2BinaryLocationString() + + '\\' + config.getTargetBinaryNameString() + ".lv2\"\r\n"; + }(); + + return writer.quoted() + " \"$(OutDir)$(TargetFileName)\"\r\n" + copyScript; + } + + if (config.isPluginBinaryCopyStepEnabled()) { auto copyScript = String ("copy /Y \"$(OutDir)$(TargetFileName)\"") + String (" \"$COPYDIR$\\$(TargetFileName)\""); if (type == VSTPlugIn) return copyScript.replace ("$COPYDIR$", config.getVSTBinaryLocationString()); if (type == VST3PlugIn) return copyScript.replace ("$COPYDIR$", config.getVST3BinaryLocationString()); - if (type == RTASPlugIn) return copyScript.replace ("$COPYDIR$", config.getRTASBinaryLocationString()); } return {}; @@ -1219,7 +1271,7 @@ { String script; - auto bundleDir = getOwner().getOutDirFile (config, config.getOutputFilename (".aaxplugin", false, false)); + auto bundleDir = getOwner().getOutDirFile (config, config.getOutputFilename (".aaxplugin", false, type)); auto bundleContents = bundleDir + "\\Contents"; auto archDir = bundleContents + String ("\\") + (config.is64Bit() ? "x64" : "Win32"); @@ -1255,113 +1307,50 @@ auto aaxLibsFolder = build_tools::RelativePath (owner.getAAXPathString(), build_tools::RelativePath::projectFolder).getChildFile ("Libs"); defines.set ("JucePlugin_AAXLibs_path", createRebasedPath (aaxLibsFolder)); } - else if (type == RTASPlugIn) - { - build_tools::RelativePath rtasFolder (owner.getRTASPathString(), build_tools::RelativePath::projectFolder); - defines.set ("JucePlugin_WinBag_path", createRebasedPath (rtasFolder.getChildFile ("WinBag"))); - } - } - - String getExtraLinkerFlags() const - { - if (type == RTASPlugIn) - return "/FORCE:multiple"; - - return {}; - } - - StringArray getExtraSearchPaths() const - { - StringArray searchPaths; - if (type == RTASPlugIn) - { - build_tools::RelativePath rtasFolder (owner.getRTASPathString(), build_tools::RelativePath::projectFolder); - - static const char* p[] = { "AlturaPorts/TDMPlugins/PluginLibrary/EffectClasses", - "AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses", - "AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses/Interfaces", - "AlturaPorts/TDMPlugins/PluginLibrary/Utilities", - "AlturaPorts/TDMPlugins/PluginLibrary/RTASP_Adapt", - "AlturaPorts/TDMPlugins/PluginLibrary/CoreClasses", - "AlturaPorts/TDMPlugins/PluginLibrary/Controls", - "AlturaPorts/TDMPlugins/PluginLibrary/Meters", - "AlturaPorts/TDMPlugins/PluginLibrary/ViewClasses", - "AlturaPorts/TDMPlugins/PluginLibrary/DSPClasses", - "AlturaPorts/TDMPlugins/PluginLibrary/Interfaces", - "AlturaPorts/TDMPlugins/common", - "AlturaPorts/TDMPlugins/common/Platform", - "AlturaPorts/TDMPlugins/common/Macros", - "AlturaPorts/TDMPlugins/SignalProcessing/Public", - "AlturaPorts/TDMPlugIns/DSPManager/Interfaces", - "AlturaPorts/SADriver/Interfaces", - "AlturaPorts/DigiPublic/Interfaces", - "AlturaPorts/DigiPublic", - "AlturaPorts/Fic/Interfaces/DAEClient", - "AlturaPorts/NewFileLibs/Cmn", - "AlturaPorts/NewFileLibs/DOA", - "AlturaPorts/AlturaSource/PPC_H", - "AlturaPorts/AlturaSource/AppSupport", - "AvidCode/AVX2sdk/AVX/avx2/avx2sdk/inc", - "xplat/AVX/avx2/avx2sdk/inc" }; - - for (auto* path : p) - searchPaths.add (createRebasedPath (rtasFolder.getChildFile (path))); - } - - return searchPaths; } - String getBinaryNameWithSuffix (const MSVCBuildConfiguration& config, bool forceUnityPrefix) const + String getBinaryNameWithSuffix (const MSVCBuildConfiguration& config) const { - return config.getOutputFilename (getTargetSuffix(), true, forceUnityPrefix); + return config.getOutputFilename (getTargetSuffix(), true, type); } - String getOutputFilePath (const MSVCBuildConfiguration& config, bool forceUnityPrefix) const + String getOutputFilePath (const MSVCBuildConfiguration& config) const { - return getOwner().getOutDirFile (config, getBinaryNameWithSuffix (config, forceUnityPrefix)); + return getOwner().getOutDirFile (config, getBinaryNameWithSuffix (config)); } StringArray getLibrarySearchPaths (const BuildConfiguration& config) const { auto librarySearchPaths = config.getLibrarySearchPaths(); - if (type != SharedCodeTarget) + if (type != SharedCodeTarget && type != LV2TurtleProgram) if (auto* shared = getOwner().getSharedCodeTarget()) librarySearchPaths.add (shared->getConfigTargetPath (config)); return librarySearchPaths; } + /* Libraries specified in the Projucer don't get escaped automatically. + To include a special character in the name of a library, + you must use the appropriate escape code instead. + Module and shared code library names are not preprocessed. + Special characters in the names of these libraries will be toEscape + as appropriate. + */ StringArray getExternalLibraries (const MSVCBuildConfiguration& config, const StringArray& otherLibs) const { - const auto sharedCodeLib = [&]() -> StringArray - { - if (type != SharedCodeTarget) - if (auto* shared = getOwner().getSharedCodeTarget()) - return { shared->getBinaryNameWithSuffix (config, false) }; - - return {}; - }(); - auto result = otherLibs; - result.addArray (getOwner().getModuleLibs()); - result.addArray (sharedCodeLib); for (auto& i : result) - i = msBuildEscape (getOwner().replacePreprocessorTokens (config, i).trim()); + i = getOwner().replacePreprocessorTokens (config, i).trim(); - return result; - } - - String getDelayLoadedDLLs() const - { - auto delayLoadedDLLs = getOwner().msvcDelayLoadedDLLs; + result.addArray (msBuildEscape (getOwner().getModuleLibs())); - if (type == RTASPlugIn) - delayLoadedDLLs += "DAE.dll; DigiExt.dll; DSI.dll; PluginLib.dll; " - "DSPManager.dll; DSPManager.dll; DSPManagerClientLib.dll; RTASClientLib.dll"; + if (type != SharedCodeTarget && type != LV2TurtleProgram) + if (auto* shared = getOwner().getSharedCodeTarget()) + result.add (msBuildEscape (shared->getBinaryNameWithSuffix (config))); - return delayLoadedDLLs; + return result; } String getModuleDefinitions (const MSVCBuildConfiguration& config) const @@ -1371,19 +1360,6 @@ if (moduleDefinitions.isNotEmpty()) return moduleDefinitions; - if (type == RTASPlugIn) - { - auto& exp = getOwner(); - - auto moduleDefPath - = build_tools::RelativePath (exp.getPathForModuleString ("juce_audio_plugin_client"), build_tools::RelativePath::projectFolder) - .getChildFile ("juce_audio_plugin_client").getChildFile ("RTAS").getChildFile ("juce_RTAS_WinExports.def"); - - return prependDot (moduleDefPath.rebased (exp.getProject().getProjectFolder(), - exp.getTargetFolder(), - build_tools::RelativePath::buildTargetFolder).toWindowsStyle()); - } - return {}; } @@ -1424,7 +1400,6 @@ bool isCodeBlocks() const override { return false; } bool isMakefile() const override { return false; } bool isAndroidStudio() const override { return false; } - bool isCLion() const override { return false; } bool isAndroid() const override { return false; } bool isWindows() const override { return true; } @@ -1438,24 +1413,27 @@ bool supportsTargetType (build_tools::ProjectType::Target::Type type) const override { + using Target = build_tools::ProjectType::Target; + switch (type) { - case build_tools::ProjectType::Target::StandalonePlugIn: - case build_tools::ProjectType::Target::GUIApp: - case build_tools::ProjectType::Target::ConsoleApp: - case build_tools::ProjectType::Target::StaticLibrary: - case build_tools::ProjectType::Target::SharedCodeTarget: - case build_tools::ProjectType::Target::AggregateTarget: - case build_tools::ProjectType::Target::VSTPlugIn: - case build_tools::ProjectType::Target::VST3PlugIn: - case build_tools::ProjectType::Target::AAXPlugIn: - case build_tools::ProjectType::Target::RTASPlugIn: - case build_tools::ProjectType::Target::UnityPlugIn: - case build_tools::ProjectType::Target::DynamicLibrary: + case Target::StandalonePlugIn: + case Target::GUIApp: + case Target::ConsoleApp: + case Target::StaticLibrary: + case Target::SharedCodeTarget: + case Target::AggregateTarget: + case Target::VSTPlugIn: + case Target::VST3PlugIn: + case Target::AAXPlugIn: + case Target::UnityPlugIn: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: + case Target::DynamicLibrary: return true; - case build_tools::ProjectType::Target::AudioUnitPlugIn: - case build_tools::ProjectType::Target::AudioUnitv3PlugIn: - case build_tools::ProjectType::Target::unspecified: + case Target::AudioUnitPlugIn: + case Target::AudioUnitv3PlugIn: + case Target::unspecified: default: break; } @@ -1637,14 +1615,11 @@ return getCleanedStringArray (searchPaths); } - String getSharedCodeGuid() const + String getTargetGuid (MSVCTargetBase::Type type) const { - String sharedCodeGuid; - - for (int i = 0; i < targets.size(); ++i) - if (auto* target = targets[i]) - if (target->type == build_tools::ProjectType::Target::SharedCodeTarget) - return target->getProjectGuid(); + for (auto* target : targets) + if (target != nullptr && target->type == type) + return target->getProjectGuid(); return {}; } @@ -1652,7 +1627,8 @@ //============================================================================== void writeProjectDependencies (OutputStream& out) const { - auto sharedCodeGuid = getSharedCodeGuid(); + const auto sharedCodeGuid = getTargetGuid (MSVCTargetBase::SharedCodeTarget); + const auto turtleGuid = getTargetGuid (MSVCTargetBase::LV2TurtleProgram); for (int addingOtherTargets = 0; addingOtherTargets < (sharedCodeGuid.isNotEmpty() ? 2 : 1); ++addingOtherTargets) { @@ -1660,16 +1636,24 @@ { if (auto* target = targets[i]) { - if (sharedCodeGuid.isEmpty() || (addingOtherTargets != 0) == (target->type != build_tools::ProjectType::Target::StandalonePlugIn)) + if (sharedCodeGuid.isEmpty() || (addingOtherTargets != 0) == (target->type != MSVCTargetBase::StandalonePlugIn)) { out << "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"" << projectName << " - " << target->getName() << "\", \"" << target->getVCProjFile().getFileName() << "\", \"" << target->getProjectGuid() << '"' << newLine; - if (sharedCodeGuid.isNotEmpty() && target->type != build_tools::ProjectType::Target::SharedCodeTarget) + if (sharedCodeGuid.isNotEmpty() + && target->type != MSVCTargetBase::SharedCodeTarget + && target->type != MSVCTargetBase::LV2TurtleProgram) + { out << "\tProjectSection(ProjectDependencies) = postProject" << newLine - << "\t\t" << sharedCodeGuid << " = " << sharedCodeGuid << newLine - << "\tEndProjectSection" << newLine; + << "\t\t" << sharedCodeGuid << " = " << sharedCodeGuid << newLine; + + if (target->type == MSVCTargetBase::LV2PlugIn && turtleGuid.isNotEmpty()) + out << "\t\t" << turtleGuid << " = " << turtleGuid << newLine; + + out << "\tEndProjectSection" << newLine; + } out << "EndProject" << newLine; } @@ -1779,14 +1763,12 @@ : (".\\" + filename); } - static bool shouldUseStdCall (const build_tools::RelativePath& path) - { - return path.getFileNameWithoutExtension().startsWithIgnoreCase ("include_juce_audio_plugin_client_RTAS_"); - } - static bool shouldAddBigobjFlag (const build_tools::RelativePath& path) { - return path.getFileNameWithoutExtension().equalsIgnoreCase ("include_juce_gui_basics"); + const auto name = path.getFileNameWithoutExtension(); + + return name.equalsIgnoreCase ("include_juce_gui_basics") + || name.equalsIgnoreCase ("include_juce_audio_processors"); } StringArray getModuleLibs() const @@ -1803,51 +1785,6 @@ }; //============================================================================== -class MSVCProjectExporterVC2015 : public MSVCProjectExporterBase -{ -public: - MSVCProjectExporterVC2015 (Project& p, const ValueTree& t) - : MSVCProjectExporterBase (p, t, getTargetFolderName()) - { - name = getDisplayName(); - - targetPlatformVersion.setDefault (getDefaultWindowsTargetPlatformVersion()); - platformToolsetValue.setDefault (getDefaultToolset()); - } - - static String getDisplayName() { return "Visual Studio 2015"; } - static String getValueTreeTypeName() { return "VS2015"; } - static String getTargetFolderName() { return "VisualStudio2015"; } - - Identifier getExporterIdentifier() const override { return getValueTreeTypeName(); } - - int getVisualStudioVersion() const override { return 14; } - String getSolutionComment() const override { return "# Visual Studio 14"; } - String getToolsVersion() const override { return "14.0"; } - String getDefaultToolset() const override { return "v140"; } - String getDefaultWindowsTargetPlatformVersion() const override { return "8.1"; } - - static MSVCProjectExporterVC2015* createForSettings (Project& projectToUse, const ValueTree& settingsToUse) - { - if (settingsToUse.hasType (getValueTreeTypeName())) - return new MSVCProjectExporterVC2015 (projectToUse, settingsToUse); - - return nullptr; - } - - void createExporterProperties (PropertyListBuilder& props) override - { - static const char* toolsetNames[] = { "v140", "v140_xp", "CTP_Nov2013" }; - const var toolsets[] = { "v140", "v140_xp", "CTP_Nov2013" }; - addToolsetProperty (props, toolsetNames, toolsets, numElementsInArray (toolsets)); - - MSVCProjectExporterBase::createExporterProperties (props); - } - - JUCE_DECLARE_NON_COPYABLE (MSVCProjectExporterVC2015) -}; - -//============================================================================== class MSVCProjectExporterVC2017 : public MSVCProjectExporterBase { public: diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -74,6 +74,10 @@ appSandboxValue (settings, Ids::appSandbox, getUndoManager()), appSandboxInheritanceValue (settings, Ids::appSandboxInheritance, getUndoManager()), appSandboxOptionsValue (settings, Ids::appSandboxOptions, getUndoManager(), Array(), ","), + appSandboxHomeDirROValue (settings, Ids::appSandboxHomeDirRO, getUndoManager()), + appSandboxHomeDirRWValue (settings, Ids::appSandboxHomeDirRW, getUndoManager()), + appSandboxAbsDirROValue (settings, Ids::appSandboxAbsDirRO, getUndoManager()), + appSandboxAbsDirRWValue (settings, Ids::appSandboxAbsDirRW, getUndoManager()), hardenedRuntimeValue (settings, Ids::hardenedRuntime, getUndoManager()), hardenedRuntimeOptionsValue (settings, Ids::hardenedRuntimeOptions, getUndoManager(), Array(), ","), microphonePermissionNeededValue (settings, Ids::microphonePermissionNeeded, getUndoManager()), @@ -173,6 +177,21 @@ bool isAppSandboxInhertianceEnabled() const { return appSandboxInheritanceValue.get(); } Array getAppSandboxOptions() const { return *appSandboxOptionsValue.get().getArray(); } + auto getAppSandboxTemporaryPaths() const + { + std::vector result; + + for (const auto& entry : sandboxFileAccessProperties) + { + auto paths = getCommaOrWhitespaceSeparatedItems (entry.property.get()); + + if (! paths.isEmpty()) + result.push_back ({ "com.apple.security.temporary-exception.files." + entry.key, std::move (paths) }); + } + + return result; + } + Array getValidArchs() const { return *validArchsValue.get().getArray(); } bool isMicrophonePermissionEnabled() const { return microphonePermissionNeededValue.get(); } @@ -229,7 +248,6 @@ bool isCodeBlocks() const override { return false; } bool isMakefile() const override { return false; } bool isAndroidStudio() const override { return false; } - bool isCLion() const override { return false; } bool isAndroid() const override { return false; } bool isWindows() const override { return false; } @@ -248,25 +266,28 @@ bool supportsTargetType (build_tools::ProjectType::Target::Type type) const override { + using Target = build_tools::ProjectType::Target; + switch (type) { - case build_tools::ProjectType::Target::AudioUnitv3PlugIn: - case build_tools::ProjectType::Target::StandalonePlugIn: - case build_tools::ProjectType::Target::GUIApp: - case build_tools::ProjectType::Target::StaticLibrary: - case build_tools::ProjectType::Target::DynamicLibrary: - case build_tools::ProjectType::Target::SharedCodeTarget: - case build_tools::ProjectType::Target::AggregateTarget: + case Target::AudioUnitv3PlugIn: + case Target::StandalonePlugIn: + case Target::GUIApp: + case Target::StaticLibrary: + case Target::DynamicLibrary: + case Target::SharedCodeTarget: + case Target::AggregateTarget: return true; - case build_tools::ProjectType::Target::ConsoleApp: - case build_tools::ProjectType::Target::VSTPlugIn: - case build_tools::ProjectType::Target::VST3PlugIn: - case build_tools::ProjectType::Target::AAXPlugIn: - case build_tools::ProjectType::Target::RTASPlugIn: - case build_tools::ProjectType::Target::AudioUnitPlugIn: - case build_tools::ProjectType::Target::UnityPlugIn: + case Target::ConsoleApp: + case Target::VSTPlugIn: + case Target::VST3PlugIn: + case Target::AAXPlugIn: + case Target::AudioUnitPlugIn: + case Target::UnityPlugIn: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: return ! iOS; - case build_tools::ProjectType::Target::unspecified: + case Target::unspecified: default: break; } @@ -457,29 +478,36 @@ { "Temporary Exception: Audio Unit Hosting", "temporary-exception.audio-unit-host" }, { "Temporary Exception: Global Mach Service", "temporary-exception.mach-lookup.global-name" }, { "Temporary Exception: Global Mach Service Dynamic Registration", "temporary-exception.mach-register.global-name" }, - { "Temporary Exception: Home Directory File Access (Read Only)", "temporary-exception.files.home-relative-path.read-only" }, - { "Temporary Exception: Home Directory File Access (Read/Write)", "temporary-exception.files.home-relative-path.read-write" }, - { "Temporary Exception: Absolute Path File Access (Read Only)", "temporary-exception.files.absolute-path.read-only" }, - { "Temporary Exception: Absolute Path File Access (Read/Write)", "temporary-exception.files.absolute-path.read-write" }, { "Temporary Exception: IOKit User Client Class", "temporary-exception.iokit-user-client-class" }, { "Temporary Exception: Shared Preference Domain (Read Only)", "temporary-exception.shared-preference.read-only" }, { "Temporary Exception: Shared Preference Domain (Read/Write)", "temporary-exception.shared-preference.read-write" } }; StringArray sandboxKeys; - Array sanboxValues; + Array sandboxValues; for (auto& opt : sandboxOptions) { sandboxKeys.add (opt.first); - sanboxValues.add ("com.apple.security." + opt.second); + sandboxValues.add ("com.apple.security." + opt.second); } props.add (new MultiChoicePropertyComponentWithEnablement (appSandboxOptionsValue, appSandboxValue, "App Sandbox Options", sandboxKeys, - sanboxValues)); + sandboxValues)); + + for (const auto& entry : sandboxFileAccessProperties) + { + props.add (new TextPropertyComponentWithEnablement (entry.property, + appSandboxValue, + entry.label, + 8192, + true), + "A list of the corresponding paths (separated by newlines or whitespace). " + "See Apple's File Access Temporary Exceptions documentation."); + } props.add (new ChoicePropertyComponent (hardenedRuntimeValue, "Use Hardened Runtime"), "Enable this to use the hardened runtime required for app notarization."); @@ -645,7 +673,7 @@ if (iOS) props.add (new TextPropertyComponentWithEnablement (iosAppGroupsIDValue, iosAppGroupsValue, "App Group ID", 256, false), "The App Group ID to be used for allowing multiple apps to access a shared resource folder. Multiple IDs can be " - "added separated by a semicolon."); + "added separated by a semicolon. The App Groups Capability setting must be enabled for this setting to have any effect."); props.add (new ChoicePropertyComponent (keepCustomXcodeSchemesValue, "Keep Custom Xcode Schemes"), "Enable this to keep any Xcode schemes you have created for debugging or running, e.g. to launch a plug-in in" @@ -727,7 +755,7 @@ { String alertWindowText = iOS ? "Your Xcode (iOS) Exporter settings use an invalid post-build script. Click 'Update' to remove it." : "Your Xcode (macOS) Exporter settings use a pre-JUCE 4.2 post-build script to move the plug-in binaries to their plug-in install folders.\n\n" - "Since JUCE 4.2, this is instead done using \"AU/VST/VST2/AAX/RTAS Binary Location\" in the Xcode (OS X) configuration settings.\n\n" + "Since JUCE 4.2, this is instead done using \"AU/VST/VST2/AAX Binary Location\" in the Xcode (OS X) configuration settings.\n\n" "Click 'Update' to remove the script (otherwise your plug-in may not compile correctly)."; if (AlertWindow::showOkCancelBox (MessageBoxIconType::WarningIcon, @@ -752,8 +780,8 @@ aaxPathValueWrapper.init ({ settings, Ids::aaxFolder, nullptr }, getAppSettings().getStoredPath (Ids::aaxPath, TargetOS::osx), TargetOS::osx); - rtasPathValueWrapper.init ({ settings, Ids::rtasFolder, nullptr }, - getAppSettings().getStoredPath (Ids::rtasPath, TargetOS::osx), TargetOS::osx); + araPathValueWrapper.init ({ settings, Ids::araFolder, nullptr }, + getAppSettings().getStoredPath (Ids::araPath, TargetOS::osx), TargetOS::osx); } protected: @@ -779,9 +807,9 @@ vstBinaryLocation (config, Ids::vstBinaryLocation, getUndoManager(), "$(HOME)/Library/Audio/Plug-Ins/VST/"), vst3BinaryLocation (config, Ids::vst3BinaryLocation, getUndoManager(), "$(HOME)/Library/Audio/Plug-Ins/VST3/"), auBinaryLocation (config, Ids::auBinaryLocation, getUndoManager(), "$(HOME)/Library/Audio/Plug-Ins/Components/"), - rtasBinaryLocation (config, Ids::rtasBinaryLocation, getUndoManager(), "/Library/Application Support/Digidesign/Plug-Ins/"), aaxBinaryLocation (config, Ids::aaxBinaryLocation, getUndoManager(), "/Library/Application Support/Avid/Audio/Plug-Ins/"), - unityPluginBinaryLocation (config, Ids::unityPluginBinaryLocation, getUndoManager()) + unityPluginBinaryLocation (config, Ids::unityPluginBinaryLocation, getUndoManager()), + lv2BinaryLocation (config, Ids::lv2BinaryLocation, getUndoManager(), "$(HOME)/Library/Audio/Plug-Ins/LV2/") { updateOldPluginBinaryLocations(); updateOldSDKDefaults(); @@ -874,9 +902,9 @@ String getVSTBinaryLocationString() const { return vstBinaryLocation.get(); } String getVST3BinaryLocationString() const { return vst3BinaryLocation.get(); } String getAUBinaryLocationString() const { return auBinaryLocation.get(); } - String getRTASBinaryLocationString() const { return rtasBinaryLocation.get();} String getAAXBinaryLocationString() const { return aaxBinaryLocation.get();} String getUnityPluginBinaryLocationString() const { return unityPluginBinaryLocation.get(); } + String getLV2PluginBinaryLocationString() const { return lv2BinaryLocation.get(); } private: //============================================================================== @@ -885,8 +913,8 @@ ValueTreePropertyWithDefault macOSBaseSDK, macOSDeploymentTarget, macOSArchitecture, iosBaseSDK, iosDeploymentTarget, customXcodeFlags, plistPreprocessorDefinitions, codeSignIdentity, fastMathEnabled, stripLocalSymbolsEnabled, pluginBinaryCopyStepEnabled, - vstBinaryLocation, vst3BinaryLocation, auBinaryLocation, rtasBinaryLocation, - aaxBinaryLocation, unityPluginBinaryLocation; + vstBinaryLocation, vst3BinaryLocation, auBinaryLocation, + aaxBinaryLocation, unityPluginBinaryLocation, lv2BinaryLocation; //============================================================================== void valueTreePropertyChanged (ValueTree&, const Identifier& property) override @@ -912,7 +940,7 @@ void addXcodePluginInstallPathProperties (PropertyListBuilder& props) { auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildAU() - || project.shouldBuildRTAS() || project.shouldBuildAAX() || project.shouldBuildUnityPlugin()); + || project.shouldBuildAAX() || project.shouldBuildUnityPlugin()); if (isBuildingAnyPlugins) props.add (new ChoicePropertyComponent (pluginBinaryCopyStepEnabled, "Enable Plugin Copy Step"), @@ -928,16 +956,16 @@ 1024, false), "The folder in which the compiled AU binary should be placed."); - if (project.shouldBuildRTAS()) - props.add (new TextPropertyComponentWithEnablement (rtasBinaryLocation, pluginBinaryCopyStepEnabled, "RTAS Binary Location", - 1024, false), - "The folder in which the compiled RTAS binary should be placed."); - if (project.shouldBuildAAX()) props.add (new TextPropertyComponentWithEnablement (aaxBinaryLocation, pluginBinaryCopyStepEnabled, "AAX Binary Location", 1024, false), "The folder in which the compiled AAX binary should be placed."); + if (project.shouldBuildLV2()) + props.add (new TextPropertyComponentWithEnablement (lv2BinaryLocation, pluginBinaryCopyStepEnabled, "LV2 Binary Location", + 1024, false), + "The folder in which the compiled LV2 binary should be placed."); + if (project.shouldBuildUnityPlugin()) props.add (new TextPropertyComponentWithEnablement (unityPluginBinaryLocation, pluginBinaryCopyStepEnabled, "Unity Binary Location", 1024, false), @@ -954,7 +982,6 @@ if (! config ["xcodeVstBinaryLocation"].isVoid()) vstBinaryLocation = config ["xcodeVstBinaryLocation"]; if (! config ["xcodeVst3BinaryLocation"].isVoid()) vst3BinaryLocation = config ["xcodeVst3BinaryLocation"]; if (! config ["xcodeAudioUnitBinaryLocation"].isVoid()) auBinaryLocation = config ["xcodeAudioUnitBinaryLocation"]; - if (! config ["xcodeRtasBinaryLocation"].isVoid()) rtasBinaryLocation = config ["xcodeRtasBinaryLocation"]; if (! config ["xcodeAaxBinaryLocation"].isVoid()) aaxBinaryLocation = config ["xcodeAaxBinaryLocation"]; } @@ -1022,6 +1049,7 @@ break; case ConsoleApp: + case LV2TurtleProgram: xcodeFileType = "compiled.mach-o.executable"; xcodeBundleExtension = String(); xcodeProductType = "com.apple.product-type.tool"; @@ -1089,17 +1117,17 @@ xcodeCopyToProductInstallPathAfterBuild = true; break; - case RTASPlugIn: + case UnityPlugIn: xcodeFileType = "wrapper.cfbundle"; - xcodeBundleExtension = ".dpm"; + xcodeBundleExtension = ".bundle"; xcodeProductType = "com.apple.product-type.bundle"; xcodeCopyToProductInstallPathAfterBuild = true; break; - case UnityPlugIn: - xcodeFileType = "wrapper.cfbundle"; - xcodeBundleExtension = ".bundle"; - xcodeProductType = "com.apple.product-type.bundle"; + case LV2PlugIn: + xcodeFileType = "compiled.mach-o.executable"; + xcodeProductType = "com.apple.product-type.tool"; + xcodeBundleExtension = ".so"; xcodeCopyToProductInstallPathAfterBuild = true; break; @@ -1154,43 +1182,6 @@ String mainBuildProductID; File infoPlistFile; - struct SourceFileInfo - { - build_tools::RelativePath path; - bool shouldBeCompiled = false; - }; - - Array getSourceFilesInfo (const Project::Item& projectItem) const - { - Array result; - - auto targetType = (owner.getProject().isAudioPluginProject() ? type : SharedCodeTarget); - - if (projectItem.isGroup()) - { - for (int i = 0; i < projectItem.getNumChildren(); ++i) - result.addArray (getSourceFilesInfo (projectItem.getChild (i))); - } - else if (projectItem.shouldBeAddedToTargetProject() && projectItem.shouldBeAddedToTargetExporter (owner) - && owner.getProject().getTargetTypeFromFilePath (projectItem.getFile(), true) == targetType) - { - SourceFileInfo info; - - info.path = build_tools::RelativePath (projectItem.getFile(), - owner.getTargetFolder(), - build_tools::RelativePath::buildTargetFolder); - - jassert (info.path.getRoot() == build_tools::RelativePath::buildTargetFolder); - - if (targetType == SharedCodeTarget || projectItem.shouldBeCompiled()) - info.shouldBeCompiled = projectItem.shouldBeCompiled(); - - result.add (info); - } - - return result; - } - //============================================================================== void addMainBuildProduct() const { @@ -1199,12 +1190,18 @@ if (ProjectExporter::BuildConfiguration::Ptr config = owner.getConfiguration (0)) { - auto productName = owner.replacePreprocessorTokens (*config, config->getTargetBinaryNameString (type == UnityPlugIn)); + const auto productName = [&]() -> String + { + const auto binaryName = owner.replacePreprocessorTokens (*config, config->getTargetBinaryNameString (type == UnityPlugIn)); - if (xcodeFileType == "archive.ar") - productName = getStaticLibbedFilename (productName); - else - productName += xcodeBundleExtension; + if (xcodeFileType == "archive.ar") + return getStaticLibbedFilename (binaryName); + + if (type == LV2TurtleProgram) + return Project::getLV2FileWriterName(); + + return binaryName + xcodeBundleExtension; + }(); addBuildProduct (xcodeFileType, productName); } @@ -1255,6 +1252,18 @@ if (target->type != XcodeTarget::AggregateTarget) dependencyIDs.add (target->addDependencyFor (*this)); } + else if (type == XcodeTarget::LV2PlugIn) + { + if (auto* helperTarget = owner.getTargetOfType (XcodeTarget::LV2TurtleProgram)) + dependencyIDs.add (helperTarget->addDependencyFor (*this)); + + if (auto* sharedCodeTarget = owner.getTargetOfType (XcodeTarget::SharedCodeTarget)) + dependencyIDs.add (sharedCodeTarget->addDependencyFor (*this)); + } + else if (type == XcodeTarget::LV2TurtleProgram) + { + // No thanks + } else if (type != XcodeTarget::SharedCodeTarget) // shared code doesn't depend on anything; all other targets depend only on the shared code { if (auto* sharedCodeTarget = owner.getTargetOfType (XcodeTarget::SharedCodeTarget)) @@ -1410,6 +1419,27 @@ return mergePreprocessorDefs (defines, owner.getAllPreprocessorDefs (config, type)); } + String getConfigurationBuildDir (const XcodeBuildConfiguration& config) const + { + const String configurationBuildDir ("$(PROJECT_DIR)/build/$(CONFIGURATION)"); + + if (config.getTargetBinaryRelativePathString().isEmpty()) + return configurationBuildDir; + + // a target's position can either be defined via installPath + xcodeCopyToProductInstallPathAfterBuild + // (= for audio plug-ins) or using a custom binary path (for everything else), but not both (= conflict!) + jassert (! xcodeCopyToProductInstallPathAfterBuild); + + build_tools::RelativePath binaryPath (config.getTargetBinaryRelativePathString(), + build_tools::RelativePath::projectFolder); + + return expandPath (binaryPath.rebased (owner.projectFolder, + owner.getTargetFolder(), + build_tools::RelativePath::buildTargetFolder).toUnixStyle()); + } + + String getLV2BundleName() const { return owner.project.getPluginNameString() + ".lv2"; } + //============================================================================== StringPairArray getTargetSettings (const XcodeBuildConfiguration& config) const { @@ -1425,7 +1455,15 @@ return s; } - s.set ("PRODUCT_NAME", owner.replacePreprocessorTokens (config, config.getTargetBinaryNameString (type == UnityPlugIn)).quoted()); + const auto productName = [&] + { + if (type == LV2TurtleProgram) + return Project::getLV2FileWriterName().quoted(); + + return owner.replacePreprocessorTokens (config, config.getTargetBinaryNameString (type == UnityPlugIn)).quoted(); + }(); + + s.set ("PRODUCT_NAME", productName); s.set ("PRODUCT_BUNDLE_IDENTIFIER", getBundleIdentifier()); auto arch = (! owner.isiOS() && type == Target::AudioUnitv3PlugIn) ? macOSArch_64Bit @@ -1551,6 +1589,7 @@ s.set ("GCC_FAST_MATH", "YES"); auto recommendedWarnings = config.getRecommendedCompilerWarningFlags(); + recommendedWarnings.common.addArray (recommendedWarnings.objc); recommendedWarnings.cpp.addArray (recommendedWarnings.common); struct XcodeWarningFlags @@ -1579,7 +1618,7 @@ { s.set ("INSTALL_PATH", installPath.quoted()); - if (type == Target::SharedCodeTarget) + if (type == Target::SharedCodeTarget || type == Target::LV2PlugIn) s.set ("SKIP_INSTALL", "YES"); if (! owner.embeddedFrameworkIDs.isEmpty()) @@ -1602,24 +1641,11 @@ if (xcodeOtherRezFlags.isNotEmpty()) s.set ("OTHER_REZFLAGS", "\"" + xcodeOtherRezFlags + "\""); - String configurationBuildDir ("$(PROJECT_DIR)/build/$(CONFIGURATION)"); - - if (config.getTargetBinaryRelativePathString().isNotEmpty()) - { - // a target's position can either be defined via installPath + xcodeCopyToProductInstallPathAfterBuild - // (= for audio plug-ins) or using a custom binary path (for everything else), but not both (= conflict!) - jassert (! xcodeCopyToProductInstallPathAfterBuild); - - build_tools::RelativePath binaryPath (config.getTargetBinaryRelativePathString(), - build_tools::RelativePath::projectFolder); - - configurationBuildDir = expandPath (binaryPath.rebased (owner.projectFolder, - owner.getTargetFolder(), - build_tools::RelativePath::buildTargetFolder) - .toUnixStyle()); - } + const auto configurationBuildDir = getConfigurationBuildDir (config); + const auto adjustedConfigBuildDir = type == LV2PlugIn ? configurationBuildDir + "/" + getLV2BundleName() + : configurationBuildDir; - s.set ("CONFIGURATION_BUILD_DIR", addQuotesIfRequired (configurationBuildDir)); + s.set ("CONFIGURATION_BUILD_DIR", addQuotesIfRequired (adjustedConfigBuildDir)); if (owner.isHardenedRuntimeEnabled()) s.set ("ENABLE_HARDENED_RUNTIME", "YES"); @@ -1677,10 +1703,17 @@ StringArray linkerFlags, librarySearchPaths; getLinkerSettings (config, linkerFlags, librarySearchPaths); + for (const auto& weakFramework : owner.xcodeWeakFrameworks) + linkerFlags.add ("-weak_framework " + weakFramework); + if (linkerFlags.size() > 0) s.set ("OTHER_LDFLAGS", linkerFlags.joinIntoString (" ").quoted()); librarySearchPaths.addArray (config.getLibrarySearchPaths()); + + if (type == LV2PlugIn) + librarySearchPaths.add (configurationBuildDir); + librarySearchPaths = getCleanedStringArray (librarySearchPaths); if (librarySearchPaths.size() > 0) @@ -1752,11 +1785,12 @@ case VSTPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getVSTBinaryLocationString() : String(); case VST3PlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getVST3BinaryLocationString() : String(); case AudioUnitPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getAUBinaryLocationString() : String(); - case RTASPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getRTASBinaryLocationString() : String(); case AAXPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getAAXBinaryLocationString() : String(); case UnityPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getUnityPluginBinaryLocationString() : String(); + case LV2PlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getLV2PluginBinaryLocationString() : String(); case SharedCodeTarget: return owner.isiOS() ? "@executable_path/Frameworks" : "@executable_path/../Frameworks"; case StaticLibrary: + case LV2TurtleProgram: case DynamicLibrary: case AudioUnitv3PlugIn: case StandalonePlugIn: @@ -1772,7 +1806,7 @@ if (getTargetFileType() == pluginBundle) flags.add (owner.isiOS() ? "-bitcode_bundle" : "-bundle"); - if (type != Target::SharedCodeTarget) + if (type != Target::SharedCodeTarget && type != Target::LV2TurtleProgram) { Array extraLibs; @@ -1872,6 +1906,7 @@ options.isAuSandboxSafe = owner.project.isAUSandBoxSafe(); options.isPluginSynth = owner.project.isPluginSynth(); options.suppressResourceUsage = owner.getSuppressPlistResourceUsage(); + options.isPluginARAEffect = owner.project.shouldEnableARA(); options.write (infoPlistFile); } @@ -1919,7 +1954,6 @@ { StringArray paths (owner.extraSearchPaths); paths.addArray (config.getHeaderSearchPaths()); - paths.addArray (getTargetExtraHeaderSearchPaths()); if (owner.project.getEnabledModules().isModuleEnabled ("juce_audio_plugin_client")) { @@ -1971,61 +2005,6 @@ extraLibs.add (aaxLibsFolder.getChildFile (libraryPath)); } - else if (type == RTASPlugIn) - { - build_tools::RelativePath rtasFolder (owner.getRTASPathString(), build_tools::RelativePath::projectFolder); - - extraLibs.add (rtasFolder.getChildFile ("MacBag/Libs/Debug/libPluginLibrary.a")); - extraLibs.add (rtasFolder.getChildFile ("MacBag/Libs/Release/libPluginLibrary.a")); - } - } - - StringArray getTargetExtraHeaderSearchPaths() const - { - StringArray targetExtraSearchPaths; - - if (type == RTASPlugIn) - { - build_tools::RelativePath rtasFolder (owner.getRTASPathString(), build_tools::RelativePath::projectFolder); - - targetExtraSearchPaths.add ("$(DEVELOPER_DIR)/Headers/FlatCarbon"); - targetExtraSearchPaths.add ("$(SDKROOT)/Developer/Headers/FlatCarbon"); - - static const char* p[] = { "AlturaPorts/TDMPlugIns/PlugInLibrary/Controls", - "AlturaPorts/TDMPlugIns/PlugInLibrary/CoreClasses", - "AlturaPorts/TDMPlugIns/PlugInLibrary/DSPClasses", - "AlturaPorts/TDMPlugIns/PlugInLibrary/EffectClasses", - "AlturaPorts/TDMPlugIns/PlugInLibrary/MacBuild", - "AlturaPorts/TDMPlugIns/PlugInLibrary/Meters", - "AlturaPorts/TDMPlugIns/PlugInLibrary/ProcessClasses", - "AlturaPorts/TDMPlugIns/PlugInLibrary/ProcessClasses/Interfaces", - "AlturaPorts/TDMPlugIns/PlugInLibrary/RTASP_Adapt", - "AlturaPorts/TDMPlugIns/PlugInLibrary/Utilities", - "AlturaPorts/TDMPlugIns/PlugInLibrary/ViewClasses", - "AlturaPorts/TDMPlugIns/DSPManager/**", - "AlturaPorts/TDMPlugIns/SupplementalPlugInLib/Encryption", - "AlturaPorts/TDMPlugIns/SupplementalPlugInLib/GraphicsExtensions", - "AlturaPorts/TDMPlugIns/common/**", - "AlturaPorts/TDMPlugIns/common/PI_LibInterface", - "AlturaPorts/TDMPlugIns/PACEProtection/**", - "AlturaPorts/TDMPlugIns/SignalProcessing/**", - "AlturaPorts/OMS/Headers", - "AlturaPorts/Fic/Interfaces/**", - "AlturaPorts/Fic/Source/SignalNets", - "AlturaPorts/DSIPublicInterface/PublicHeaders", - "DAEWin/Include", - "AlturaPorts/DigiPublic/Interfaces", - "AlturaPorts/DigiPublic", - "AlturaPorts/NewFileLibs/DOA", - "AlturaPorts/NewFileLibs/Cmn", - "xplat/AVX/avx2/avx2sdk/inc", - "xplat/AVX/avx2/avx2sdk/utils" }; - - for (auto* path : p) - owner.addProjectPathToBuildPathList (targetExtraSearchPaths, rtasFolder.getChildFile (path)); - } - - return targetExtraSearchPaths; } //============================================================================== @@ -2035,6 +2014,7 @@ }; mutable StringArray xcodeFrameworks; + mutable StringArray xcodeWeakFrameworks; StringArray xcodeLibs; private: @@ -2118,6 +2098,18 @@ target->addMainBuildProduct(); + if (target->type == XcodeTarget::LV2TurtleProgram + && project.getEnabledModules().isModuleEnabled ("juce_audio_plugin_client")) + { + const auto path = getLV2TurtleDumpProgramSource(); + addFile (FileOptions().withRelativePath ({ expandPath (path.toUnixStyle()), path.getRoot() }) + .withSkipPCHEnabled (true) + .withCompilationEnabled (true) + .withInhibitWarningsEnabled (true) + .withCompilerFlags ("-std=c++11") + .withXcodeTarget (target)); + } + auto targetName = String (target->getName()); auto fileID = createID (targetName + "__targetbuildref"); auto fileRefID = createID ("__productFileID" + targetName); @@ -2266,7 +2258,10 @@ { auto skipAUv3 = (target->type == XcodeTarget::AudioUnitv3PlugIn && ! shouldDuplicateAppExResourcesFolder()); - if (! projectType.isStaticLibrary() && target->type != XcodeTarget::SharedCodeTarget && ! skipAUv3) + if (! projectType.isStaticLibrary() + && target->type != XcodeTarget::SharedCodeTarget + && target->type != XcodeTarget::LV2TurtleProgram + && ! skipAUv3) target->addBuildPhase ("PBXResourcesBuildPhase", resourceIDs); auto rezFiles = rezFileIDs; @@ -2283,10 +2278,35 @@ target->addBuildPhase ("PBXSourcesBuildPhase", sourceFiles); - if (! projectType.isStaticLibrary() && target->type != XcodeTarget::SharedCodeTarget) + if (! projectType.isStaticLibrary() + && target->type != XcodeTarget::SharedCodeTarget + && target->type != XcodeTarget::LV2TurtleProgram) target->addBuildPhase ("PBXFrameworksBuildPhase", target->frameworkIDs); } + if (target->type == XcodeTarget::LV2PlugIn) + { + auto script = "set -e\n\"$CONFIGURATION_BUILD_DIR/../" + + Project::getLV2FileWriterName() + + "\" \"$CONFIGURATION_BUILD_DIR/$PRODUCT_NAME\"\n"; + + for (ConstConfigIterator config (*this); config.next();) + { + auto& xcodeConfig = dynamic_cast (*config); + const auto installPath = target->getInstallPathForConfiguration (xcodeConfig); + + if (installPath.isNotEmpty()) + { + script << "if [ \"$CONFIGURATION\" = \"" << config->getName() + << "\" ]; then\n /bin/ln -sfh \"$CONFIGURATION_BUILD_DIR\" \"" + << installPath.replace ("$(HOME)", "$HOME") << '/' << target->getLV2BundleName() + << "\"\nfi\n"; + } + } + + target->addShellScriptBuildPhase ("Generate manifest", script); + } + target->addShellScriptBuildPhase ("Post-build script", getPostBuildScript()); if (project.isAudioPluginProject() && project.shouldBuildAUv3() @@ -3085,6 +3105,7 @@ options.appGroupIdString = getAppGroupIdString(); options.hardenedRuntimeOptions = getHardenedRuntimeOptions(); options.appSandboxOptions = getAppSandboxOptions(); + options.appSandboxTemporaryPaths = getAppSandboxTemporaryPaths(); const auto entitlementsFile = getTargetFolder().getChildFile (target.getEntitlementsFilename()); build_tools::overwriteFileIfDifferentOrThrow (entitlementsFile, options.getEntitlementsFileContent()); @@ -3371,7 +3392,7 @@ { std::map attributes; - attributes["LastUpgradeCheck"] = "1320"; + attributes["LastUpgradeCheck"] = "1340"; attributes["ORGANIZATIONNAME"] = getProject().getCompanyNameString().quoted(); if (projectType.isGUIApplication() || projectType.isAudioPlugin()) @@ -3536,8 +3557,6 @@ } //============================================================================== - friend class CLionProjectExporter; - bool xcodeCanUseDwarf; OwnedArray targets; @@ -3566,6 +3585,7 @@ duplicateAppExResourcesFolderValue, iosDeviceFamilyValue, iPhoneScreenOrientationValue, iPadScreenOrientationValue, customXcodeResourceFoldersValue, customXcassetsFolderValue, appSandboxValue, appSandboxInheritanceValue, appSandboxOptionsValue, + appSandboxHomeDirROValue, appSandboxHomeDirRWValue, appSandboxAbsDirROValue, appSandboxAbsDirRWValue, hardenedRuntimeValue, hardenedRuntimeOptionsValue, microphonePermissionNeededValue, microphonePermissionsTextValue, cameraPermissionNeededValue, cameraPermissionTextValue, @@ -3576,5 +3596,19 @@ networkingMulticastValue, iosDevelopmentTeamIDValue, iosAppGroupsIDValue, keepCustomXcodeSchemesValue, useHeaderMapValue, customLaunchStoryboardValue, exporterBundleIdentifierValue, suppressPlistResourceUsageValue, useLegacyBuildSystemValue, buildNumber; + struct SandboxFileAccessProperty + { + const ValueTreePropertyWithDefault& property; + const String label, key; + }; + + const std::vector sandboxFileAccessProperties + { + { appSandboxHomeDirROValue, "App sandbox temporary exception: home directory read only file access", "home-relative-path.read-only" }, + { appSandboxHomeDirRWValue, "App sandbox temporary exception: home directory read/write file access", "home-relative-path.read-write" }, + { appSandboxAbsDirROValue, "App sandbox temporary exception: absolute path read only file access", "absolute-path.read-only" }, + { appSandboxAbsDirRWValue, "App sandbox temporary exception: absolute path read/write file access", "absolute-path.read-write" } + }; + JUCE_DECLARE_NON_COPYABLE (XcodeProjectExporter) }; diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -24,7 +24,6 @@ */ #include "jucer_ProjectSaver.h" -#include "jucer_ProjectExport_CLion.h" #include "../Application/jucer_Application.h" static constexpr const char* generatedGroupID = "__jucelibfiles"; @@ -81,6 +80,7 @@ void ProjectSaver::saveBasicProjectItems (const OwnedArray& modules, const String& appConfigUserContent) { + writeLV2DefinesFile(); writePluginDefines(); writeAppConfigFile (modules, appConfigUserContent); writeBinaryDataFiles(); @@ -293,20 +293,6 @@ { if (project.isAudioPluginProject()) { - const auto isInvalidCode = [] (String code) - { - return code.length() != 4 || code.toStdString().size() != 4; - }; - - if (isInvalidCode (project.getPluginManufacturerCodeString())) - return Result::fail ("The plugin manufacturer code must contain exactly four characters."); - - if (isInvalidCode (project.getPluginCodeString())) - return Result::fail ("The plugin code must contain exactly four characters."); - } - - if (project.isAudioPluginProject()) - { if (project.shouldBuildUnityPlugin()) writeUnityScriptFile(); } @@ -397,12 +383,12 @@ << "/*" << newLine << " ==============================================================================" << newLine << newLine - << " In accordance with the terms of the JUCE 6 End-Use License Agreement, the" << newLine + << " In accordance with the terms of the JUCE 7 End-Use License Agreement, the" << newLine << " JUCE Code in SECTION A cannot be removed, changed or otherwise rendered" << newLine << " ineffective unless you have a JUCE Indie or Pro license, or are using JUCE" << newLine << " under the GPL v3 license." << newLine << newLine - << " End User License Agreement: www.juce.com/juce-6-licence" << newLine + << " End User License Agreement: www.juce.com/juce-7-licence" << newLine << newLine << " ==============================================================================" << newLine << "*/" << newLine @@ -516,6 +502,17 @@ }); } +void ProjectSaver::writeLV2DefinesFile() +{ + if (! project.shouldBuildLV2()) + return; + + writeOrRemoveGeneratedFile (Project::getJuceLV2DefinesFilename(), [&] (MemoryOutputStream& mem) + { + writeLV2Defines (mem); + }); +} + void ProjectSaver::writeAppHeader (MemoryOutputStream& out, const OwnedArray& modules) { writeAutoGenWarningComment (out); @@ -659,6 +656,21 @@ } } +void ProjectSaver::writeLV2Defines (MemoryOutputStream& mem) +{ + String templateFile { BinaryData::JuceLV2Defines_h_in }; + + const auto isValidUri = [&] (const String& text) { return URL (text).isWellFormed(); }; + + if (! isValidUri (project.getLV2URI())) + { + addError ("LV2 URI is malformed."); + return; + } + + mem << templateFile.replace ("${JUCE_LV2URI}", project.getLV2URI()); +} + void ProjectSaver::writeReadmeFile() { MemoryOutputStream out; @@ -732,7 +744,6 @@ // keep a copy of the basic generated files group, as each exporter may modify it. auto originalGeneratedGroup = generatedFilesGroup.state.createCopy(); - CLionProjectExporter* clionExporter = nullptr; std::vector> exporters; try @@ -751,26 +762,19 @@ if (exporter->getTargetFolder().createDirectory()) { - if (exporter->isCLion()) - { - clionExporter = dynamic_cast (exporter.get()); - } - else - { - exporter->copyMainGroupFromProject(); - exporter->settings = exporter->settings.createCopy(); + exporter->copyMainGroupFromProject(); + exporter->settings = exporter->settings.createCopy(); - exporter->addToExtraSearchPaths (build_tools::RelativePath ("JuceLibraryCode", build_tools::RelativePath::projectFolder)); + exporter->addToExtraSearchPaths (build_tools::RelativePath ("JuceLibraryCode", build_tools::RelativePath::projectFolder)); - generatedFilesGroup.state = originalGeneratedGroup.createCopy(); - exporter->addSettingsForProjectType (project.getProjectType()); + generatedFilesGroup.state = originalGeneratedGroup.createCopy(); + exporter->addSettingsForProjectType (project.getProjectType()); - for (auto* module : modules) - module->addSettingsForModuleToExporter (*exporter, *this); + for (auto* module : modules) + module->addSettingsForModuleToExporter (*exporter, *this); - generatedFilesGroup.sortAlphabetically (true, true); - exporter->getAllGroups().add (generatedFilesGroup); - } + generatedFilesGroup.sortAlphabetically (true, true); + exporter->getAllGroups().add (generatedFilesGroup); if (ProjucerApplication::getApp().isRunningCommandLine) saveExporter (*exporter, modules); @@ -790,14 +794,6 @@ while (threadPool.getNumJobs() > 0) Thread::sleep (10); - - if (clionExporter != nullptr) - { - for (auto& exporter : exporters) - clionExporter->writeCMakeListsExporterSection (exporter.get()); - - std::cout << "Finished saving: " << clionExporter->getUniqueName() << std::endl; - } } void ProjectSaver::runPostExportScript() @@ -846,15 +842,12 @@ { exporter.create (modules); - if (! exporter.isCLion()) - { - auto outputString = "Finished saving: " + exporter.getUniqueName(); + auto outputString = "Finished saving: " + exporter.getUniqueName(); - if (MessageManager::getInstance()->isThisTheMessageThread()) - std::cout << outputString << std::endl; - else - MessageManager::callAsync ([outputString] { std::cout << outputString << std::endl; }); - } + if (MessageManager::getInstance()->isThisTheMessageThread()) + std::cout << outputString << std::endl; + else + MessageManager::callAsync ([outputString] { std::cout << outputString << std::endl; }); } catch (build_tools::SaveError& error) { diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -103,6 +103,7 @@ void writePluginDefines (MemoryOutputStream& outStream) const; void writePluginDefines(); void writeAppConfigFile (const OwnedArray& modules, const String& userContent); + void writeLV2Defines (MemoryOutputStream&); void writeProjectFile(); void writeAppConfig (MemoryOutputStream& outStream, const OwnedArray& modules, const String& userContent); @@ -114,6 +115,7 @@ void writePluginCharacteristicsFile(); void writeUnityScriptFile(); void writeProjects (const OwnedArray&, ProjectExporter*); + void writeLV2DefinesFile(); void runPostExportScript(); void saveExporter (ProjectExporter& exporter, const OwnedArray& modules); diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.cpp juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.h juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.h --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_XcodeProjectParser.h juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_XcodeProjectParser.h --- juce-6.1.5~ds0/extras/Projucer/Source/ProjectSaving/jucer_XcodeProjectParser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/ProjectSaving/jucer_XcodeProjectParser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Settings/jucer_AppearanceSettings.cpp juce-7.0.0~ds0/extras/Projucer/Source/Settings/jucer_AppearanceSettings.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Settings/jucer_AppearanceSettings.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Settings/jucer_AppearanceSettings.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Settings/jucer_AppearanceSettings.h juce-7.0.0~ds0/extras/Projucer/Source/Settings/jucer_AppearanceSettings.h --- juce-6.1.5~ds0/extras/Projucer/Source/Settings/jucer_AppearanceSettings.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Settings/jucer_AppearanceSettings.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp juce-7.0.0~ds0/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -279,14 +279,14 @@ { fileToCheckFor = "pluginterfaces/vst2.x/aeffect.h"; } - else if (key == Ids::rtasPath) - { - fileToCheckFor = "AlturaPorts/TDMPlugIns/PlugInLibrary/EffectClasses/CEffectProcessMIDI.cpp"; - } else if (key == Ids::aaxPath) { fileToCheckFor = "Interfaces/AAX_Exports.cpp"; } + else if (key == Ids::araPath) + { + fileToCheckFor = "ARA_API/ARAInterface.h"; + } else if (key == Ids::androidSDKPath) { #if JUCE_WINDOWS @@ -303,16 +303,6 @@ { fileToCheckFor = {}; } - else if (key == Ids::clionExePath) - { - #if JUCE_MAC - fileToCheckFor = path.trim().endsWith (".app") ? "Contents/MacOS/clion" : "../clion"; - #elif JUCE_WINDOWS - fileToCheckFor = "../clion64.exe"; - #else - fileToCheckFor = "../clion.sh"; - #endif - } else if (key == Ids::androidStudioExePath) { #if JUCE_MAC @@ -372,18 +362,18 @@ { return {}; } - else if (key == Ids::rtasPath) - { - if (os == TargetOS::windows) return "C:\\SDKs\\PT_90_SDK"; - else if (os == TargetOS::osx) return "~/SDKs/PT_90_SDK"; - else return {}; // no RTAS on this OS! - } else if (key == Ids::aaxPath) { if (os == TargetOS::windows) return "C:\\SDKs\\AAX"; else if (os == TargetOS::osx) return "~/SDKs/AAX"; else return {}; // no AAX on this OS! } + else if (key == Ids::araPath) + { + if (os == TargetOS::windows) return "C:\\SDKs\\ARA_SDK"; + else if (os == TargetOS::osx) return "~/SDKs/ARA_SDK"; + else return {}; + } else if (key == Ids::androidSDKPath) { if (os == TargetOS::windows) return "${user.home}\\AppData\\Local\\Android\\Sdk"; @@ -393,29 +383,6 @@ jassertfalse; return {}; } - else if (key == Ids::clionExePath) - { - if (os == TargetOS::windows) - { - #if JUCE_WINDOWS - auto regValue = WindowsRegistry::getValue ("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Applications\\clion64.exe\\shell\\open\\command\\", {}, {}); - auto openCmd = StringArray::fromTokens (regValue, true); - - if (! openCmd.isEmpty()) - return openCmd[0].unquoted(); - #endif - - return "C:\\Program Files\\JetBrains\\CLion YYYY.MM.DD\\bin\\clion64.exe"; - } - else if (os == TargetOS::osx) - { - return "/Applications/CLion.app"; - } - else - { - return "${user.home}/clion/bin/clion.sh"; - } - } else if (key == Ids::androidStudioExePath) { if (os == TargetOS::windows) diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Settings/jucer_StoredSettings.h juce-7.0.0~ds0/extras/Projucer/Source/Settings/jucer_StoredSettings.h --- juce-6.1.5~ds0/extras/Projucer/Source/Settings/jucer_StoredSettings.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Settings/jucer_StoredSettings.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.cpp juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_Colours.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_Colours.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_Colours.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_Colours.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.cpp juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.cpp juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -72,11 +72,10 @@ DECLARE_ID (defaultUserModulePath); DECLARE_ID (vstLegacyFolder); DECLARE_ID (vst3Folder); - DECLARE_ID (rtasFolder); DECLARE_ID (auFolder); DECLARE_ID (vstLegacyPath); - DECLARE_ID (rtasPath); DECLARE_ID (aaxPath); + DECLARE_ID (araPath); DECLARE_ID (flags); DECLARE_ID (line); DECLARE_ID (index); @@ -123,7 +122,6 @@ DECLARE_ID (vstBinaryLocation); DECLARE_ID (vst3BinaryLocation); DECLARE_ID (auBinaryLocation); - DECLARE_ID (rtasBinaryLocation); DECLARE_ID (aaxBinaryLocation); DECLARE_ID (unityPluginBinaryLocation); DECLARE_ID (enablePluginBinaryCopyStep); @@ -164,7 +162,11 @@ DECLARE_ID (enableIncrementalLinking); DECLARE_ID (bundleIdentifier); DECLARE_ID (aaxIdentifier); + DECLARE_ID (araFactoryID); + DECLARE_ID (araDocumentArchiveID); + DECLARE_ID (araCompatibleArchiveIDs); DECLARE_ID (aaxFolder); + DECLARE_ID (araFolder); DECLARE_ID (compile); DECLARE_ID (noWarnings); DECLARE_ID (skipPCH); @@ -196,6 +198,10 @@ DECLARE_ID (appSandbox); DECLARE_ID (appSandboxInheritance); DECLARE_ID (appSandboxOptions); + DECLARE_ID (appSandboxHomeDirRO); + DECLARE_ID (appSandboxHomeDirRW); + DECLARE_ID (appSandboxAbsDirRO); + DECLARE_ID (appSandboxAbsDirRW); DECLARE_ID (hardenedRuntime); DECLARE_ID (hardenedRuntimeOptions); DECLARE_ID (microphonePermissionNeeded); @@ -272,10 +278,6 @@ DECLARE_ID (gradleToolchain); DECLARE_ID (gradleToolchainVersion); DECLARE_ID (linuxExtraPkgConfig); - DECLARE_ID (clionMakefileEnabled); - DECLARE_ID (clionXcodeEnabled); - DECLARE_ID (clionCodeBlocksEnabled); - DECLARE_ID (clionExePath); DECLARE_ID (font); DECLARE_ID (colour); DECLARE_ID (userNotes); @@ -331,11 +333,12 @@ DECLARE_ID (buildVST3); DECLARE_ID (buildAU); DECLARE_ID (buildAUv3); - DECLARE_ID (buildRTAS); DECLARE_ID (buildAAX); DECLARE_ID (buildStandalone); DECLARE_ID (buildUnity); + DECLARE_ID (buildLV2); DECLARE_ID (enableIAA); + DECLARE_ID (enableARA); DECLARE_ID (pluginName); DECLARE_ID (pluginDesc); DECLARE_ID (pluginManufacturer); @@ -355,12 +358,11 @@ DECLARE_ID (pluginAUExportPrefix); DECLARE_ID (pluginAUMainType); DECLARE_ID (pluginAUIsSandboxSafe); - DECLARE_ID (pluginRTASCategory); - DECLARE_ID (pluginRTASDisableBypass); - DECLARE_ID (pluginRTASDisableMultiMono); DECLARE_ID (pluginAAXCategory); DECLARE_ID (pluginAAXDisableBypass); DECLARE_ID (pluginAAXDisableMultiMono); + DECLARE_ID (pluginARAAnalyzableContent); + DECLARE_ID (pluginARATransformFlags); DECLARE_ID (pluginVSTNumMidiInputs); DECLARE_ID (pluginVSTNumMidiOutputs); DECLARE_ID (suppressPlistResourceUsage); @@ -368,6 +370,7 @@ DECLARE_ID (exporters); DECLARE_ID (website); DECLARE_ID (mainClass); + DECLARE_ID (documentControllerClass); DECLARE_ID (moduleFlags); DECLARE_ID (projectLineFeed); DECLARE_ID (compilerFlagSchemes); @@ -379,6 +382,9 @@ DECLARE_ID (guiEditorEnabled); DECLARE_ID (jucerFormatVersion); DECLARE_ID (buildNumber); + DECLARE_ID (lv2Uri); + DECLARE_ID (lv2UriUi); + DECLARE_ID (lv2BinaryLocation); DECLARE_ID (osxSDK); DECLARE_ID (osxCompatibility); diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_ValueSourceHelpers.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_ValueSourceHelpers.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_ValueSourceHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_ValueSourceHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_ValueTreePropertyWithDefaultWrapper.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_ValueTreePropertyWithDefaultWrapper.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_ValueTreePropertyWithDefaultWrapper.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_ValueTreePropertyWithDefaultWrapper.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.cpp juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp juce-7.0.0~ds0/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -213,6 +213,11 @@ jucerTree.addChild (mainGroup, 0, nullptr); } +String PIPGenerator::getDocumentControllerClass() const +{ + return metadata.getProperty (Ids::documentControllerClass, "").toString(); +} + ValueTree PIPGenerator::createModulePathChild (const String& moduleID) { ValueTree modulePath (Ids::MODULEPATH); @@ -383,6 +388,9 @@ StringArray pluginFormatsToBuild (Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildStandalone.toString()); pluginFormatsToBuild.addArray (getExtraPluginFormatsToBuild()); + if (getDocumentControllerClass().isNotEmpty()) + pluginFormatsToBuild.add (Ids::enableARA.toString()); + jucerTree.setProperty (Ids::pluginFormats, pluginFormatsToBuild.joinIntoString (","), nullptr); const auto characteristics = metadata[Ids::pluginCharacteristics].toString(); @@ -421,6 +429,7 @@ String PIPGenerator::getMainFileTextForType() { const auto type = metadata[Ids::type].toString(); + const auto documentControllerClass = getDocumentControllerClass(); const auto mainTemplate = [&] { @@ -434,8 +443,17 @@ .replace ("${JUCE_PIP_MAIN_CLASS}", metadata[Ids::mainClass].toString()); if (type == "AudioProcessor") + { + if (documentControllerClass.isNotEmpty()) + { + return String (BinaryData::PIPAudioProcessorWithARA_cpp_in) + .replace ("${JUCE_PIP_MAIN_CLASS}", metadata[Ids::mainClass].toString()) + .replace ("${JUCE_PIP_DOCUMENTCONTROLLER_CLASS}", documentControllerClass); + } + return String (BinaryData::PIPAudioProcessor_cpp_in) .replace ("${JUCE_PIP_MAIN_CLASS}", metadata[Ids::mainClass].toString()); + } return String{}; }(); diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -52,6 +52,7 @@ //============================================================================== void addFileToTree (ValueTree& groupTree, const String& name, bool compile, const String& path); void createFiles (ValueTree& jucerTree); + String getDocumentControllerClass() const; ValueTree createModulePathChild (const String& moduleID); ValueTree createBuildConfigChild (bool isDebug); diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_IconButton.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_IconButton.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_IconButton.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_IconButton.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_Icons.cpp juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_Icons.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_Icons.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_Icons.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -624,15 +624,6 @@ const uint8 visualStudio[] = { 110,109,0,0,112,65,0,0,0,0,108,0,0,227,64,0,0,253,64,108,0,0,0,64,0,0,128,64,108,0,0,0,0,0,0,160,64,108,0,0,0,0,0,0,112,65,108,0,0,0,64,0,0,128,65,108,0,0,224,64,0,0,64,65,108,0,0,112,65,0,0,160,65,108,0,0,160,65,0,0,144,65,108,0,0,160,65,0,0,0,64,108, 0,0,112,65,0,0,0,0,99,109,0,0,112,65,0,0,192,64,108,0,0,112,65,0,0,96,65,108,0,176,26,65,0,0,32,65,108,0,0,112,65,0,0,192,64,99,109,0,0,0,64,0,0,224,64,108,0,0,162,64,0,0,31,65,108,0,0,0,64,0,0,80,65,108,0,0,0,64,0,0,224,64,99,101,0,0 }; - -const uint8 clion[] = { 110,109,0,0,0,0,0,0,0,0,98,0,0,0,0,170,170,38,67,0,0,0,0,171,170,166,67,0,0,0,0,0,0,250,67,98,170,170,38,67,0,0,250,67,171,170,166,67,0,0,250,67,0,0,250,67,0,0,250,67,98,0,0,250,67,171,170,166,67,0,0,250,67,170,170,38,67,0,0,250,67,0,0,0,0,98,171,170, - 166,67,0,0,0,0,170,170,38,67,0,0,0,0,0,0,0,0,0,0,0,0,99,109,246,164,21,67,176,231,121,66,98,120,35,52,67,168,63,118,66,22,248,83,67,248,250,142,66,0,128,104,67,0,0,190,66,98,172,234,94,67,0,128,212,66,86,85,85,67,0,0,235,66,2,192,75,67,0,192,0,67,98, - 180,250,52,67,80,226,207,66,62,108,10,67,92,105,190,66,32,159,224,66,108,117,239,66,98,40,200,154,66,148,71,22,67,110,149,174,66,254,37,89,67,80,183,4,67,52,0,104,67,98,100,211,30,67,88,243,112,67,134,23,59,67,212,126,101,67,252,63,78,67,0,64,83,67,98, - 84,213,87,67,86,213,92,67,170,106,97,67,174,106,102,67,0,0,107,67,2,0,112,67,98,28,218,67,67,144,199,143,67,12,199,231,66,24,70,145,67,174,142,147,66,200,71,117,67,98,16,130,199,65,74,191,69,67,80,114,21,66,130,44,211,66,170,64,198,66,178,0,150,66,98, - 176,33,229,66,124,94,133,66,160,27,4,67,84,87,121,66,246,164,21,67,176,231,121,66,99,109,0,32,133,67,2,0,130,66,98,85,213,140,67,2,0,130,66,171,138,148,67,2,0,130,66,0,64,156,67,2,0,130,66,98,0,64,156,67,0,128,242,66,0,64,156,67,0,128,49,67,0,64,156, - 67,4,192,105,67,98,1,64,171,67,4,192,105,67,0,64,186,67,4,192,105,67,0,64,201,67,4,192,105,67,98,0,64,201,67,174,170,118,67,0,64,201,67,171,202,129,67,0,64,201,67,1,64,136,67,98,170,138,178,67,1,64,136,67,86,213,155,67,1,64,136,67,0,32,133,67,1,64,136, - 67,98,0,32,133,67,88,85,75,67,0,32,133,67,174,42,6,67,0,32,133,67,4,0,130,66,99,109,0,0,62,66,254,31,203,67,98,0,0,220,66,254,31,203,67,0,128,44,67,254,31,203,67,0,0,107,67,254,31,203,67,98,0,0,107,67,84,85,208,67,0,0,107,67,170,138,213,67,0,0,107,67, - 0,192,218,67,98,0,128,44,67,0,192,218,67,0,0,220,66,0,192,218,67,252,255,61,66,0,192,218,67,98,252,255,61,66,170,138,213,67,252,255,61,66,84,85,208,67,252,255,61,66,254,31,203,67,99,101,0,0 }; } Icons::Icons() @@ -664,5 +655,4 @@ JUCE_LOAD_PATH_DATA (linux); JUCE_LOAD_PATH_DATA (xcode); JUCE_LOAD_PATH_DATA (visualStudio); - JUCE_LOAD_PATH_DATA (clion); } diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_Icons.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_Icons.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_Icons.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_Icons.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -77,7 +77,7 @@ Path imageDoc, config, graph, info, warning, user, closedFolder, exporter, fileExplorer, file, modules, openFolder, settings, singleModule, plus, android, codeBlocks, - linux, xcode, visualStudio, clion; + linux, xcode, visualStudio; private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Icons) diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.cpp juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -94,23 +94,21 @@ return 120; } -void ProjucerLookAndFeel::drawPropertyComponentLabel (Graphics& g, int width, int height, PropertyComponent& component) +void ProjucerLookAndFeel::drawPropertyComponentLabel (Graphics& g, int, int height, PropertyComponent& component) { - ignoreUnused (width); - g.setColour (component.findColour (defaultTextColourId) .withMultipliedAlpha (component.isEnabled() ? 1.0f : 0.6f)); - auto textWidth = getTextWidthForPropertyComponent (&component); + auto textWidth = getTextWidthForPropertyComponent (component); g.setFont (getPropertyComponentFont()); - g.drawFittedText (component.getName(), 0, 0, textWidth - 5, height, Justification::centredLeft, 5, 1.0f); + g.drawFittedText (component.getName(), 0, 0, textWidth, height, Justification::centredLeft, 5, 1.0f); } Rectangle ProjucerLookAndFeel::getPropertyComponentContentPosition (PropertyComponent& component) { - const auto textW = getTextWidthForPropertyComponent (&component); - return { textW, 0, component.getWidth() - textW, component.getHeight() - 1 }; + const auto paddedTextW = getTextWidthForPropertyComponent (component) + 5; + return { paddedTextW , 0, component.getWidth() - paddedTextW, component.getHeight() - 1 }; } void ProjucerLookAndFeel::drawButtonBackground (Graphics& g, diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -81,8 +81,8 @@ const bool filled, const Justification justification); static Path getChoiceComponentArrowPath (Rectangle arrowZone); - static Font getPropertyComponentFont() { return { 14.0f, Font::FontStyleFlags::bold }; } - static int getTextWidthForPropertyComponent (PropertyComponent* pp) { return jmin (200, pp->getWidth() / 2); } + static Font getPropertyComponentFont() { return { 14.0f, Font::FontStyleFlags::bold }; } + static int getTextWidthForPropertyComponent (const PropertyComponent& pc) { return jmin (200, pc.getWidth() / 2); } static ColourScheme getProjucerDarkColourScheme() { diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.cpp juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.cpp --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h --- juce-6.1.5~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile juce-7.0.0~ds0/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile --- juce-6.1.5~ds0/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile 2022-06-21 07:56:28.000000000 +0000 @@ -11,6 +11,10 @@ # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_CONSOLEAPP := UnitTestRunner JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,13 +60,13 @@ TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_CONSOLEAPP := UnitTestRunner JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -74,6 +78,8 @@ $(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \ $(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o \ $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o \ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \ $(JUCE_OBJDIR)/include_juce_cryptography_8cb807a8.o \ @@ -93,8 +99,8 @@ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) $(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) : $(OBJECTS_CONSOLEAPP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors alsa freetype2 libcurl + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors alsa freetype2 libcurl @echo Linking "UnitTestRunner - ConsoleApp" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) @@ -131,6 +137,16 @@ @echo "Compiling include_juce_audio_processors.cpp" $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_CONSOLEAPP) $(JUCE_CFLAGS_CONSOLEAPP) -o "$@" -c "$<" +$(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o: ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_ara.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_CONSOLEAPP) $(JUCE_CFLAGS_CONSOLEAPP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o: ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_lv2_libs.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_CONSOLEAPP) $(JUCE_CFLAGS_CONSOLEAPP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o: ../../JuceLibraryCode/include_juce_audio_utils.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling include_juce_audio_utils.cpp" diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj juce-7.0.0~ds0/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj --- juce-6.1.5~ds0/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj 2022-06-21 07:56:28.000000000 +0000 @@ -18,14 +18,15 @@ 33D24B475EA928745A87EDDB /* include_juce_audio_devices.mm */ = {isa = PBXBuildFile; fileRef = 00CDB93410EA5AECBA5ADA95; }; 3822F598DA7044E5DB7633A9 /* include_juce_audio_utils.mm */ = {isa = PBXBuildFile; fileRef = 846E187EC2E797B982861CA4; }; 3866839F4051D104244870B1 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = 336A244E3C6460495F0A424C; }; + 44628795CE784DEE1B98F986 /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = C7F2704A6676859CCE14A4D1; }; 4BC57B0D2215621D90C8881C /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = D2EBC6292AE5AFC46EB10DAC; }; - 59004CE43AE081B4A6CE9E17 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = 1932D54A7FAE13BADBA3E9B5; }; 5CB3596030B0DD3763CAF85C /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = 302A999B2803C0D5C15D237C; }; 5FE50792EDC7638DE9A824B5 /* RecentFilesMenuTemplate.nib */ = {isa = PBXBuildFile; fileRef = 5C7BDD8DF72F2FC2D44D757A; }; 66FC7F44EEC9044E5C4A21C3 /* CoreAudio.framework */ = {isa = PBXBuildFile; fileRef = C0531453A002C480280C5F05; }; 6EB1A3B818863EF1787A9CCE /* AVFoundation.framework */ = {isa = PBXBuildFile; fileRef = 4B427AF10E722F9A362CEB73; }; 7164274FE42C7EC423455E05 /* include_juce_osc.cpp */ = {isa = PBXBuildFile; fileRef = A59D9064C3A2D7EC3DC45420; }; 74EC8AEC296DB2721EB438BF /* include_juce_audio_processors.mm */ = {isa = PBXBuildFile; fileRef = 3A26A3568F2C301EEED25288; }; + 79FE3F2D2EFAC333283E5D90 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 45FB94C047D1ECAACA9462B7; }; 8D51903C59161885903F60CC /* CoreMIDI.framework */ = {isa = PBXBuildFile; fileRef = 04C1B8BF62AA09E62B362913; }; 96EFF7BA261F57DD829324D8 /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = 7898C73DCA6FA9D9CF669D32; }; 9B48039CDFD679AD944BAC70 /* include_juce_core.mm */ = {isa = PBXBuildFile; fileRef = AB19DDC8458D2A420E6D8AC3; }; @@ -53,7 +54,6 @@ 080EAB9CF5AB2BD6B2BBB173 /* ConsoleApp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = UnitTestRunner; sourceTree = BUILT_PRODUCTS_DIR; }; 08ED235CBE02E0FB4BE4653E /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; 1088318C19CEB1861C58B3BA /* include_juce_video.mm */ /* include_juce_video.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_video.mm; path = ../../JuceLibraryCode/include_juce_video.mm; sourceTree = SOURCE_ROOT; }; - 1932D54A7FAE13BADBA3E9B5 /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; 1CA82C74AEC08421812BDCAC /* include_juce_opengl.mm */ /* include_juce_opengl.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_opengl.mm; path = ../../JuceLibraryCode/include_juce_opengl.mm; sourceTree = SOURCE_ROOT; }; 1DC921E6494548F5E73E1056 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; 2030A589A9355FE6A0F72428 /* Cocoa.framework */ /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; @@ -68,6 +68,7 @@ 3A26A3568F2C301EEED25288 /* include_juce_audio_processors.mm */ /* include_juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_processors.mm; path = ../../JuceLibraryCode/include_juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; 3D169C5EFBF6304F5CE4C35E /* include_juce_events.mm */ /* include_juce_events.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_events.mm; path = ../../JuceLibraryCode/include_juce_events.mm; sourceTree = SOURCE_ROOT; }; 4195CB317C364D778AE2ADB1 /* include_juce_gui_extra.mm */ /* include_juce_gui_extra.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_gui_extra.mm; path = ../../JuceLibraryCode/include_juce_gui_extra.mm; sourceTree = SOURCE_ROOT; }; + 45FB94C047D1ECAACA9462B7 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 4B427AF10E722F9A362CEB73 /* AVFoundation.framework */ /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 4BD792956FE7C22CB8FB691D /* include_juce_audio_basics.mm */ /* include_juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_basics.mm; path = ../../JuceLibraryCode/include_juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; 4CA19EC18C2BC536B3636842 /* include_juce_dsp.mm */ /* include_juce_dsp.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_dsp.mm; path = ../../JuceLibraryCode/include_juce_dsp.mm; sourceTree = SOURCE_ROOT; }; @@ -92,6 +93,7 @@ B72A2BF24B6FFD414CD3B1CA /* juce_video */ /* juce_video */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_video; path = ../../../../modules/juce_video; sourceTree = SOURCE_ROOT; }; B96EC82EC3D2813B50386198 /* include_juce_product_unlocking.mm */ /* include_juce_product_unlocking.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_product_unlocking.mm; path = ../../JuceLibraryCode/include_juce_product_unlocking.mm; sourceTree = SOURCE_ROOT; }; C0531453A002C480280C5F05 /* CoreAudio.framework */ /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + C7F2704A6676859CCE14A4D1 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; CC27F53A76BFB2675D2683A1 /* juce_opengl */ /* juce_opengl */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_opengl; path = ../../../../modules/juce_opengl; sourceTree = SOURCE_ROOT; }; D2EBC6292AE5AFC46EB10DAC /* WebKit.framework */ /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; D3BE73543708D756BDB8AEF7 /* juce_dsp */ /* juce_dsp */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_dsp; path = ../../../../modules/juce_dsp; sourceTree = SOURCE_ROOT; }; @@ -114,7 +116,6 @@ 96EFF7BA261F57DD829324D8, 6EB1A3B818863EF1787A9CCE, D82BA4D40F5686DAFF5E11FB, - 59004CE43AE081B4A6CE9E17, AA207299991F85938465BF65, 66FC7F44EEC9044E5C4A21C3, 3866839F4051D104244870B1, @@ -139,7 +140,6 @@ 7898C73DCA6FA9D9CF669D32, 4B427AF10E722F9A362CEB73, 99527F36B4484133087435CD, - 1932D54A7FAE13BADBA3E9B5, 2030A589A9355FE6A0F72428, C0531453A002C480280C5F05, 336A244E3C6460495F0A424C, @@ -163,6 +163,8 @@ 00CDB93410EA5AECBA5ADA95, A76DD7182C290A9020C96CA7, 3A26A3568F2C301EEED25288, + C7F2704A6676859CCE14A4D1, + 45FB94C047D1ECAACA9462B7, 846E187EC2E797B982861CA4, AB19DDC8458D2A420E6D8AC3, 08ED235CBE02E0FB4BE4653E, @@ -277,7 +279,7 @@ E1E93F2B4B2D17E011395520 = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; }; buildConfigurationList = 18FC121B1014F7999CD135D3; @@ -318,6 +320,8 @@ 33D24B475EA928745A87EDDB, FDDF955477BE7FEBC364E19B, 74EC8AEC296DB2721EB438BF, + 44628795CE784DEE1B98F986, + 79FE3F2D2EFAC333283E5D90, 3822F598DA7044E5DB7633A9, 9B48039CDFD679AD944BAC70, FC139F56BD13A2C78D21076E, @@ -404,7 +408,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -424,6 +428,8 @@ "JUCE_MODULE_AVAILABLE_juce_product_unlocking=1", "JUCE_MODULE_AVAILABLE_juce_video=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", + "JUCE_PLUGINHOST_VST3=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_STRICT_REFCOUNTEDPOINTER=1", "JUCE_STANDALONE_APPLICATION=1", "JUCE_UNIT_TESTS=1", @@ -434,13 +440,22 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", "$(inherited)", @@ -448,9 +463,10 @@ INSTALL_PATH = "/usr/bin"; LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.UnitTestRunner; PRODUCT_NAME = "UnitTestRunner"; USE_HEADERMAP = NO; @@ -525,7 +541,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60105", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -545,6 +561,8 @@ "JUCE_MODULE_AVAILABLE_juce_product_unlocking=1", "JUCE_MODULE_AVAILABLE_juce_video=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", + "JUCE_PLUGINHOST_VST3=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_STRICT_REFCOUNTEDPOINTER=1", "JUCE_STANDALONE_APPLICATION=1", "JUCE_UNIT_TESTS=1", @@ -555,22 +573,32 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", "$(inherited)", ); INSTALL_PATH = "/usr/bin"; MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.UnitTestRunner; PRODUCT_NAME = "UnitTestRunner"; USE_HEADERMAP = NO; diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj juce-7.0.0~ds0/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj --- juce-6.1.5~ds0/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -106,8 +107,8 @@ Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -122,7 +123,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -168,13 +170,13 @@ true - + true - + true - + true @@ -285,7 +287,7 @@ true - + true @@ -654,6 +656,9 @@ true + + true + true @@ -687,6 +692,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -756,15 +878,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -798,6 +938,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -816,6 +974,9 @@ true + + true + true @@ -828,6 +989,12 @@ true + + true + + + true + true @@ -894,9 +1061,15 @@ true + + true + true + + true + true @@ -912,6 +1085,9 @@ true + + true + true @@ -978,6 +1154,9 @@ true + + true + true @@ -1974,6 +2153,9 @@ true + + true + true @@ -2001,9 +2183,6 @@ true - - true - true @@ -2323,7 +2502,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2384,6 +2567,7 @@ + @@ -2572,6 +2756,7 @@ + @@ -2584,6 +2769,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2649,9 +2904,14 @@ + + + + + @@ -2672,6 +2932,11 @@ + + + + + @@ -2679,6 +2944,8 @@ + + @@ -2710,6 +2977,7 @@ + @@ -2718,6 +2986,8 @@ + + @@ -2926,6 +3196,7 @@ + @@ -3100,6 +3371,7 @@ + @@ -3123,6 +3395,7 @@ + @@ -3193,7 +3466,7 @@ - + @@ -3254,6 +3527,7 @@ + diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters juce-7.0.0~ds0/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters --- juce-6.1.5~ds0/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -149,6 +149,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -203,6 +329,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -553,13 +682,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -673,8 +802,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1048,6 +1177,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1084,6 +1216,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1153,6 +1402,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1162,9 +1417,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1198,6 +1465,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1216,6 +1501,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1231,6 +1519,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1312,9 +1606,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1330,6 +1630,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1396,6 +1699,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2437,6 +2743,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2473,9 +2782,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2857,6 +3163,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -3027,6 +3339,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3591,6 +3906,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3627,6 +3945,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3822,6 +4350,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3831,6 +4365,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3891,6 +4434,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3912,6 +4470,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -4005,6 +4569,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -4029,6 +4596,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4653,6 +5226,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5175,6 +5751,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -5244,6 +5823,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5454,7 +6036,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -5633,6 +6215,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj juce-7.0.0~ds0/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj --- juce-6.1.5~ds0/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -106,8 +107,8 @@ Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -122,7 +123,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -168,13 +170,13 @@ true - + true - + true - + true @@ -285,7 +287,7 @@ true - + true @@ -654,6 +656,9 @@ true + + true + true @@ -687,6 +692,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -756,15 +878,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -798,6 +938,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -816,6 +974,9 @@ true + + true + true @@ -828,6 +989,12 @@ true + + true + + + true + true @@ -894,9 +1061,15 @@ true + + true + true + + true + true @@ -912,6 +1085,9 @@ true + + true + true @@ -978,6 +1154,9 @@ true + + true + true @@ -1974,6 +2153,9 @@ true + + true + true @@ -2001,9 +2183,6 @@ true - - true - true @@ -2323,7 +2502,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2384,6 +2567,7 @@ + @@ -2572,6 +2756,7 @@ + @@ -2584,6 +2769,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2649,9 +2904,14 @@ + + + + + @@ -2672,6 +2932,11 @@ + + + + + @@ -2679,6 +2944,8 @@ + + @@ -2710,6 +2977,7 @@ + @@ -2718,6 +2986,8 @@ + + @@ -2926,6 +3196,7 @@ + @@ -3100,6 +3371,7 @@ + @@ -3123,6 +3395,7 @@ + @@ -3193,7 +3466,7 @@ - + @@ -3254,6 +3527,7 @@ + diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters juce-7.0.0~ds0/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters --- juce-6.1.5~ds0/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -149,6 +149,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -203,6 +329,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -553,13 +682,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -673,8 +802,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1048,6 +1177,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1084,6 +1216,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1153,6 +1402,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1162,9 +1417,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1198,6 +1465,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1216,6 +1501,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1231,6 +1519,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1312,9 +1606,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1330,6 +1630,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1396,6 +1699,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2437,6 +2743,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2473,9 +2782,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2857,6 +3163,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -3027,6 +3339,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3591,6 +3906,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3627,6 +3945,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3822,6 +4350,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3831,6 +4365,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3891,6 +4434,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3912,6 +4470,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -4005,6 +4569,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -4029,6 +4596,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4653,6 +5226,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5175,6 +5751,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -5244,6 +5823,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5454,7 +6036,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -5633,6 +6215,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj juce-7.0.0~ds0/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj --- juce-6.1.5~ds0/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -106,8 +107,8 @@ Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -122,7 +123,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -168,13 +170,13 @@ true - + true - + true - + true @@ -285,7 +287,7 @@ true - + true @@ -654,6 +656,9 @@ true + + true + true @@ -687,6 +692,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -756,15 +878,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -798,6 +938,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -816,6 +974,9 @@ true + + true + true @@ -828,6 +989,12 @@ true + + true + + + true + true @@ -894,9 +1061,15 @@ true + + true + true + + true + true @@ -912,6 +1085,9 @@ true + + true + true @@ -978,6 +1154,9 @@ true + + true + true @@ -1974,6 +2153,9 @@ true + + true + true @@ -2001,9 +2183,6 @@ true - - true - true @@ -2323,7 +2502,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2384,6 +2567,7 @@ + @@ -2572,6 +2756,7 @@ + @@ -2584,6 +2769,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2649,9 +2904,14 @@ + + + + + @@ -2672,6 +2932,11 @@ + + + + + @@ -2679,6 +2944,8 @@ + + @@ -2710,6 +2977,7 @@ + @@ -2718,6 +2986,8 @@ + + @@ -2926,6 +3196,7 @@ + @@ -3100,6 +3371,7 @@ + @@ -3123,6 +3395,7 @@ + @@ -3193,7 +3466,7 @@ - + @@ -3254,6 +3527,7 @@ + diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters juce-7.0.0~ds0/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters --- juce-6.1.5~ds0/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -149,6 +149,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -203,6 +329,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -553,13 +682,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -673,8 +802,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1048,6 +1177,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1084,6 +1216,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1153,6 +1402,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1162,9 +1417,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1198,6 +1465,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1216,6 +1501,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1231,6 +1519,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1312,9 +1606,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1330,6 +1630,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1396,6 +1699,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2437,6 +2743,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2473,9 +2782,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2857,6 +3163,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -3027,6 +3339,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3591,6 +3906,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3627,6 +3945,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3822,6 +4350,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3831,6 +4365,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3891,6 +4434,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3912,6 +4470,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -4005,6 +4569,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -4029,6 +4596,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4653,6 +5226,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5175,6 +5751,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -5244,6 +5823,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5454,7 +6036,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -5633,6 +6215,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/CMakeLists.txt juce-7.0.0~ds0/extras/UnitTestRunner/CMakeLists.txt --- juce-6.1.5~ds0/extras/UnitTestRunner/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -28,6 +28,8 @@ target_sources(UnitTestRunner PRIVATE Source/Main.cpp) target_compile_definitions(UnitTestRunner PRIVATE + JUCE_PLUGINHOST_LV2=1 + JUCE_PLUGINHOST_VST3=1 JUCE_UNIT_TESTS=1 JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0) diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp juce-7.0.0~ds0/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp --- juce-6.1.5~ds0/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp juce-7.0.0~ds0/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp --- juce-6.1.5~ds0/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/Source/Main.cpp juce-7.0.0~ds0/extras/UnitTestRunner/Source/Main.cpp --- juce-6.1.5~ds0/extras/UnitTestRunner/Source/Main.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/Source/Main.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/extras/UnitTestRunner/UnitTestRunner.jucer juce-7.0.0~ds0/extras/UnitTestRunner/UnitTestRunner.jucer --- juce-6.1.5~ds0/extras/UnitTestRunner/UnitTestRunner.jucer 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/UnitTestRunner/UnitTestRunner.jucer 2022-06-21 07:56:28.000000000 +0000 @@ -167,7 +167,7 @@ useGlobalPath="0"/> - + diff -Nru juce-6.1.5~ds0/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj juce-7.0.0~ds0/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj --- juce-6.1.5~ds0/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj 2022-06-21 07:56:28.000000000 +0000 @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -77,7 +77,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) $(OutDir)\juce_dll.lib @@ -105,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -118,7 +119,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) $(OutDir)\juce_dll.lib @@ -151,13 +153,13 @@ true - + true - + true - + true @@ -268,7 +270,7 @@ true - + true @@ -637,6 +639,9 @@ true + + true + true @@ -670,6 +675,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -739,15 +861,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -781,6 +921,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -799,6 +957,9 @@ true + + true + true @@ -811,6 +972,12 @@ true + + true + + + true + true @@ -877,9 +1044,15 @@ true + + true + true + + true + true @@ -895,6 +1068,9 @@ true + + true + true @@ -961,6 +1137,9 @@ true + + true + true @@ -1849,6 +2028,9 @@ true + + true + true @@ -1876,9 +2058,6 @@ true - - true - true @@ -2149,7 +2328,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2202,6 +2385,7 @@ + @@ -2390,6 +2574,7 @@ + @@ -2402,6 +2587,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2467,9 +2722,14 @@ + + + + + @@ -2490,6 +2750,11 @@ + + + + + @@ -2497,6 +2762,8 @@ + + @@ -2528,6 +2795,7 @@ + @@ -2536,6 +2804,8 @@ + + @@ -2697,6 +2967,7 @@ + @@ -2871,6 +3142,7 @@ + @@ -2894,6 +3166,7 @@ + @@ -2964,7 +3237,7 @@ - + @@ -3010,6 +3283,7 @@ + diff -Nru juce-6.1.5~ds0/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters juce-7.0.0~ds0/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters --- juce-6.1.5~ds0/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters 2022-06-21 07:56:28.000000000 +0000 @@ -134,6 +134,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -188,6 +314,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -481,13 +610,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -601,8 +730,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -976,6 +1105,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1012,6 +1144,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1081,6 +1330,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1090,9 +1345,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1126,6 +1393,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1144,6 +1429,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1159,6 +1447,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1240,9 +1534,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1258,6 +1558,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1324,6 +1627,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2254,6 +2560,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2290,9 +2599,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2620,6 +2926,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -2766,6 +3078,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3330,6 +3645,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3366,6 +3684,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3561,6 +4089,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3570,6 +4104,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3630,6 +4173,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3651,6 +4209,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -3744,6 +4308,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -3768,6 +4335,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4251,6 +4824,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -4773,6 +5349,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\mouse + JUCE Modules\juce_gui_basics\mouse @@ -4842,6 +5421,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5052,7 +5634,7 @@ JUCE Modules\juce_gui_extra\misc - + JUCE Modules\juce_gui_extra\native @@ -5186,6 +5768,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff -Nru juce-6.1.5~ds0/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_ara.cpp juce-7.0.0~ds0/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_ara.cpp --- juce-6.1.5~ds0/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_ara.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_ara.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff -Nru juce-6.1.5~ds0/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp juce-7.0.0~ds0/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp --- juce-6.1.5~ds0/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff -Nru juce-6.1.5~ds0/LICENSE.md juce-7.0.0~ds0/LICENSE.md --- juce-6.1.5~ds0/LICENSE.md 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/LICENSE.md 2022-06-21 07:56:28.000000000 +0000 @@ -1,7 +1,7 @@ # The JUCE Library **BY DOWNLOADING, INSTALLING OR USING ANY PART OF THE JUCE LIBRARY, YOU AGREE -TO THE [JUCE 6 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-6-licence) +TO THE [JUCE 7 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-7-licence) AND THE [JUCE PRIVACY POLICY](https://www.juce.com/juce-privacy-policy), WHICH ARE BINDING AGREEMENTS BETWEEN YOU AND RAW MATERIAL SOFTWARE LIMITED. IF YOU DO NOT AGREE TO THE TERMS, DO NOT USE THE JUCE LIBRARY.** @@ -14,7 +14,7 @@ institutions). All licenses allow you to commercially release applications as long as you do not exceed the Revenue Limit and pay the applicable Fees. Once your business hits the Revenue Limit for your JUCE license tier, to continue -distributing your Applications you will either have to upgrade your JUCE +distributing your Applications you will either have to upgrade your JUCE license, or instead release your Applications under the [GNU General Public License v.3](https://www.gnu.org/licenses/gpl-3.0.en.html), which means, amongst other things, that you must make the source code of your @@ -32,5 +32,6 @@ [www.juce.com](https://www.juce.com) FULL JUCE TERMS: -- [JUCE 6 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-6-licence) +- [JUCE 7 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-7-licence) - [JUCE PRIVACY POLICY](https://www.juce.com/juce-privacy-policy) + diff -Nru juce-6.1.5~ds0/modules/CMakeLists.txt juce-7.0.0~ds0/modules/CMakeLists.txt --- juce-6.1.5~ds0/modules/CMakeLists.txt 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # 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 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -44,3 +44,5 @@ juce_osc juce_product_unlocking juce_video) + +add_subdirectory(juce_audio_plugin_client) diff -Nru juce-6.1.5~ds0/modules/juce_analytics/analytics/juce_Analytics.cpp juce-7.0.0~ds0/modules/juce_analytics/analytics/juce_Analytics.cpp --- juce-6.1.5~ds0/modules/juce_analytics/analytics/juce_Analytics.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_analytics/analytics/juce_Analytics.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_analytics/analytics/juce_Analytics.h juce-7.0.0~ds0/modules/juce_analytics/analytics/juce_Analytics.h --- juce-6.1.5~ds0/modules/juce_analytics/analytics/juce_Analytics.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_analytics/analytics/juce_Analytics.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_analytics/analytics/juce_ButtonTracker.cpp juce-7.0.0~ds0/modules/juce_analytics/analytics/juce_ButtonTracker.cpp --- juce-6.1.5~ds0/modules/juce_analytics/analytics/juce_ButtonTracker.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_analytics/analytics/juce_ButtonTracker.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_analytics/analytics/juce_ButtonTracker.h juce-7.0.0~ds0/modules/juce_analytics/analytics/juce_ButtonTracker.h --- juce-6.1.5~ds0/modules/juce_analytics/analytics/juce_ButtonTracker.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_analytics/analytics/juce_ButtonTracker.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_analytics/destinations/juce_AnalyticsDestination.h juce-7.0.0~ds0/modules/juce_analytics/destinations/juce_AnalyticsDestination.h --- juce-6.1.5~ds0/modules/juce_analytics/destinations/juce_AnalyticsDestination.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_analytics/destinations/juce_AnalyticsDestination.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp juce-7.0.0~ds0/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp --- juce-6.1.5~ds0/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h juce-7.0.0~ds0/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h --- juce-6.1.5~ds0/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_analytics/juce_analytics.cpp juce-7.0.0~ds0/modules/juce_analytics/juce_analytics.cpp --- juce-6.1.5~ds0/modules/juce_analytics/juce_analytics.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_analytics/juce_analytics.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_analytics/juce_analytics.h juce-7.0.0~ds0/modules/juce_analytics/juce_analytics.h --- juce-6.1.5~ds0/modules/juce_analytics/juce_analytics.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_analytics/juce_analytics.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_analytics vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE analytics classes description: Classes to collect analytics and send to destinations website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h juce-7.0.0~ds0/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h --- juce-6.1.5~ds0/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -102,13 +102,13 @@ double getEffectiveRate() const { return pulldown ? (double) base / 1.001 : (double) base; } /** Returns a copy of this object with the specified base rate. */ - FrameRate withBaseRate (int x) const { return with (&FrameRate::base, x); } + JUCE_NODISCARD FrameRate withBaseRate (int x) const { return with (&FrameRate::base, x); } /** Returns a copy of this object with drop frames enabled or disabled, as specified. */ - FrameRate withDrop (bool x = true) const { return with (&FrameRate::drop, x); } + JUCE_NODISCARD FrameRate withDrop (bool x = true) const { return with (&FrameRate::drop, x); } /** Returns a copy of this object with pulldown enabled or disabled, as specified. */ - FrameRate withPullDown (bool x = true) const { return with (&FrameRate::pulldown, x); } + JUCE_NODISCARD FrameRate withPullDown (bool x = true) const { return with (&FrameRate::pulldown, x); } /** Returns true if this instance is equal to other. */ bool operator== (const FrameRate& other) const @@ -152,8 +152,60 @@ bool drop = false, pulldown = false; }; + /** Describes a musical time signature. + + @see PositionInfo::getTimeSignature() PositionInfo::setTimeSignature() + */ + struct JUCE_API TimeSignature + { + /** Time signature numerator, e.g. the 3 of a 3/4 time sig */ + int numerator = 4; + + /** Time signature denominator, e.g. the 4 of a 3/4 time sig */ + int denominator = 4; + + bool operator== (const TimeSignature& other) const + { + const auto tie = [] (auto& x) { return std::tie (x.numerator, x.denominator); }; + return tie (*this) == tie (other); + } + + bool operator!= (const TimeSignature& other) const + { + return ! operator== (other); + } + }; + + /** Holds the begin and end points of a looped region. + + @see PositionInfo::getIsLooping() PositionInfo::setIsLooping() PositionInfo::getLoopPoints() PositionInfo::setLoopPoints() + */ + struct JUCE_API LoopPoints + { + /** The current cycle start position in units of quarter-notes. */ + double ppqStart = 0; + + /** The current cycle end position in units of quarter-notes. */ + double ppqEnd = 0; + + bool operator== (const LoopPoints& other) const + { + const auto tie = [] (auto& x) { return std::tie (x.ppqStart, x.ppqEnd); }; + return tie (*this) == tie (other); + } + + bool operator!= (const LoopPoints& other) const + { + return ! operator== (other); + } + }; + //============================================================================== - /** This structure is filled-in by the AudioPlayHead::getCurrentPosition() method. + /** This type is deprecated; prefer PositionInfo instead. + + Some position info may be unavailable, depending on the host or plugin format. + Unfortunately, CurrentPositionInfo doesn't have any way of differentiating between + default values and values that have been set explicitly. */ struct JUCE_API CurrentPositionInfo { @@ -162,6 +214,7 @@ /** Time signature numerator, e.g. the 3 of a 3/4 time sig */ int timeSigNumerator = 4; + /** Time signature denominator, e.g. the 4 of a 3/4 time sig */ int timeSigDenominator = 4; @@ -248,7 +301,208 @@ }; //============================================================================== - /** Fills-in the given structure with details about the transport's + /** + Describes the time at the start of the current audio callback. + + Not all hosts and plugin formats can provide all of the possible time + information, so most of the getter functions in this class return + an Optional that will only be engaged if the host provides the corresponding + information. As a plugin developer, you should code defensively so that + the plugin behaves sensibly even when the host fails to provide timing + information. + + A default-constructed instance of this class will return nullopt from + all functions that return an Optional. + */ + class PositionInfo + { + public: + /** Returns the number of samples that have elapsed. */ + Optional getTimeInSamples() const { return getOptional (flagTimeSamples, timeInSamples); } + + /** @see getTimeInSamples() */ + void setTimeInSamples (Optional timeInSamplesIn) { setOptional (flagTimeSamples, timeInSamples, timeInSamplesIn); } + + /** Returns the number of samples that have elapsed. */ + Optional getTimeInSeconds() const { return getOptional (flagTimeSeconds, timeInSeconds); } + + /** @see getTimeInSamples() */ + void setTimeInSeconds (Optional timeInSecondsIn) { setOptional (flagTimeSeconds, timeInSeconds, timeInSecondsIn); } + + /** Returns the bpm, if available. */ + Optional getBpm() const { return getOptional (flagTempo, tempoBpm); } + + /** @see getBpm() */ + void setBpm (Optional bpmIn) { setOptional (flagTempo, tempoBpm, bpmIn); } + + /** Returns the time signature, if available. */ + Optional getTimeSignature() const { return getOptional (flagTimeSignature, timeSignature); } + + /** @see getTimeSignature() */ + void setTimeSignature (Optional timeSignatureIn) { setOptional (flagTimeSignature, timeSignature, timeSignatureIn); } + + /** Returns host loop points, if available. */ + Optional getLoopPoints() const { return getOptional (flagLoopPoints, loopPoints); } + + /** @see getLoopPoints() */ + void setLoopPoints (Optional loopPointsIn) { setOptional (flagLoopPoints, loopPoints, loopPointsIn); } + + /** The number of bars since the beginning of the timeline. + + This value isn't available in all hosts or in all plugin formats. + */ + Optional getBarCount() const { return getOptional (flagBarCount, barCount); } + + /** @see getBarCount() */ + void setBarCount (Optional barCountIn) { setOptional (flagBarCount, barCount, barCountIn); } + + /** The position of the start of the last bar, in units of quarter-notes. + + This is the time from the start of the timeline to the start of the current + bar, in ppq units. + + Note - this value may be unavailable on some hosts, e.g. Pro-Tools. + */ + Optional getPpqPositionOfLastBarStart() const { return getOptional (flagLastBarStartPpq, lastBarStartPpq); } + + /** @see getPpqPositionOfLastBarStart() */ + void setPpqPositionOfLastBarStart (Optional positionIn) { setOptional (flagLastBarStartPpq, lastBarStartPpq, positionIn); } + + /** The video frame rate, if available. */ + Optional getFrameRate() const { return getOptional (flagFrameRate, frame); } + + /** @see getFrameRate() */ + void setFrameRate (Optional frameRateIn) { setOptional (flagFrameRate, frame, frameRateIn); } + + /** The current play position, in units of quarter-notes. */ + Optional getPpqPosition() const { return getOptional (flagPpqPosition, positionPpq); } + + /** @see getPpqPosition() */ + void setPpqPosition (Optional ppqPositionIn) { setOptional (flagPpqPosition, positionPpq, ppqPositionIn); } + + /** For timecode, the position of the start of the timeline, in seconds from 00:00:00:00. */ + Optional getEditOriginTime() const { return getOptional (flagOriginTime, originTime); } + + /** @see getEditOriginTime() */ + void setEditOriginTime (Optional editOriginTimeIn) { setOptional (flagOriginTime, originTime, editOriginTimeIn); } + + /** Get the host's callback time in nanoseconds, if available. */ + Optional getHostTimeNs() const { return getOptional (flagHostTimeNs, hostTimeNs); } + + /** @see getHostTimeNs() */ + void setHostTimeNs (Optional hostTimeNsIn) { setOptional (flagHostTimeNs, hostTimeNs, hostTimeNsIn); } + + /** True if the transport is currently playing. */ + bool getIsPlaying() const { return getFlag (flagIsPlaying); } + + /** @see getIsPlaying() */ + void setIsPlaying (bool isPlayingIn) { setFlag (flagIsPlaying, isPlayingIn); } + + /** True if the transport is currently recording. + + (When isRecording is true, then isPlaying will also be true). + */ + bool getIsRecording() const { return getFlag (flagIsRecording); } + + /** @see getIsRecording() */ + void setIsRecording (bool isRecordingIn) { setFlag (flagIsRecording, isRecordingIn); } + + /** True if the transport is currently looping. */ + bool getIsLooping() const { return getFlag (flagIsLooping); } + + /** @see getIsLooping() */ + void setIsLooping (bool isLoopingIn) { setFlag (flagIsLooping, isLoopingIn); } + + bool operator== (const PositionInfo& other) const noexcept + { + const auto tie = [] (const PositionInfo& i) + { + return std::make_tuple (i.getTimeInSamples(), + i.getTimeInSeconds(), + i.getPpqPosition(), + i.getEditOriginTime(), + i.getPpqPositionOfLastBarStart(), + i.getFrameRate(), + i.getBarCount(), + i.getTimeSignature(), + i.getBpm(), + i.getLoopPoints(), + i.getHostTimeNs(), + i.getIsPlaying(), + i.getIsRecording(), + i.getIsLooping()); + }; + + return tie (*this) == tie (other); + } + + bool operator!= (const PositionInfo& other) const noexcept + { + return ! operator== (other); + } + + private: + bool getFlag (int64_t flagToCheck) const + { + return (flagToCheck & flags) != 0; + } + + void setFlag (int64_t flagToCheck, bool value) + { + flags = (value ? flags | flagToCheck : flags & ~flagToCheck); + } + + template + Optional getOptional (int64_t flagToCheck, Value value) const + { + return getFlag (flagToCheck) ? makeOptional (std::move (value)) : nullopt; + } + + template + void setOptional (int64_t flagToCheck, Value& value, Optional opt) + { + if (opt.hasValue()) + value = *opt; + + setFlag (flagToCheck, opt.hasValue()); + } + + enum + { + flagTimeSignature = 1 << 0, + flagLoopPoints = 1 << 1, + flagFrameRate = 1 << 2, + flagTimeSeconds = 1 << 3, + flagLastBarStartPpq = 1 << 4, + flagPpqPosition = 1 << 5, + flagOriginTime = 1 << 6, + flagTempo = 1 << 7, + flagTimeSamples = 1 << 8, + flagBarCount = 1 << 9, + flagHostTimeNs = 1 << 10, + flagIsPlaying = 1 << 11, + flagIsRecording = 1 << 12, + flagIsLooping = 1 << 13 + }; + + TimeSignature timeSignature; + LoopPoints loopPoints; + FrameRate frame = FrameRateType::fps23976; + double timeInSeconds = 0.0; + double lastBarStartPpq = 0.0; + double positionPpq = 0.0; + double originTime = 0.0; + double tempoBpm = 0.0; + int64_t timeInSamples = 0; + int64_t barCount = 0; + uint64_t hostTimeNs = 0; + int64_t flags = 0; + }; + + //============================================================================== + /** Deprecated, use getPosition() instead. + + Fills-in the given structure with details about the transport's position at the start of the current processing block. If this method returns false then the current play head position is not available and the given structure will be undefined. @@ -258,7 +512,66 @@ in which a time would make sense, and some hosts will almost certainly have multithreading issues if it's not called on the audio thread. */ - virtual bool getCurrentPosition (CurrentPositionInfo& result) = 0; + [[deprecated ("Use getPosition instead. Not all hosts are able to provide all time position information; getPosition differentiates clearly between set and unset fields.")]] + bool getCurrentPosition (CurrentPositionInfo& result) + { + if (const auto pos = getPosition()) + { + result.resetToDefault(); + + if (const auto sig = pos->getTimeSignature()) + { + result.timeSigNumerator = sig->numerator; + result.timeSigDenominator = sig->denominator; + } + + if (const auto loop = pos->getLoopPoints()) + { + result.ppqLoopStart = loop->ppqStart; + result.ppqLoopEnd = loop->ppqEnd; + } + + if (const auto frame = pos->getFrameRate()) + result.frameRate = *frame; + + if (const auto timeInSeconds = pos->getTimeInSeconds()) + result.timeInSeconds = *timeInSeconds; + + if (const auto lastBarStartPpq = pos->getPpqPositionOfLastBarStart()) + result.ppqPositionOfLastBarStart = *lastBarStartPpq; + + if (const auto ppqPosition = pos->getPpqPosition()) + result.ppqPosition = *ppqPosition; + + if (const auto originTime = pos->getEditOriginTime()) + result.editOriginTime = *originTime; + + if (const auto bpm = pos->getBpm()) + result.bpm = *bpm; + + if (const auto timeInSamples = pos->getTimeInSamples()) + result.timeInSamples = *timeInSamples; + + return true; + } + + return false; + } + + /** Fetches details about the transport's position at the start of the current + processing block. If this method returns nullopt then the current play head + position is not available. + + A non-null return value just indicates that the host was able to provide + *some* relevant timing information. Individual PositionInfo getters may + still return nullopt. + + You can ONLY call this from your processBlock() method! Calling it at other + times will produce undefined behaviour, as the host may not have any context + in which a time would make sense, and some hosts will almost certainly have + multithreading issues if it's not called on the audio thread. + */ + virtual Optional getPosition() const = 0; /** Returns true if this object can control the transport. */ virtual bool canControlTransport() { return false; } diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -544,49 +544,55 @@ { retval.add (AudioChannelSet::discreteChannels (numChannels)); - if (numChannels == 1) + retval.addArray ([numChannels]() -> Array { - retval.add (AudioChannelSet::mono()); - } - else if (numChannels == 2) - { - retval.add (AudioChannelSet::stereo()); - } - else if (numChannels == 3) - { - retval.add (AudioChannelSet::createLCR()); - retval.add (AudioChannelSet::createLRS()); - } - else if (numChannels == 4) - { - retval.add (AudioChannelSet::quadraphonic()); - retval.add (AudioChannelSet::createLCRS()); - } - else if (numChannels == 5) - { - retval.add (AudioChannelSet::create5point0()); - retval.add (AudioChannelSet::pentagonal()); - } - else if (numChannels == 6) - { - retval.add (AudioChannelSet::create5point1()); - retval.add (AudioChannelSet::create6point0()); - retval.add (AudioChannelSet::create6point0Music()); - retval.add (AudioChannelSet::hexagonal()); - } - else if (numChannels == 7) - { - retval.add (AudioChannelSet::create7point0()); - retval.add (AudioChannelSet::create7point0SDDS()); - retval.add (AudioChannelSet::create6point1()); - retval.add (AudioChannelSet::create6point1Music()); - } - else if (numChannels == 8) - { - retval.add (AudioChannelSet::create7point1()); - retval.add (AudioChannelSet::create7point1SDDS()); - retval.add (AudioChannelSet::octagonal()); - } + switch (numChannels) + { + case 1: + return { AudioChannelSet::mono() }; + case 2: + return { AudioChannelSet::stereo() }; + case 3: + return { AudioChannelSet::createLCR(), + AudioChannelSet::createLRS() }; + case 4: + return { AudioChannelSet::quadraphonic(), + AudioChannelSet::createLCRS() }; + case 5: + return { AudioChannelSet::create5point0(), + AudioChannelSet::pentagonal() }; + case 6: + return { AudioChannelSet::create5point1(), + AudioChannelSet::create6point0(), + AudioChannelSet::create6point0Music(), + AudioChannelSet::hexagonal() }; + case 7: + return { AudioChannelSet::create7point0(), + AudioChannelSet::create7point0SDDS(), + AudioChannelSet::create6point1(), + AudioChannelSet::create6point1Music() }; + case 8: + return { AudioChannelSet::create7point1(), + AudioChannelSet::create7point1SDDS(), + AudioChannelSet::octagonal(), + AudioChannelSet::create5point1point2() }; + case 9: + return { AudioChannelSet::create7point0point2() }; + case 10: + return { AudioChannelSet::create5point1point4(), + AudioChannelSet::create7point1point2() }; + case 11: + return { AudioChannelSet::create7point0point4() }; + case 12: + return { AudioChannelSet::create7point1point4() }; + case 14: + return { AudioChannelSet::create7point1point6() }; + case 16: + return { AudioChannelSet::create9point1point6() }; + } + + return {}; + }()); auto order = getAmbisonicOrderForNumChannels (numChannels); if (order >= 0) diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h --- juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -240,7 +240,13 @@ /** Creates a set for a 9.1.6 surround setup (left, right, centre, LFE, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, wideLeft, wideRight, topFrontLeft, topFrontRight, topSideLeft, topSideRight, topRearLeft, topRearRight). - Is equivalent to: kAudioChannelLayoutTag_Atmos_9_1_6 (CoreAudio). + Note that the VST3 layout arranges the front speakers "L Lc C Rc R", but the JUCE layout + uses the arrangement "wideLeft left centre right wideRight". To maintain the relative + positions of the speakers, the channels will be remapped accordingly. This means that the + VST3 host's "L" channel will be received on a JUCE plugin's "wideLeft" channel, the + "Lc" channel will be received on a JUCE plugin's "left" channel, and so on. + + Is equivalent to: k91_6 (VST3), kAudioChannelLayoutTag_Atmos_9_1_6 (CoreAudio). */ static AudioChannelSet JUCE_CALLTYPE create9point1point6(); diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h --- juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -23,8 +23,8 @@ namespace juce { -AudioProcessLoadMeasurer::AudioProcessLoadMeasurer() = default; -AudioProcessLoadMeasurer::~AudioProcessLoadMeasurer() = default; +AudioProcessLoadMeasurer::AudioProcessLoadMeasurer() = default; +AudioProcessLoadMeasurer::~AudioProcessLoadMeasurer() = default; void AudioProcessLoadMeasurer::reset() { @@ -33,40 +33,47 @@ void AudioProcessLoadMeasurer::reset (double sampleRate, int blockSize) { + const SpinLock::ScopedLockType lock (mutex); + cpuUsageProportion = 0; xruns = 0; samplesPerBlock = blockSize; - - if (sampleRate > 0.0 && blockSize > 0) - { - msPerSample = 1000.0 / sampleRate; - timeToCpuScale = (msPerSample > 0.0) ? (1.0 / msPerSample) : 0.0; - } - else - { - msPerSample = 0; - timeToCpuScale = 0; - } + msPerSample = (sampleRate > 0.0 && blockSize > 0) ? 1000.0 / sampleRate : 0; } void AudioProcessLoadMeasurer::registerBlockRenderTime (double milliseconds) { - registerRenderTime (milliseconds, samplesPerBlock); + const SpinLock::ScopedTryLockType lock (mutex); + + if (lock.isLocked()) + registerRenderTimeLocked (milliseconds, samplesPerBlock); } void AudioProcessLoadMeasurer::registerRenderTime (double milliseconds, int numSamples) { + const SpinLock::ScopedTryLockType lock (mutex); + + if (lock.isLocked()) + registerRenderTimeLocked (milliseconds, numSamples); +} + +void AudioProcessLoadMeasurer::registerRenderTimeLocked (double milliseconds, int numSamples) +{ + if (msPerSample == 0) + return; + const auto maxMilliseconds = numSamples * msPerSample; const auto usedProportion = milliseconds / maxMilliseconds; const auto filterAmount = 0.2; - cpuUsageProportion += filterAmount * (usedProportion - cpuUsageProportion); + const auto proportion = cpuUsageProportion.load(); + cpuUsageProportion = proportion + filterAmount * (usedProportion - proportion); if (milliseconds > maxMilliseconds) ++xruns; } -double AudioProcessLoadMeasurer::getLoadAsProportion() const { return jlimit (0.0, 1.0, cpuUsageProportion); } +double AudioProcessLoadMeasurer::getLoadAsProportion() const { return jlimit (0.0, 1.0, cpuUsageProportion.load()); } double AudioProcessLoadMeasurer::getLoadAsPercentage() const { return 100.0 * getLoadAsProportion(); } int AudioProcessLoadMeasurer::getXRunCount() const { return xruns; } diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h --- juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -96,8 +96,13 @@ void registerRenderTime (double millisecondsTaken, int numSamples); private: - double cpuUsageProportion = 0, timeToCpuScale = 0, msPerSample = 0; - int xruns = 0, samplesPerBlock = 0; + void registerRenderTimeLocked (double, int); + + SpinLock mutex; + int samplesPerBlock = 0; + double msPerSample = 0; + std::atomic cpuUsageProportion { 0 }; + std::atomic xruns { 0 }; }; diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h --- juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -23,53 +23,6 @@ namespace juce { -#ifndef DOXYGEN -/** The contents of this namespace are used to implement AudioBuffer and should - not be used elsewhere. Their interfaces (and existence) are liable to change! -*/ -namespace detail -{ - /** On iOS/arm7 the alignment of `double` is greater than the alignment of - `std::max_align_t`, so we can't trust max_align_t. Instead, we query - lots of primitive types and use the maximum alignment of all of them. - - We're putting this stuff outside AudioBuffer itself to avoid creating - unnecessary copies for each distinct template instantiation of - AudioBuffer. - - MSVC 2015 doesn't like when we write getMaxAlignment as a loop which - accumulates the max alignment (declarations not allowed in constexpr - function body) so instead we use this recursive version which - instantiates a zillion templates. - */ - - template struct Type {}; - - constexpr size_t getMaxAlignment() noexcept { return 0; } - - template - constexpr size_t getMaxAlignment (Type, Type... tail) noexcept - { - return jmax (alignof (Head), getMaxAlignment (tail...)); - } - - constexpr size_t maxAlignment = getMaxAlignment (Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}); -} // namespace detail -#endif - //============================================================================== /** A multi-channel buffer containing floating point audio samples. @@ -1215,17 +1168,10 @@ private: //============================================================================== - int numChannels = 0, size = 0; - size_t allocatedBytes = 0; - Type** channels; - HeapBlock allocatedData; - Type* preallocatedChannelSpace[32]; - bool isClear = false; - void allocateData() { #if (! JUCE_GCC || (__GNUC__ * 100 + __GNUC_MINOR__) >= 409) - static_assert (alignof (Type) <= detail::maxAlignment, + static_assert (alignof (Type) <= maxAlignment, "AudioBuffer cannot hold types with alignment requirements larger than that guaranteed by malloc"); #endif jassert (size >= 0); @@ -1278,6 +1224,43 @@ isClear = false; } + /* On iOS/arm7 the alignment of `double` is greater than the alignment of + `std::max_align_t`, so we can't trust max_align_t. Instead, we query + lots of primitive types and use the maximum alignment of all of them. + */ + static constexpr size_t getMaxAlignment() noexcept + { + constexpr size_t alignments[] { alignof (std::max_align_t), + alignof (void*), + alignof (float), + alignof (double), + alignof (long double), + alignof (short int), + alignof (int), + alignof (long int), + alignof (long long int), + alignof (bool), + alignof (char), + alignof (char16_t), + alignof (char32_t), + alignof (wchar_t) }; + + size_t max = 0; + + for (const auto elem : alignments) + max = jmax (max, elem); + + return max; + } + + int numChannels = 0, size = 0; + size_t allocatedBytes = 0; + Type** channels; + HeapBlock allocatedData; + Type* preallocatedChannelSpace[32]; + bool isClear = false; + static constexpr size_t maxAlignment = getMaxAlignment(); + JUCE_LEAK_DETECTOR (AudioBuffer) }; diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -1177,245 +1177,245 @@ //============================================================================== template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::clear (FloatType* dest, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::clear (FloatType* dest, + CountType numValues) noexcept { FloatVectorHelpers::clear (dest, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::fill (FloatType* dest, - FloatType valueToFill, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::fill (FloatType* dest, + FloatType valueToFill, + CountType numValues) noexcept { FloatVectorHelpers::fill (dest, valueToFill, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::copy (FloatType* dest, - const FloatType* src, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::copy (FloatType* dest, + const FloatType* src, + CountType numValues) noexcept { memcpy (dest, src, (size_t) numValues * sizeof (FloatType)); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::copyWithMultiply (FloatType* dest, - const FloatType* src, - FloatType multiplier, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::copyWithMultiply (FloatType* dest, + const FloatType* src, + FloatType multiplier, + CountType numValues) noexcept { FloatVectorHelpers::copyWithMultiply (dest, src, multiplier, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::add (FloatType* dest, - FloatType amountToAdd, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::add (FloatType* dest, + FloatType amountToAdd, + CountType numValues) noexcept { FloatVectorHelpers::add (dest, amountToAdd, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::add (FloatType* dest, - const FloatType* src, - FloatType amount, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::add (FloatType* dest, + const FloatType* src, + FloatType amount, + CountType numValues) noexcept { FloatVectorHelpers::add (dest, src, amount, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::add (FloatType* dest, - const FloatType* src, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::add (FloatType* dest, + const FloatType* src, + CountType numValues) noexcept { FloatVectorHelpers::add (dest, src, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::add (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::add (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType num) noexcept { FloatVectorHelpers::add (dest, src1, src2, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::subtract (FloatType* dest, - const FloatType* src, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::subtract (FloatType* dest, + const FloatType* src, + CountType numValues) noexcept { FloatVectorHelpers::subtract (dest, src, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::subtract (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::subtract (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType num) noexcept { FloatVectorHelpers::subtract (dest, src1, src2, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::addWithMultiply (FloatType* dest, - const FloatType* src, - FloatType multiplier, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::addWithMultiply (FloatType* dest, + const FloatType* src, + FloatType multiplier, + CountType numValues) noexcept { FloatVectorHelpers::addWithMultiply (dest, src, multiplier, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::addWithMultiply (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::addWithMultiply (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType num) noexcept { FloatVectorHelpers::addWithMultiply (dest, src1, src2, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::subtractWithMultiply (FloatType* dest, - const FloatType* src, - FloatType multiplier, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::subtractWithMultiply (FloatType* dest, + const FloatType* src, + FloatType multiplier, + CountType numValues) noexcept { FloatVectorHelpers::subtractWithMultiply (dest, src, multiplier, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::subtractWithMultiply (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::subtractWithMultiply (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType num) noexcept { FloatVectorHelpers::subtractWithMultiply (dest, src1, src2, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::multiply (FloatType* dest, - const FloatType* src, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::multiply (FloatType* dest, + const FloatType* src, + CountType numValues) noexcept { FloatVectorHelpers::multiply (dest, src, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::multiply (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::multiply (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType numValues) noexcept { FloatVectorHelpers::multiply (dest, src1, src2, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::multiply (FloatType* dest, - FloatType multiplier, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::multiply (FloatType* dest, + FloatType multiplier, + CountType numValues) noexcept { FloatVectorHelpers::multiply (dest, multiplier, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::multiply (FloatType* dest, - const FloatType* src, - FloatType multiplier, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::multiply (FloatType* dest, + const FloatType* src, + FloatType multiplier, + CountType num) noexcept { FloatVectorHelpers::multiply (dest, src, multiplier, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::negate (FloatType* dest, - const FloatType* src, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::negate (FloatType* dest, + const FloatType* src, + CountType numValues) noexcept { FloatVectorHelpers::negate (dest, src, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::abs (FloatType* dest, - const FloatType* src, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::abs (FloatType* dest, + const FloatType* src, + CountType numValues) noexcept { FloatVectorHelpers::abs (dest, src, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::min (FloatType* dest, - const FloatType* src, - FloatType comp, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::min (FloatType* dest, + const FloatType* src, + FloatType comp, + CountType num) noexcept { FloatVectorHelpers::min (dest, src, comp, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::min (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::min (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType num) noexcept { FloatVectorHelpers::min (dest, src1, src2, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::max (FloatType* dest, - const FloatType* src, - FloatType comp, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::max (FloatType* dest, + const FloatType* src, + FloatType comp, + CountType num) noexcept { FloatVectorHelpers::max (dest, src, comp, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::max (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::max (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType num) noexcept { FloatVectorHelpers::max (dest, src1, src2, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::clip (FloatType* dest, - const FloatType* src, - FloatType low, - FloatType high, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::clip (FloatType* dest, + const FloatType* src, + FloatType low, + FloatType high, + CountType num) noexcept { FloatVectorHelpers::clip (dest, src, low, high, num); } template -Range JUCE_CALLTYPE detail::FloatVectorOperationsBase::findMinAndMax (const FloatType* src, - CountType numValues) noexcept +Range JUCE_CALLTYPE FloatVectorOperationsBase::findMinAndMax (const FloatType* src, + CountType numValues) noexcept { return FloatVectorHelpers::findMinAndMax (src, numValues); } template -FloatType JUCE_CALLTYPE detail::FloatVectorOperationsBase::findMinimum (const FloatType* src, - CountType numValues) noexcept +FloatType JUCE_CALLTYPE FloatVectorOperationsBase::findMinimum (const FloatType* src, + CountType numValues) noexcept { return FloatVectorHelpers::findMinimum (src, numValues); } template -FloatType JUCE_CALLTYPE detail::FloatVectorOperationsBase::findMaximum (const FloatType* src, - CountType numValues) noexcept +FloatType JUCE_CALLTYPE FloatVectorOperationsBase::findMaximum (const FloatType* src, + CountType numValues) noexcept { return FloatVectorHelpers::findMaximum (src, numValues); } -template struct detail::FloatVectorOperationsBase; -template struct detail::FloatVectorOperationsBase; -template struct detail::FloatVectorOperationsBase; -template struct detail::FloatVectorOperationsBase; +template struct FloatVectorOperationsBase; +template struct FloatVectorOperationsBase; +template struct FloatVectorOperationsBase; +template struct FloatVectorOperationsBase; void JUCE_CALLTYPE FloatVectorOperations::convertFixedToFloat (float* dest, const int* src, float multiplier, size_t num) noexcept { @@ -1567,7 +1567,7 @@ const int num = random.nextInt (range) + 1; HeapBlock buffer1 (num + 16), buffer2 (num + 16); - HeapBlock buffer3 (num + 16); + HeapBlock buffer3 (num + 16, true); #if JUCE_ARM ValueType* const data1 = buffer1; diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h --- juce-6.1.5~ds0/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -32,43 +32,116 @@ #endif class ScopedNoDenormals; -#if ! DOXYGEN -namespace detail -{ +//============================================================================== +/** + A collection of simple vector operations on arrays of floating point numbers, + accelerated with SIMD instructions where possible, usually accessed from + the FloatVectorOperations class. + + @code + float data[64]; + + // The following two function calls are equivalent: + FloatVectorOperationsBase::clear (data, 64); + FloatVectorOperations::clear (data, 64); + @endcode + @see FloatVectorOperations + + @tags{Audio} +*/ template struct FloatVectorOperationsBase { + /** Clears a vector of floating point numbers. */ static void JUCE_CALLTYPE clear (FloatType* dest, CountType numValues) noexcept; + + /** Copies a repeated value into a vector of floating point numbers. */ static void JUCE_CALLTYPE fill (FloatType* dest, FloatType valueToFill, CountType numValues) noexcept; + + /** Copies a vector of floating point numbers. */ static void JUCE_CALLTYPE copy (FloatType* dest, const FloatType* src, CountType numValues) noexcept; + + /** Copies a vector of floating point numbers, multiplying each value by a given multiplier */ static void JUCE_CALLTYPE copyWithMultiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType numValues) noexcept; + + /** Adds a fixed value to the destination values. */ static void JUCE_CALLTYPE add (FloatType* dest, FloatType amountToAdd, CountType numValues) noexcept; + + /** Adds a fixed value to each source value and stores it in the destination array. */ static void JUCE_CALLTYPE add (FloatType* dest, const FloatType* src, FloatType amount, CountType numValues) noexcept; + + /** Adds the source values to the destination values. */ static void JUCE_CALLTYPE add (FloatType* dest, const FloatType* src, CountType numValues) noexcept; + + /** Adds each source1 value to the corresponding source2 value and stores the result in the destination array. */ static void JUCE_CALLTYPE add (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept; + + /** Subtracts the source values from the destination values. */ static void JUCE_CALLTYPE subtract (FloatType* dest, const FloatType* src, CountType numValues) noexcept; + + /** Subtracts each source2 value from the corresponding source1 value and stores the result in the destination array. */ static void JUCE_CALLTYPE subtract (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept; + + /** Multiplies each source value by the given multiplier, then adds it to the destination value. */ static void JUCE_CALLTYPE addWithMultiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType numValues) noexcept; + + /** Multiplies each source1 value by the corresponding source2 value, then adds it to the destination value. */ static void JUCE_CALLTYPE addWithMultiply (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept; + + /** Multiplies each source value by the given multiplier, then subtracts it to the destination value. */ static void JUCE_CALLTYPE subtractWithMultiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType numValues) noexcept; + + /** Multiplies each source1 value by the corresponding source2 value, then subtracts it to the destination value. */ static void JUCE_CALLTYPE subtractWithMultiply (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept; + + /** Multiplies the destination values by the source values. */ static void JUCE_CALLTYPE multiply (FloatType* dest, const FloatType* src, CountType numValues) noexcept; + + /** Multiplies each source1 value by the correspinding source2 value, then stores it in the destination array. */ static void JUCE_CALLTYPE multiply (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType numValues) noexcept; + + /** Multiplies each of the destination values by a fixed multiplier. */ static void JUCE_CALLTYPE multiply (FloatType* dest, FloatType multiplier, CountType numValues) noexcept; + + /** Multiplies each of the source values by a fixed multiplier and stores the result in the destination array. */ static void JUCE_CALLTYPE multiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType num) noexcept; + + /** Copies a source vector to a destination, negating each value. */ static void JUCE_CALLTYPE negate (FloatType* dest, const FloatType* src, CountType numValues) noexcept; + + /** Copies a source vector to a destination, taking the absolute of each value. */ static void JUCE_CALLTYPE abs (FloatType* dest, const FloatType* src, CountType numValues) noexcept; + + /** Each element of dest will be the minimum of the corresponding element of the source array and the given comp value. */ static void JUCE_CALLTYPE min (FloatType* dest, const FloatType* src, FloatType comp, CountType num) noexcept; + + /** Each element of dest will be the minimum of the corresponding source1 and source2 values. */ static void JUCE_CALLTYPE min (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept; + + /** Each element of dest will be the maximum of the corresponding element of the source array and the given comp value. */ static void JUCE_CALLTYPE max (FloatType* dest, const FloatType* src, FloatType comp, CountType num) noexcept; + + /** Each element of dest will be the maximum of the corresponding source1 and source2 values. */ static void JUCE_CALLTYPE max (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept; + + /** Each element of dest is calculated by hard clipping the corresponding src element so that it is in the range specified by the arguments low and high. */ static void JUCE_CALLTYPE clip (FloatType* dest, const FloatType* src, FloatType low, FloatType high, CountType num) noexcept; + + /** Finds the minimum and maximum values in the given array. */ static Range JUCE_CALLTYPE findMinAndMax (const FloatType* src, CountType numValues) noexcept; + + /** Finds the minimum value in the given array. */ static FloatType JUCE_CALLTYPE findMinimum (const FloatType* src, CountType numValues) noexcept; + + /** Finds the maximum value in the given array. */ static FloatType JUCE_CALLTYPE findMaximum (const FloatType* src, CountType numValues) noexcept; }; +#if ! DOXYGEN +namespace detail +{ + template struct NameForwarder; @@ -135,15 +208,18 @@ //============================================================================== /** - A collection of simple vector operations on arrays of floats, accelerated with - SIMD instructions where possible. + A collection of simple vector operations on arrays of floating point numbers, + accelerated with SIMD instructions where possible and providing all methods + from FloatVectorOperationsBase. + + @see FloatVectorOperationsBase @tags{Audio} */ -class JUCE_API FloatVectorOperations : public detail::NameForwarder, - detail::FloatVectorOperationsBase, - detail::FloatVectorOperationsBase, - detail::FloatVectorOperationsBase> +class JUCE_API FloatVectorOperations : public detail::NameForwarder, + FloatVectorOperationsBase, + FloatVectorOperationsBase, + FloatVectorOperationsBase> { public: static void JUCE_CALLTYPE convertFixedToFloat (float* dest, const int* src, float multiplier, int num) noexcept; diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/juce_audio_basics.cpp juce-7.0.0~ds0/modules/juce_audio_basics/juce_audio_basics.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/juce_audio_basics.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/juce_audio_basics.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -95,5 +95,5 @@ #if JUCE_UNIT_TESTS #include "utilities/juce_ADSR_test.cpp" - #include "midi/ump/juce_UMPTests.cpp" + #include "midi/ump/juce_UMP_test.cpp" #endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/juce_audio_basics.h juce-7.0.0~ds0/modules/juce_audio_basics/juce_audio_basics.h --- juce-6.1.5~ds0/modules/juce_audio_basics/juce_audio_basics.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/juce_audio_basics.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -32,7 +32,7 @@ ID: juce_audio_basics vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE audio and MIDI data classes description: Classes for audio buffer manipulation, midi message handling, synthesis, etc. website: http://www.juce.com/juce @@ -120,4 +120,4 @@ #include "sources/juce_ReverbAudioSource.h" #include "sources/juce_ToneGeneratorAudioSource.h" #include "synthesisers/juce_Synthesiser.h" -#include "audio_play_head/juce_AudioPlayHead.h" +#include "audio_play_head/juce_AudioPlayHead.h" \ No newline at end of file diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/juce_audio_basics.mm juce-7.0.0~ds0/modules/juce_audio_basics/juce_audio_basics.mm --- juce-6.1.5~ds0/modules/juce_audio_basics/juce_audio_basics.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/juce_audio_basics.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiBuffer.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiBuffer.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiBuffer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiBuffer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiFile.cpp juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiFile.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiFile.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiFile.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -46,18 +46,6 @@ } } - template - struct Optional - { - Optional() = default; - - Optional (const Value& v) - : value (v), valid (true) {} - - Value value = Value(); - bool valid = false; - }; - template struct ReadTrait; @@ -100,23 +88,23 @@ auto ch = tryRead (data, remaining); - if (! ch.valid) + if (! ch.hasValue()) return {}; - if (ch.value != ByteOrder::bigEndianInt ("MThd")) + if (*ch != ByteOrder::bigEndianInt ("MThd")) { auto ok = false; - if (ch.value == ByteOrder::bigEndianInt ("RIFF")) + if (*ch == ByteOrder::bigEndianInt ("RIFF")) { for (int i = 0; i < 8; ++i) { ch = tryRead (data, remaining); - if (! ch.valid) + if (! ch.hasValue()) return {}; - if (ch.value == ByteOrder::bigEndianInt ("MThd")) + if (*ch == ByteOrder::bigEndianInt ("MThd")) { ok = true; break; @@ -130,29 +118,29 @@ const auto bytesRemaining = tryRead (data, remaining); - if (! bytesRemaining.valid || bytesRemaining.value > remaining) + if (! bytesRemaining.hasValue() || *bytesRemaining > remaining) return {}; const auto optFileType = tryRead (data, remaining); - if (! optFileType.valid || 2 < optFileType.value) + if (! optFileType.hasValue() || 2 < *optFileType) return {}; const auto optNumTracks = tryRead (data, remaining); - if (! optNumTracks.valid || (optFileType.value == 0 && optNumTracks.value != 1)) + if (! optNumTracks.hasValue() || (*optFileType == 0 && *optNumTracks != 1)) return {}; const auto optTimeFormat = tryRead (data, remaining); - if (! optTimeFormat.valid) + if (! optTimeFormat.hasValue()) return {}; HeaderDetails result; - result.fileType = (short) optFileType.value; - result.timeFormat = (short) optTimeFormat.value; - result.numberOfTracks = (short) optNumTracks.value; + result.fileType = (short) *optFileType; + result.timeFormat = (short) *optTimeFormat; + result.numberOfTracks = (short) *optNumTracks; result.bytesRead = maxSize - remaining; return { result }; @@ -373,10 +361,10 @@ const auto optHeader = MidiFileHelpers::parseMidiHeader (d, size); - if (! optHeader.valid) + if (! optHeader.hasValue()) return false; - const auto header = optHeader.value; + const auto header = *optHeader; timeFormat = header.timeFormat; d += header.bytesRead; @@ -386,20 +374,20 @@ { const auto optChunkType = MidiFileHelpers::tryRead (d, size); - if (! optChunkType.valid) + if (! optChunkType.hasValue()) return false; const auto optChunkSize = MidiFileHelpers::tryRead (d, size); - if (! optChunkSize.valid) + if (! optChunkSize.hasValue()) return false; - const auto chunkSize = optChunkSize.value; + const auto chunkSize = *optChunkSize; if (size < chunkSize) return false; - if (optChunkType.value == ByteOrder::bigEndianInt ("MTrk")) + if (*optChunkType == ByteOrder::bigEndianInt ("MTrk")) readNextTrack (d, (int) chunkSize, createMatchingNoteOffs); size -= chunkSize; @@ -610,7 +598,7 @@ { // No data const auto header = parseHeader ([] (OutputStream&) {}); - expect (! header.valid); + expect (! header.hasValue()); } { @@ -620,7 +608,7 @@ writeBytes (os, { 0xff }); }); - expect (! header.valid); + expect (! header.hasValue()); } { @@ -630,7 +618,7 @@ writeBytes (os, { 'M', 'T', 'h', 'd' }); }); - expect (! header.valid); + expect (! header.hasValue()); } { @@ -640,7 +628,7 @@ writeBytes (os, { 'M', 'T', 'h', 'd', 0, 0, 0, 6, 0, 0, 0, 16, 0, 1 }); }); - expect (! header.valid); + expect (! header.hasValue()); } { @@ -650,7 +638,7 @@ writeBytes (os, { 'M', 'T', 'h', 'd', 0, 0, 0, 6, 0, 5, 0, 16, 0, 1 }); }); - expect (! header.valid); + expect (! header.hasValue()); } { @@ -660,12 +648,12 @@ writeBytes (os, { 'M', 'T', 'h', 'd', 0, 0, 0, 6, 0, 1, 0, 16, 0, 1 }); }); - expect (header.valid); + expect (header.hasValue()); - expectEquals (header.value.fileType, (short) 1); - expectEquals (header.value.numberOfTracks, (short) 16); - expectEquals (header.value.timeFormat, (short) 1); - expectEquals ((int) header.value.bytesRead, 14); + expectEquals (header->fileType, (short) 1); + expectEquals (header->numberOfTracks, (short) 16); + expectEquals (header->timeFormat, (short) 1); + expectEquals ((int) header->bytesRead, 14); } } @@ -674,7 +662,7 @@ { // Empty input const auto file = parseFile ([] (OutputStream&) {}); - expect (! file.valid); + expect (! file.hasValue()); } { @@ -684,7 +672,7 @@ writeBytes (os, { 'M', 'T', 'h', 'd' }); }); - expect (! file.valid); + expect (! file.hasValue()); } { @@ -694,8 +682,8 @@ writeBytes (os, { 'M', 'T', 'h', 'd', 0, 0, 0, 6, 0, 1, 0, 0, 0, 1 }); }); - expect (file.valid); - expectEquals (file.value.getNumTracks(), 0); + expect (file.hasValue()); + expectEquals (file->getNumTracks(), 0); } { @@ -706,7 +694,7 @@ writeBytes (os, { 'M', 'T', 'r', '?' }); }); - expect (! file.valid); + expect (! file.hasValue()); } { @@ -717,9 +705,9 @@ writeBytes (os, { 'M', 'T', 'r', 'k', 0, 0, 0, 1, 0xff }); }); - expect (file.valid); - expectEquals (file.value.getNumTracks(), 1); - expectEquals (file.value.getTrack (0)->getNumEvents(), 0); + expect (file.hasValue()); + expectEquals (file->getNumTracks(), 1); + expectEquals (file->getTrack (0)->getNumEvents(), 0); } { @@ -730,7 +718,7 @@ writeBytes (os, { 'M', 'T', 'r', 'k', 0x0f, 0, 0, 0, 0xff }); }); - expect (! file.valid); + expect (! file.hasValue()); } { @@ -744,10 +732,10 @@ writeBytes (os, { 0x80, 0x00, 0x00 }); }); - expect (file.valid); - expectEquals (file.value.getNumTracks(), 1); + expect (file.hasValue()); + expectEquals (file->getNumTracks(), 1); - auto& track = *file.value.getTrack (0); + auto& track = *file->getTrack (0); expectEquals (track.getNumEvents(), 1); expect (track.getEventPointer (0)->message.isNoteOff()); expectEquals (track.getEventPointer (0)->message.getTimeStamp(), (double) 0x0f); @@ -766,7 +754,7 @@ } template - static MidiFileHelpers::Optional parseHeader (Fn&& fn) + static Optional parseHeader (Fn&& fn) { MemoryOutputStream os; fn (os); @@ -776,7 +764,7 @@ } template - static MidiFileHelpers::Optional parseFile (Fn&& fn) + static Optional parseFile (Fn&& fn) { MemoryOutputStream os; fn (os); diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiFile.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiFile.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiFile.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiFile.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -133,7 +133,7 @@ */ void findAllTimeSigEvents (MidiMessageSequence& timeSigEvents) const; - /** Makes a list of all the time-signature meta-events from all tracks in the midi file. + /** Makes a list of all the key-signature meta-events from all tracks in the midi file. @param keySigEvents a list to which all the events will be added */ void findAllKeySigEvents (MidiMessageSequence& keySigEvents) const; diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiMessage.cpp juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiMessage.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiMessage.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiMessage.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiMessage.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiMessage.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiMessage.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiMessage.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -306,63 +306,56 @@ //============================================================================== class OptionalPitchWheel { - int value = 0; - bool valid = false; + Optional value; public: void emit (int channel, Array& out) const { - if (valid) - out.add (MidiMessage::pitchWheel (channel, value)); + if (value.hasValue()) + out.add (MidiMessage::pitchWheel (channel, *value)); } void set (int v) { value = v; - valid = true; } }; class OptionalControllerValues { - int values[128]; + Optional values[128]; public: - OptionalControllerValues() - { - std::fill (std::begin (values), std::end (values), -1); - } - void emit (int channel, Array& out) const { for (auto it = std::begin (values); it != std::end (values); ++it) - if (*it != -1) - out.add (MidiMessage::controllerEvent (channel, (int) std::distance (std::begin (values), it), *it)); + if (it->hasValue()) + out.add (MidiMessage::controllerEvent (channel, (int) std::distance (std::begin (values), it), **it)); } void set (int controller, int value) { - values[controller] = value; + values[controller] = (char) value; } }; class OptionalProgramChange { - int value = -1, bankLSB = -1, bankMSB = -1; + Optional value, bankLSB, bankMSB; public: void emit (int channel, double time, Array& out) const { - if (value == -1) + if (! value.hasValue()) return; - if (bankLSB != -1 && bankMSB != -1) + if (bankLSB.hasValue() && bankMSB.hasValue()) { - out.add (MidiMessage::controllerEvent (channel, 0x00, bankMSB).withTimeStamp (time)); - out.add (MidiMessage::controllerEvent (channel, 0x20, bankLSB).withTimeStamp (time)); + out.add (MidiMessage::controllerEvent (channel, 0x00, *bankMSB).withTimeStamp (time)); + out.add (MidiMessage::controllerEvent (channel, 0x20, *bankLSB).withTimeStamp (time)); } - out.add (MidiMessage::programChange (channel, value).withTimeStamp (time)); + out.add (MidiMessage::programChange (channel, *value).withTimeStamp (time)); } // Returns true if this is a bank number change, and false otherwise. @@ -370,22 +363,21 @@ { switch (controller) { - case 0x00: bankMSB = v; return true; - case 0x20: bankLSB = v; return true; + case 0x00: bankMSB = (char) v; return true; + case 0x20: bankLSB = (char) v; return true; } return false; } - void setProgram (int v) { value = v; } + void setProgram (int v) { value = (char) v; } }; class ParameterNumberState { enum class Kind { rpn, nrpn }; - int newestRpnLsb = -1, newestRpnMsb = -1, newestNrpnLsb = -1, newestNrpnMsb = -1; - int lastSentLsb = -1, lastSentMsb = -1; + Optional newestRpnLsb, newestRpnMsb, newestNrpnLsb, newestNrpnMsb, lastSentLsb, lastSentMsb; Kind lastSentKind = Kind::rpn, newestKind = Kind::rpn; public: @@ -401,11 +393,11 @@ auto lastSent = std::tie (lastSentKind, lastSentMsb, lastSentLsb); const auto newest = std::tie (newestKind, newestMsb, newestLsb); - if (lastSent == newest || newestMsb == -1 || newestLsb == -1) + if (lastSent == newest || ! newestMsb.hasValue() || ! newestLsb.hasValue()) return; - out.add (MidiMessage::controllerEvent (channel, newestKind == Kind::rpn ? 0x65 : 0x63, newestMsb).withTimeStamp (time)); - out.add (MidiMessage::controllerEvent (channel, newestKind == Kind::rpn ? 0x64 : 0x62, newestLsb).withTimeStamp (time)); + out.add (MidiMessage::controllerEvent (channel, newestKind == Kind::rpn ? 0x65 : 0x63, *newestMsb).withTimeStamp (time)); + out.add (MidiMessage::controllerEvent (channel, newestKind == Kind::rpn ? 0x64 : 0x62, *newestLsb).withTimeStamp (time)); lastSent = newest; } @@ -415,10 +407,10 @@ { switch (controller) { - case 0x65: newestRpnMsb = value; newestKind = Kind::rpn; return true; - case 0x64: newestRpnLsb = value; newestKind = Kind::rpn; return true; - case 0x63: newestNrpnMsb = value; newestKind = Kind::nrpn; return true; - case 0x62: newestNrpnLsb = value; newestKind = Kind::nrpn; return true; + case 0x65: newestRpnMsb = (char) value; newestKind = Kind::rpn; return true; + case 0x64: newestRpnLsb = (char) value; newestKind = Kind::rpn; return true; + case 0x63: newestNrpnMsb = (char) value; newestKind = Kind::nrpn; return true; + case 0x62: newestNrpnLsb = (char) value; newestKind = Kind::nrpn; return true; } return false; diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiRPN.cpp juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiRPN.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiRPN.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiRPN.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -55,11 +55,6 @@ } //============================================================================== -MidiRPNDetector::ChannelState::ChannelState() noexcept - : parameterMSB (0xff), parameterLSB (0xff), valueMSB (0xff), valueLSB (0xff), isNRPN (false) -{ -} - bool MidiRPNDetector::ChannelState::handleController (int channel, int controllerNumber, int value, diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiRPN.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiRPN.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/juce_MidiRPN.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/juce_MidiRPN.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -95,14 +95,13 @@ //============================================================================== struct ChannelState { - ChannelState() noexcept; bool handleController (int channel, int controllerNumber, int value, MidiRPNMessage&) noexcept; void resetValue() noexcept; bool sendIfReady (int channel, MidiRPNMessage&) noexcept; - uint8 parameterMSB, parameterLSB, valueMSB, valueLSB; - bool isNRPN; + uint8 parameterMSB = 0xff, parameterLSB = 0xff, valueMSB = 0xff, valueLSB = 0xff; + bool isNRPN = false; }; //============================================================================== diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPacket.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPacket.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPacket.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPacket.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPackets.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPackets.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPackets.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPackets.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPConversion.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPConversion.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPConversion.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPConversion.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPConverters.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPConverters.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPConverters.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPConverters.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPFactory.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPFactory.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPFactory.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPFactory.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMP.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMP.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMP.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMP.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPIterator.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPIterator.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPIterator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPIterator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1018 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ +namespace universal_midi_packets +{ + +constexpr uint8_t operator""_u8 (unsigned long long int i) { return static_cast (i); } +constexpr uint16_t operator""_u16 (unsigned long long int i) { return static_cast (i); } +constexpr uint32_t operator""_u32 (unsigned long long int i) { return static_cast (i); } +constexpr uint64_t operator""_u64 (unsigned long long int i) { return static_cast (i); } + +class UniversalMidiPacketTests : public UnitTest +{ +public: + UniversalMidiPacketTests() + : UnitTest ("Universal MIDI Packet", UnitTestCategories::midi) + { + } + + void runTest() override + { + auto random = getRandom(); + + beginTest ("Short bytestream midi messages can be round-tripped through the UMP converter"); + { + Midi1ToBytestreamTranslator translator (0); + + forEachNonSysExTestMessage (random, [&] (const MidiMessage& m) + { + Packets packets; + Conversion::toMidi1 (m, packets); + expect (packets.size() == 1); + + // Make sure that the message type is correct + expect (Utils::getMessageType (packets.data()[0]) == ((m.getRawData()[0] >> 0x4) == 0xf ? 0x1 : 0x2)); + + translator.dispatch (View {packets.data() }, + 0, + [&] (const MidiMessage& roundTripped) + { + expect (equal (m, roundTripped)); + }); + }); + } + + beginTest ("Bytestream SysEx converts to universal packets"); + { + { + // Zero length message + Packets packets; + Conversion::toMidi1 (createRandomSysEx (random, 0), packets); + expect (packets.size() == 2); + + expect (packets.data()[0] == 0x30000000); + expect (packets.data()[1] == 0x00000000); + } + + { + const auto message = createRandomSysEx (random, 1); + Packets packets; + Conversion::toMidi1 (message, packets); + expect (packets.size() == 2); + + const auto* sysEx = message.getSysExData(); + expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x01, sysEx[0], 0)); + expect (packets.data()[1] == 0x00000000); + } + + { + const auto message = createRandomSysEx (random, 6); + Packets packets; + Conversion::toMidi1 (message, packets); + expect (packets.size() == 2); + + const auto* sysEx = message.getSysExData(); + expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x06, sysEx[0], sysEx[1])); + expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5])); + } + + { + const auto message = createRandomSysEx (random, 12); + Packets packets; + Conversion::toMidi1 (message, packets); + expect (packets.size() == 4); + + const auto* sysEx = message.getSysExData(); + expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x16, sysEx[0], sysEx[1])); + expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5])); + expect (packets.data()[2] == Utils::bytesToWord (0x30, 0x36, sysEx[6], sysEx[7])); + expect (packets.data()[3] == Utils::bytesToWord (sysEx[8], sysEx[9], sysEx[10], sysEx[11])); + } + + { + const auto message = createRandomSysEx (random, 13); + Packets packets; + Conversion::toMidi1 (message, packets); + expect (packets.size() == 6); + + const auto* sysEx = message.getSysExData(); + expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x16, sysEx[0], sysEx[1])); + expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5])); + expect (packets.data()[2] == Utils::bytesToWord (0x30, 0x26, sysEx[6], sysEx[7])); + expect (packets.data()[3] == Utils::bytesToWord (sysEx[8], sysEx[9], sysEx[10], sysEx[11])); + expect (packets.data()[4] == Utils::bytesToWord (0x30, 0x31, sysEx[12], 0)); + expect (packets.data()[5] == 0x00000000); + } + } + + ToBytestreamDispatcher converter (0); + Packets packets; + + const auto checkRoundTrip = [&] (const MidiBuffer& expected) + { + for (const auto meta : expected) + Conversion::toMidi1 (meta.getMessage(), packets); + + MidiBuffer output; + converter.dispatch (packets.data(), + packets.data() + packets.size(), + 0, + [&] (const MidiMessage& roundTripped) + { + output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); + }); + packets.clear(); + + expect (equal (expected, output)); + }; + + beginTest ("Long SysEx bytestream midi messages can be round-tripped through the UMP converter"); + { + for (auto length : { 0, 1, 2, 3, 4, 5, 6, 7, 13, 20, 100, 1000 }) + { + MidiBuffer expected; + expected.addEvent (createRandomSysEx (random, size_t (length)), 0); + checkRoundTrip (expected); + } + } + + beginTest ("UMP SysEx7 messages interspersed with utility messages convert to bytestream"); + { + const auto sysEx = createRandomSysEx (random, 100); + Packets originalPackets; + Conversion::toMidi1 (sysEx, originalPackets); + + Packets modifiedPackets; + + const auto addRandomUtilityUMP = [&] + { + const auto newPacket = createRandomUtilityUMP (random); + modifiedPackets.add (View (newPacket.data())); + }; + + for (const auto& packet : originalPackets) + { + addRandomUtilityUMP(); + modifiedPackets.add (packet); + addRandomUtilityUMP(); + } + + MidiBuffer output; + converter.dispatch (modifiedPackets.data(), + modifiedPackets.data() + modifiedPackets.size(), + 0, + [&] (const MidiMessage& roundTripped) + { + output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); + }); + + // All Utility messages should have been ignored + expect (output.getNumEvents() == 1); + + for (const auto meta : output) + expect (equal (meta.getMessage(), sysEx)); + } + + beginTest ("UMP SysEx7 messages interspersed with System Realtime messages convert to bytestream"); + { + const auto sysEx = createRandomSysEx (random, 200); + Packets originalPackets; + Conversion::toMidi1 (sysEx, originalPackets); + + Packets modifiedPackets; + MidiBuffer realtimeMessages; + + const auto addRandomRealtimeUMP = [&] + { + const auto newPacket = createRandomRealtimeUMP (random); + modifiedPackets.add (View (newPacket.data())); + realtimeMessages.addEvent (Midi1ToBytestreamTranslator::fromUmp (newPacket), 0); + }; + + for (const auto& packet : originalPackets) + { + addRandomRealtimeUMP(); + modifiedPackets.add (packet); + addRandomRealtimeUMP(); + } + + MidiBuffer output; + converter.dispatch (modifiedPackets.data(), + modifiedPackets.data() + modifiedPackets.size(), + 0, + [&] (const MidiMessage& roundTripped) + { + output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); + }); + + const auto numOutputs = output.getNumEvents(); + const auto numInputs = realtimeMessages.getNumEvents(); + expect (numOutputs == numInputs + 1); + + if (numOutputs == numInputs + 1) + { + const auto isMetadataEquivalent = [] (const MidiMessageMetadata& a, + const MidiMessageMetadata& b) + { + return equal (a.getMessage(), b.getMessage()); + }; + + auto it = output.begin(); + + for (const auto meta : realtimeMessages) + { + if (! isMetadataEquivalent (*it, meta)) + { + expect (equal ((*it).getMessage(), sysEx)); + ++it; + } + + expect (isMetadataEquivalent (*it, meta)); + ++it; + } + } + } + + beginTest ("UMP SysEx7 messages interspersed with System Realtime and Utility messages convert to bytestream"); + { + const auto sysEx = createRandomSysEx (random, 300); + Packets originalPackets; + Conversion::toMidi1 (sysEx, originalPackets); + + Packets modifiedPackets; + MidiBuffer realtimeMessages; + + const auto addRandomRealtimeUMP = [&] + { + const auto newPacket = createRandomRealtimeUMP (random); + modifiedPackets.add (View (newPacket.data())); + realtimeMessages.addEvent (Midi1ToBytestreamTranslator::fromUmp (newPacket), 0); + }; + + const auto addRandomUtilityUMP = [&] + { + const auto newPacket = createRandomUtilityUMP (random); + modifiedPackets.add (View (newPacket.data())); + }; + + for (const auto& packet : originalPackets) + { + addRandomRealtimeUMP(); + addRandomUtilityUMP(); + modifiedPackets.add (packet); + addRandomRealtimeUMP(); + addRandomUtilityUMP(); + } + + MidiBuffer output; + converter.dispatch (modifiedPackets.data(), + modifiedPackets.data() + modifiedPackets.size(), + 0, + [&] (const MidiMessage& roundTripped) + { + output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); + }); + + const auto numOutputs = output.getNumEvents(); + const auto numInputs = realtimeMessages.getNumEvents(); + expect (numOutputs == numInputs + 1); + + if (numOutputs == numInputs + 1) + { + const auto isMetadataEquivalent = [] (const MidiMessageMetadata& a, const MidiMessageMetadata& b) + { + return equal (a.getMessage(), b.getMessage()); + }; + + auto it = output.begin(); + + for (const auto meta : realtimeMessages) + { + if (! isMetadataEquivalent (*it, meta)) + { + expect (equal ((*it).getMessage(), sysEx)); + ++it; + } + + expect (isMetadataEquivalent (*it, meta)); + ++it; + } + } + } + + beginTest ("SysEx messages are terminated by non-Utility, non-Realtime messages"); + { + const auto noteOn = [&] + { + MidiBuffer b; + b.addEvent (MidiMessage::noteOn (1, uint8_t (64), uint8_t (64)), 0); + return b; + }(); + + const auto noteOnPackets = [&] + { + Packets p; + + for (const auto meta : noteOn) + Conversion::toMidi1 (meta.getMessage(), p); + + return p; + }(); + + const auto sysEx = createRandomSysEx (random, 300); + + const auto originalPackets = [&] + { + Packets p; + Conversion::toMidi1 (sysEx, p); + return p; + }(); + + const auto modifiedPackets = [&] + { + Packets p; + + const auto insertionPoint = std::next (originalPackets.begin(), 10); + std::for_each (originalPackets.begin(), + insertionPoint, + [&] (const View& view) { p.add (view); }); + + for (const auto& view : noteOnPackets) + p.add (view); + + std::for_each (insertionPoint, + originalPackets.end(), + [&] (const View& view) { p.add (view); }); + + return p; + }(); + + // modifiedPackets now contains some SysEx packets interrupted by a MIDI 1 noteOn + + MidiBuffer output; + + const auto pushToOutput = [&] (const Packets& p) + { + converter.dispatch (p.data(), + p.data() + p.size(), + 0, + [&] (const MidiMessage& roundTripped) + { + output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); + }); + }; + + pushToOutput (modifiedPackets); + + // Interrupted sysEx shouldn't be present + expect (equal (output, noteOn)); + + const auto newSysEx = createRandomSysEx (random, 300); + Packets newSysExPackets; + Conversion::toMidi1 (newSysEx, newSysExPackets); + + // If we push another midi event without interrupting it, + // it should get through without being modified, + // and it shouldn't be affected by the previous (interrupted) sysex. + + output.clear(); + pushToOutput (newSysExPackets); + + expect (output.getNumEvents() == 1); + + for (const auto meta : output) + expect (equal (meta.getMessage(), newSysEx)); + } + + beginTest ("Widening conversions work"); + { + // This is similar to the 'slow' example code from the MIDI 2.0 spec + const auto baselineScale = [] (uint32_t srcVal, uint32_t srcBits, uint32_t dstBits) + { + const auto scaleBits = (uint32_t) (dstBits - srcBits); + + auto bitShiftedValue = (uint32_t) (srcVal << scaleBits); + + const auto srcCenter = (uint32_t) (1 << (srcBits - 1)); + + if (srcVal <= srcCenter) + return bitShiftedValue; + + const auto repeatBits = (uint32_t) (srcBits - 1); + const auto repeatMask = (uint32_t) ((1 << repeatBits) - 1); + + auto repeatValue = (uint32_t) (srcVal & repeatMask); + + if (scaleBits > repeatBits) + repeatValue <<= scaleBits - repeatBits; + else + repeatValue >>= repeatBits - scaleBits; + + while (repeatValue != 0) + { + bitShiftedValue |= repeatValue; + repeatValue >>= repeatBits; + } + + return bitShiftedValue; + }; + + const auto baselineScale7To8 = [&] (uint8_t in) + { + return baselineScale (in, 7, 8); + }; + + const auto baselineScale7To16 = [&] (uint8_t in) + { + return baselineScale (in, 7, 16); + }; + + const auto baselineScale14To16 = [&] (uint16_t in) + { + return baselineScale (in, 14, 16); + }; + + const auto baselineScale7To32 = [&] (uint8_t in) + { + return baselineScale (in, 7, 32); + }; + + const auto baselineScale14To32 = [&] (uint16_t in) + { + return baselineScale (in, 14, 32); + }; + + for (auto i = 0; i != 100; ++i) + { + const auto rand = (uint8_t) random.nextInt (0x80); + expectEquals ((int64_t) Conversion::scaleTo8 (rand), + (int64_t) baselineScale7To8 (rand)); + } + + expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x00), (int64_t) 0x0000); + expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x0a), (int64_t) 0x1400); + expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x40), (int64_t) 0x8000); + expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x57), (int64_t) 0xaeba); + expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x7f), (int64_t) 0xffff); + + for (auto i = 0; i != 100; ++i) + { + const auto rand = (uint8_t) random.nextInt (0x80); + expectEquals ((int64_t) Conversion::scaleTo16 (rand), + (int64_t) baselineScale7To16 (rand)); + } + + for (auto i = 0; i != 100; ++i) + { + const auto rand = (uint16_t) random.nextInt (0x4000); + expectEquals ((int64_t) Conversion::scaleTo16 (rand), + (int64_t) baselineScale14To16 (rand)); + } + + for (auto i = 0; i != 100; ++i) + { + const auto rand = (uint8_t) random.nextInt (0x80); + expectEquals ((int64_t) Conversion::scaleTo32 (rand), + (int64_t) baselineScale7To32 (rand)); + } + + expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x0000), (int64_t) 0x00000000); + expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x2000), (int64_t) 0x80000000); + expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x3fff), (int64_t) 0xffffffff); + + for (auto i = 0; i != 100; ++i) + { + const auto rand = (uint16_t) random.nextInt (0x4000); + expectEquals ((int64_t) Conversion::scaleTo32 (rand), + (int64_t) baselineScale14To32 (rand)); + } + } + + beginTest ("Round-trip widening/narrowing conversions work"); + { + for (auto i = 0; i != 100; ++i) + { + { + const auto rand = (uint8_t) random.nextInt (0x80); + expectEquals (Conversion::scaleTo7 (Conversion::scaleTo8 (rand)), rand); + } + + { + const auto rand = (uint8_t) random.nextInt (0x80); + expectEquals (Conversion::scaleTo7 (Conversion::scaleTo16 (rand)), rand); + } + + { + const auto rand = (uint8_t) random.nextInt (0x80); + expectEquals (Conversion::scaleTo7 (Conversion::scaleTo32 (rand)), rand); + } + + { + const auto rand = (uint16_t) random.nextInt (0x4000); + expectEquals ((uint64_t) Conversion::scaleTo14 (Conversion::scaleTo16 (rand)), (uint64_t) rand); + } + + { + const auto rand = (uint16_t) random.nextInt (0x4000); + expectEquals ((uint64_t) Conversion::scaleTo14 (Conversion::scaleTo32 (rand)), (uint64_t) rand); + } + } + } + + beginTest ("MIDI 2 -> 1 note on conversions"); + { + { + Packets midi2; + midi2.add (PacketX2 { 0x41946410, 0x12345678 }); + + Packets midi1; + midi1.add (PacketX1 { 0x21946409 }); + + checkMidi2ToMidi1Conversion (midi2, midi1); + } + + { + // If the velocity is close to 0, the output velocity should still be 1 + Packets midi2; + midi2.add (PacketX2 { 0x4295327f, 0x00345678 }); + + Packets midi1; + midi1.add (PacketX1 { 0x22953201 }); + + checkMidi2ToMidi1Conversion (midi2, midi1); + } + } + + beginTest ("MIDI 2 -> 1 note off conversion"); + { + Packets midi2; + midi2.add (PacketX2 { 0x448b0520, 0xfedcba98 }); + + Packets midi1; + midi1.add (PacketX1 { 0x248b057f }); + + checkMidi2ToMidi1Conversion (midi2, midi1); + } + + beginTest ("MIDI 2 -> 1 poly pressure conversion"); + { + Packets midi2; + midi2.add (PacketX2 { 0x49af0520, 0x80dcba98 }); + + Packets midi1; + midi1.add (PacketX1 { 0x29af0540 }); + + checkMidi2ToMidi1Conversion (midi2, midi1); + } + + beginTest ("MIDI 2 -> 1 control change conversion"); + { + Packets midi2; + midi2.add (PacketX2 { 0x49b00520, 0x80dcba98 }); + + Packets midi1; + midi1.add (PacketX1 { 0x29b00540 }); + + checkMidi2ToMidi1Conversion (midi2, midi1); + } + + beginTest ("MIDI 2 -> 1 channel pressure conversion"); + { + Packets midi2; + midi2.add (PacketX2 { 0x40d20520, 0x80dcba98 }); + + Packets midi1; + midi1.add (PacketX1 { 0x20d24000 }); + + checkMidi2ToMidi1Conversion (midi2, midi1); + } + + beginTest ("MIDI 2 -> 1 nrpn rpn conversion"); + { + { + Packets midi2; + midi2.add (PacketX2 { 0x44240123, 0x456789ab }); + + Packets midi1; + midi1.add (PacketX1 { 0x24b46501 }); + midi1.add (PacketX1 { 0x24b46423 }); + midi1.add (PacketX1 { 0x24b40622 }); + midi1.add (PacketX1 { 0x24b42659 }); + + checkMidi2ToMidi1Conversion (midi2, midi1); + } + + { + Packets midi2; + midi2.add (PacketX2 { 0x48347f7f, 0xffffffff }); + + Packets midi1; + midi1.add (PacketX1 { 0x28b4637f }); + midi1.add (PacketX1 { 0x28b4627f }); + midi1.add (PacketX1 { 0x28b4067f }); + midi1.add (PacketX1 { 0x28b4267f }); + + checkMidi2ToMidi1Conversion (midi2, midi1); + } + } + + beginTest ("MIDI 2 -> 1 program change and bank select conversion"); + { + { + // If the bank valid bit is 0, just emit a program change + Packets midi2; + midi2.add (PacketX2 { 0x4cc10000, 0x70004020 }); + + Packets midi1; + midi1.add (PacketX1 { 0x2cc17000 }); + + checkMidi2ToMidi1Conversion (midi2, midi1); + } + + { + // If the bank valid bit is 1, emit bank select control changes and a program change + Packets midi2; + midi2.add (PacketX2 { 0x4bc20001, 0x70004020 }); + + Packets midi1; + midi1.add (PacketX1 { 0x2bb20040 }); + midi1.add (PacketX1 { 0x2bb22020 }); + midi1.add (PacketX1 { 0x2bc27000 }); + + checkMidi2ToMidi1Conversion (midi2, midi1); + } + } + + beginTest ("MIDI 2 -> 1 pitch bend conversion"); + { + Packets midi2; + midi2.add (PacketX2 { 0x4eee0000, 0x12340000 }); + + Packets midi1; + midi1.add (PacketX1 { 0x2eee0d09 }); + + checkMidi2ToMidi1Conversion (midi2, midi1); + } + + beginTest ("MIDI 2 -> 1 messages which don't convert"); + { + const uint8_t opcodes[] { 0x0, 0x1, 0x4, 0x5, 0x6, 0xf }; + + for (const auto opcode : opcodes) + { + Packets midi2; + midi2.add (PacketX2 { Utils::bytesToWord (0x40, (uint8_t) (opcode << 0x4), 0, 0), 0x0 }); + checkMidi2ToMidi1Conversion (midi2, {}); + } + } + + beginTest ("MIDI 2 -> 1 messages which are passed through"); + { + const uint8_t typecodesX1[] { 0x0, 0x1, 0x2 }; + + for (const auto typecode : typecodesX1) + { + Packets p; + p.add (PacketX1 { (uint32_t) ((int64_t) typecode << 0x1c | (random.nextInt64() & 0xffffff)) }); + + checkMidi2ToMidi1Conversion (p, p); + } + + { + Packets p; + p.add (PacketX2 { (uint32_t) (0x3 << 0x1c | (random.nextInt64() & 0xffffff)), + (uint32_t) (random.nextInt64() & 0xffffffff) }); + + checkMidi2ToMidi1Conversion (p, p); + } + + { + Packets p; + p.add (PacketX4 { (uint32_t) (0x5 << 0x1c | (random.nextInt64() & 0xffffff)), + (uint32_t) (random.nextInt64() & 0xffffffff), + (uint32_t) (random.nextInt64() & 0xffffffff), + (uint32_t) (random.nextInt64() & 0xffffffff) }); + + checkMidi2ToMidi1Conversion (p, p); + } + } + + beginTest ("MIDI 2 -> 1 control changes which should be ignored"); + { + const uint8_t CCs[] { 6, 38, 98, 99, 100, 101, 0, 32 }; + + for (const auto cc : CCs) + { + Packets midi2; + midi2.add (PacketX2 { (uint32_t) (0x40b00000 | (cc << 0x8)), 0x00000000 }); + + checkMidi2ToMidi1Conversion (midi2, {}); + } + } + + beginTest ("MIDI 1 -> 2 note on conversions"); + { + { + Packets midi1; + midi1.add (PacketX1 { 0x20904040 }); + + Packets midi2; + midi2.add (PacketX2 { 0x40904000, static_cast (Conversion::scaleTo16 (0x40_u8)) << 0x10 }); + + checkMidi1ToMidi2Conversion (midi1, midi2); + } + + // If velocity is 0, convert to a note-off + { + Packets midi1; + midi1.add (PacketX1 { 0x23935100 }); + + Packets midi2; + midi2.add (PacketX2 { 0x43835100, 0x0 }); + + checkMidi1ToMidi2Conversion (midi1, midi2); + } + } + + beginTest ("MIDI 1 -> 2 note off conversions"); + { + Packets midi1; + midi1.add (PacketX1 { 0x21831020 }); + + Packets midi2; + midi2.add (PacketX2 { 0x41831000, static_cast (Conversion::scaleTo16 (0x20_u8)) << 0x10 }); + + checkMidi1ToMidi2Conversion (midi1, midi2); + } + + beginTest ("MIDI 1 -> 2 poly pressure conversions"); + { + Packets midi1; + midi1.add (PacketX1 { 0x20af7330 }); + + Packets midi2; + midi2.add (PacketX2 { 0x40af7300, Conversion::scaleTo32 (0x30_u8) }); + + checkMidi1ToMidi2Conversion (midi1, midi2); + } + + beginTest ("individual MIDI 1 -> 2 control changes which should be ignored"); + { + const uint8_t CCs[] { 6, 38, 98, 99, 100, 101, 0, 32 }; + + for (const auto cc : CCs) + { + Packets midi1; + midi1.add (PacketX1 { Utils::bytesToWord (0x20, 0xb0, cc, 0x00) }); + + checkMidi1ToMidi2Conversion (midi1, {}); + } + } + + beginTest ("MIDI 1 -> 2 control change conversions"); + { + // normal control change + { + Packets midi1; + midi1.add (PacketX1 { 0x29b1017f }); + + Packets midi2; + midi2.add (PacketX2 { 0x49b10100, Conversion::scaleTo32 (0x7f_u8) }); + + checkMidi1ToMidi2Conversion (midi1, midi2); + } + + // nrpn + { + Packets midi1; + midi1.add (PacketX1 { 0x20b06301 }); + midi1.add (PacketX1 { 0x20b06223 }); + midi1.add (PacketX1 { 0x20b00645 }); + midi1.add (PacketX1 { 0x20b02667 }); + + Packets midi2; + midi2.add (PacketX2 { 0x40300123, Conversion::scaleTo32 (static_cast ((0x45 << 7) | 0x67)) }); + + checkMidi1ToMidi2Conversion (midi1, midi2); + } + + // rpn + { + Packets midi1; + midi1.add (PacketX1 { 0x20b06543 }); + midi1.add (PacketX1 { 0x20b06421 }); + midi1.add (PacketX1 { 0x20b00601 }); + midi1.add (PacketX1 { 0x20b02623 }); + + Packets midi2; + midi2.add (PacketX2 { 0x40204321, Conversion::scaleTo32 (static_cast ((0x01 << 7) | 0x23)) }); + + checkMidi1ToMidi2Conversion (midi1, midi2); + } + } + + beginTest ("MIDI 1 -> MIDI 2 program change and bank select"); + { + Packets midi1; + // program change with bank + midi1.add (PacketX1 { 0x2bb20030 }); + midi1.add (PacketX1 { 0x2bb22010 }); + midi1.add (PacketX1 { 0x2bc24000 }); + // program change without bank (different group and channel) + midi1.add (PacketX1 { 0x20c01000 }); + + Packets midi2; + midi2.add (PacketX2 { 0x4bc20001, 0x40003010 }); + midi2.add (PacketX2 { 0x40c00000, 0x10000000 }); + + checkMidi1ToMidi2Conversion (midi1, midi2); + } + + beginTest ("MIDI 1 -> MIDI 2 channel pressure conversions"); + { + Packets midi1; + midi1.add (PacketX1 { 0x20df3000 }); + + Packets midi2; + midi2.add (PacketX2 { 0x40df0000, Conversion::scaleTo32 (0x30_u8) }); + + checkMidi1ToMidi2Conversion (midi1, midi2); + } + + beginTest ("MIDI 1 -> MIDI 2 pitch bend conversions"); + { + Packets midi1; + midi1.add (PacketX1 { 0x20e74567 }); + + Packets midi2; + midi2.add (PacketX2 { 0x40e70000, Conversion::scaleTo32 (static_cast ((0x67 << 7) | 0x45)) }); + + checkMidi1ToMidi2Conversion (midi1, midi2); + } + } + +private: + static Packets convertMidi2ToMidi1 (const Packets& midi2) + { + Packets r; + + for (const auto& packet : midi2) + Conversion::midi2ToMidi1DefaultTranslation (packet, [&r] (const View& v) { r.add (v); }); + + return r; + } + + static Packets convertMidi1ToMidi2 (const Packets& midi1) + { + Packets r; + Midi1ToMidi2DefaultTranslator translator; + + for (const auto& packet : midi1) + translator.dispatch (packet, [&r] (const View& v) { r.add (v); }); + + return r; + } + + void checkBytestreamConversion (const Packets& actual, const Packets& expected) + { + expectEquals ((int) actual.size(), (int) expected.size()); + + if (actual.size() != expected.size()) + return; + + auto actualPtr = actual.data(); + + std::for_each (expected.data(), + expected.data() + expected.size(), + [&] (const uint32_t word) { expectEquals ((uint64_t) *actualPtr++, (uint64_t) word); }); + } + + void checkMidi2ToMidi1Conversion (const Packets& midi2, const Packets& expected) + { + checkBytestreamConversion (convertMidi2ToMidi1 (midi2), expected); + } + + void checkMidi1ToMidi2Conversion (const Packets& midi1, const Packets& expected) + { + checkBytestreamConversion (convertMidi1ToMidi2 (midi1), expected); + } + + MidiMessage createRandomSysEx (Random& random, size_t sysExBytes) + { + std::vector data; + data.reserve (sysExBytes); + + for (size_t i = 0; i != sysExBytes; ++i) + data.push_back (uint8_t (random.nextInt (0x80))); + + return MidiMessage::createSysExMessage (data.data(), int (data.size())); + } + + PacketX1 createRandomUtilityUMP (Random& random) + { + const auto status = random.nextInt (3); + + return PacketX1 { Utils::bytesToWord (0, + uint8_t (status << 0x4), + uint8_t (status == 0 ? 0 : random.nextInt (0x100)), + uint8_t (status == 0 ? 0 : random.nextInt (0x100))) }; + } + + PacketX1 createRandomRealtimeUMP (Random& random) + { + const auto status = [&] + { + switch (random.nextInt (6)) + { + case 0: return 0xf8; + case 1: return 0xfa; + case 2: return 0xfb; + case 3: return 0xfc; + case 4: return 0xfe; + case 5: return 0xff; + } + + jassertfalse; + return 0x00; + }(); + + return PacketX1 { Utils::bytesToWord (0x10, uint8_t (status), 0x00, 0x00) }; + } + + template + void forEachNonSysExTestMessage (Random& random, Fn&& fn) + { + for (uint16_t counter = 0x80; counter != 0x100; ++counter) + { + const auto firstByte = (uint8_t) counter; + + if (firstByte == 0xf0 || firstByte == 0xf7) + continue; // sysEx is tested separately + + const auto length = MidiMessage::getMessageLengthFromFirstByte (firstByte); + const auto getDataByte = [&] { return uint8_t (random.nextInt (256) & 0x7f); }; + + const auto message = [&] + { + switch (length) + { + case 1: return MidiMessage (firstByte); + case 2: return MidiMessage (firstByte, getDataByte()); + case 3: return MidiMessage (firstByte, getDataByte(), getDataByte()); + } + + return MidiMessage(); + }(); + + fn (message); + } + } + + #if JUCE_WINDOWS && ! JUCE_MINGW + #define JUCE_CHECKED_ITERATOR(msg, size) \ + stdext::checked_array_iterator::type> ((msg), (size_t) (size)) + #else + #define JUCE_CHECKED_ITERATOR(msg, size) (msg) + #endif + + static bool equal (const MidiMessage& a, const MidiMessage& b) noexcept + { + return a.getRawDataSize() == b.getRawDataSize() + && std::equal (a.getRawData(), a.getRawData() + a.getRawDataSize(), + JUCE_CHECKED_ITERATOR (b.getRawData(), b.getRawDataSize())); + } + + #undef JUCE_CHECKED_ITERATOR + + static bool equal (const MidiBuffer& a, const MidiBuffer& b) noexcept + { + return a.data == b.data; + } +}; + +static UniversalMidiPacketTests universalMidiPacketTests; + +} +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1018 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - The code included in this file is provided under the terms of the ISC license - http://www.isc.org/downloads/software-support-policy/isc-license. 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. - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -namespace juce -{ -namespace universal_midi_packets -{ - -constexpr uint8_t operator""_u8 (unsigned long long int i) { return static_cast (i); } -constexpr uint16_t operator""_u16 (unsigned long long int i) { return static_cast (i); } -constexpr uint32_t operator""_u32 (unsigned long long int i) { return static_cast (i); } -constexpr uint64_t operator""_u64 (unsigned long long int i) { return static_cast (i); } - -class UniversalMidiPacketTests : public UnitTest -{ -public: - UniversalMidiPacketTests() - : UnitTest ("Universal MIDI Packet", UnitTestCategories::midi) - { - } - - void runTest() override - { - auto random = getRandom(); - - beginTest ("Short bytestream midi messages can be round-tripped through the UMP converter"); - { - Midi1ToBytestreamTranslator translator (0); - - forEachNonSysExTestMessage (random, [&] (const MidiMessage& m) - { - Packets packets; - Conversion::toMidi1 (m, packets); - expect (packets.size() == 1); - - // Make sure that the message type is correct - expect (Utils::getMessageType (packets.data()[0]) == ((m.getRawData()[0] >> 0x4) == 0xf ? 0x1 : 0x2)); - - translator.dispatch (View {packets.data() }, - 0, - [&] (const MidiMessage& roundTripped) - { - expect (equal (m, roundTripped)); - }); - }); - } - - beginTest ("Bytestream SysEx converts to universal packets"); - { - { - // Zero length message - Packets packets; - Conversion::toMidi1 (createRandomSysEx (random, 0), packets); - expect (packets.size() == 2); - - expect (packets.data()[0] == 0x30000000); - expect (packets.data()[1] == 0x00000000); - } - - { - const auto message = createRandomSysEx (random, 1); - Packets packets; - Conversion::toMidi1 (message, packets); - expect (packets.size() == 2); - - const auto* sysEx = message.getSysExData(); - expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x01, sysEx[0], 0)); - expect (packets.data()[1] == 0x00000000); - } - - { - const auto message = createRandomSysEx (random, 6); - Packets packets; - Conversion::toMidi1 (message, packets); - expect (packets.size() == 2); - - const auto* sysEx = message.getSysExData(); - expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x06, sysEx[0], sysEx[1])); - expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5])); - } - - { - const auto message = createRandomSysEx (random, 12); - Packets packets; - Conversion::toMidi1 (message, packets); - expect (packets.size() == 4); - - const auto* sysEx = message.getSysExData(); - expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x16, sysEx[0], sysEx[1])); - expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5])); - expect (packets.data()[2] == Utils::bytesToWord (0x30, 0x36, sysEx[6], sysEx[7])); - expect (packets.data()[3] == Utils::bytesToWord (sysEx[8], sysEx[9], sysEx[10], sysEx[11])); - } - - { - const auto message = createRandomSysEx (random, 13); - Packets packets; - Conversion::toMidi1 (message, packets); - expect (packets.size() == 6); - - const auto* sysEx = message.getSysExData(); - expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x16, sysEx[0], sysEx[1])); - expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5])); - expect (packets.data()[2] == Utils::bytesToWord (0x30, 0x26, sysEx[6], sysEx[7])); - expect (packets.data()[3] == Utils::bytesToWord (sysEx[8], sysEx[9], sysEx[10], sysEx[11])); - expect (packets.data()[4] == Utils::bytesToWord (0x30, 0x31, sysEx[12], 0)); - expect (packets.data()[5] == 0x00000000); - } - } - - ToBytestreamDispatcher converter (0); - Packets packets; - - const auto checkRoundTrip = [&] (const MidiBuffer& expected) - { - for (const auto meta : expected) - Conversion::toMidi1 (meta.getMessage(), packets); - - MidiBuffer output; - converter.dispatch (packets.data(), - packets.data() + packets.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - packets.clear(); - - expect (equal (expected, output)); - }; - - beginTest ("Long SysEx bytestream midi messages can be round-tripped through the UMP converter"); - { - for (auto length : { 0, 1, 2, 3, 4, 5, 6, 7, 13, 20, 100, 1000 }) - { - MidiBuffer expected; - expected.addEvent (createRandomSysEx (random, size_t (length)), 0); - checkRoundTrip (expected); - } - } - - beginTest ("UMP SysEx7 messages interspersed with utility messages convert to bytestream"); - { - const auto sysEx = createRandomSysEx (random, 100); - Packets originalPackets; - Conversion::toMidi1 (sysEx, originalPackets); - - Packets modifiedPackets; - - const auto addRandomUtilityUMP = [&] - { - const auto newPacket = createRandomUtilityUMP (random); - modifiedPackets.add (View (newPacket.data())); - }; - - for (const auto& packet : originalPackets) - { - addRandomUtilityUMP(); - modifiedPackets.add (packet); - addRandomUtilityUMP(); - } - - MidiBuffer output; - converter.dispatch (modifiedPackets.data(), - modifiedPackets.data() + modifiedPackets.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - - // All Utility messages should have been ignored - expect (output.getNumEvents() == 1); - - for (const auto meta : output) - expect (equal (meta.getMessage(), sysEx)); - } - - beginTest ("UMP SysEx7 messages interspersed with System Realtime messages convert to bytestream"); - { - const auto sysEx = createRandomSysEx (random, 200); - Packets originalPackets; - Conversion::toMidi1 (sysEx, originalPackets); - - Packets modifiedPackets; - MidiBuffer realtimeMessages; - - const auto addRandomRealtimeUMP = [&] - { - const auto newPacket = createRandomRealtimeUMP (random); - modifiedPackets.add (View (newPacket.data())); - realtimeMessages.addEvent (Midi1ToBytestreamTranslator::fromUmp (newPacket), 0); - }; - - for (const auto& packet : originalPackets) - { - addRandomRealtimeUMP(); - modifiedPackets.add (packet); - addRandomRealtimeUMP(); - } - - MidiBuffer output; - converter.dispatch (modifiedPackets.data(), - modifiedPackets.data() + modifiedPackets.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - - const auto numOutputs = output.getNumEvents(); - const auto numInputs = realtimeMessages.getNumEvents(); - expect (numOutputs == numInputs + 1); - - if (numOutputs == numInputs + 1) - { - const auto isMetadataEquivalent = [] (const MidiMessageMetadata& a, - const MidiMessageMetadata& b) - { - return equal (a.getMessage(), b.getMessage()); - }; - - auto it = output.begin(); - - for (const auto meta : realtimeMessages) - { - if (! isMetadataEquivalent (*it, meta)) - { - expect (equal ((*it).getMessage(), sysEx)); - ++it; - } - - expect (isMetadataEquivalent (*it, meta)); - ++it; - } - } - } - - beginTest ("UMP SysEx7 messages interspersed with System Realtime and Utility messages convert to bytestream"); - { - const auto sysEx = createRandomSysEx (random, 300); - Packets originalPackets; - Conversion::toMidi1 (sysEx, originalPackets); - - Packets modifiedPackets; - MidiBuffer realtimeMessages; - - const auto addRandomRealtimeUMP = [&] - { - const auto newPacket = createRandomRealtimeUMP (random); - modifiedPackets.add (View (newPacket.data())); - realtimeMessages.addEvent (Midi1ToBytestreamTranslator::fromUmp (newPacket), 0); - }; - - const auto addRandomUtilityUMP = [&] - { - const auto newPacket = createRandomUtilityUMP (random); - modifiedPackets.add (View (newPacket.data())); - }; - - for (const auto& packet : originalPackets) - { - addRandomRealtimeUMP(); - addRandomUtilityUMP(); - modifiedPackets.add (packet); - addRandomRealtimeUMP(); - addRandomUtilityUMP(); - } - - MidiBuffer output; - converter.dispatch (modifiedPackets.data(), - modifiedPackets.data() + modifiedPackets.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - - const auto numOutputs = output.getNumEvents(); - const auto numInputs = realtimeMessages.getNumEvents(); - expect (numOutputs == numInputs + 1); - - if (numOutputs == numInputs + 1) - { - const auto isMetadataEquivalent = [] (const MidiMessageMetadata& a, const MidiMessageMetadata& b) - { - return equal (a.getMessage(), b.getMessage()); - }; - - auto it = output.begin(); - - for (const auto meta : realtimeMessages) - { - if (! isMetadataEquivalent (*it, meta)) - { - expect (equal ((*it).getMessage(), sysEx)); - ++it; - } - - expect (isMetadataEquivalent (*it, meta)); - ++it; - } - } - } - - beginTest ("SysEx messages are terminated by non-Utility, non-Realtime messages"); - { - const auto noteOn = [&] - { - MidiBuffer b; - b.addEvent (MidiMessage::noteOn (1, uint8_t (64), uint8_t (64)), 0); - return b; - }(); - - const auto noteOnPackets = [&] - { - Packets p; - - for (const auto meta : noteOn) - Conversion::toMidi1 (meta.getMessage(), p); - - return p; - }(); - - const auto sysEx = createRandomSysEx (random, 300); - - const auto originalPackets = [&] - { - Packets p; - Conversion::toMidi1 (sysEx, p); - return p; - }(); - - const auto modifiedPackets = [&] - { - Packets p; - - const auto insertionPoint = std::next (originalPackets.begin(), 10); - std::for_each (originalPackets.begin(), - insertionPoint, - [&] (const View& view) { p.add (view); }); - - for (const auto& view : noteOnPackets) - p.add (view); - - std::for_each (insertionPoint, - originalPackets.end(), - [&] (const View& view) { p.add (view); }); - - return p; - }(); - - // modifiedPackets now contains some SysEx packets interrupted by a MIDI 1 noteOn - - MidiBuffer output; - - const auto pushToOutput = [&] (const Packets& p) - { - converter.dispatch (p.data(), - p.data() + p.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - }; - - pushToOutput (modifiedPackets); - - // Interrupted sysEx shouldn't be present - expect (equal (output, noteOn)); - - const auto newSysEx = createRandomSysEx (random, 300); - Packets newSysExPackets; - Conversion::toMidi1 (newSysEx, newSysExPackets); - - // If we push another midi event without interrupting it, - // it should get through without being modified, - // and it shouldn't be affected by the previous (interrupted) sysex. - - output.clear(); - pushToOutput (newSysExPackets); - - expect (output.getNumEvents() == 1); - - for (const auto meta : output) - expect (equal (meta.getMessage(), newSysEx)); - } - - beginTest ("Widening conversions work"); - { - // This is similar to the 'slow' example code from the MIDI 2.0 spec - const auto baselineScale = [] (uint32_t srcVal, uint32_t srcBits, uint32_t dstBits) - { - const auto scaleBits = (uint32_t) (dstBits - srcBits); - - auto bitShiftedValue = (uint32_t) (srcVal << scaleBits); - - const auto srcCenter = (uint32_t) (1 << (srcBits - 1)); - - if (srcVal <= srcCenter) - return bitShiftedValue; - - const auto repeatBits = (uint32_t) (srcBits - 1); - const auto repeatMask = (uint32_t) ((1 << repeatBits) - 1); - - auto repeatValue = (uint32_t) (srcVal & repeatMask); - - if (scaleBits > repeatBits) - repeatValue <<= scaleBits - repeatBits; - else - repeatValue >>= repeatBits - scaleBits; - - while (repeatValue != 0) - { - bitShiftedValue |= repeatValue; - repeatValue >>= repeatBits; - } - - return bitShiftedValue; - }; - - const auto baselineScale7To8 = [&] (uint8_t in) - { - return baselineScale (in, 7, 8); - }; - - const auto baselineScale7To16 = [&] (uint8_t in) - { - return baselineScale (in, 7, 16); - }; - - const auto baselineScale14To16 = [&] (uint16_t in) - { - return baselineScale (in, 14, 16); - }; - - const auto baselineScale7To32 = [&] (uint8_t in) - { - return baselineScale (in, 7, 32); - }; - - const auto baselineScale14To32 = [&] (uint16_t in) - { - return baselineScale (in, 14, 32); - }; - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals ((int64_t) Conversion::scaleTo8 (rand), - (int64_t) baselineScale7To8 (rand)); - } - - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x00), (int64_t) 0x0000); - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x0a), (int64_t) 0x1400); - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x40), (int64_t) 0x8000); - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x57), (int64_t) 0xaeba); - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x7f), (int64_t) 0xffff); - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals ((int64_t) Conversion::scaleTo16 (rand), - (int64_t) baselineScale7To16 (rand)); - } - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint16_t) random.nextInt (0x4000); - expectEquals ((int64_t) Conversion::scaleTo16 (rand), - (int64_t) baselineScale14To16 (rand)); - } - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals ((int64_t) Conversion::scaleTo32 (rand), - (int64_t) baselineScale7To32 (rand)); - } - - expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x0000), (int64_t) 0x00000000); - expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x2000), (int64_t) 0x80000000); - expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x3fff), (int64_t) 0xffffffff); - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint16_t) random.nextInt (0x4000); - expectEquals ((int64_t) Conversion::scaleTo32 (rand), - (int64_t) baselineScale14To32 (rand)); - } - } - - beginTest ("Round-trip widening/narrowing conversions work"); - { - for (auto i = 0; i != 100; ++i) - { - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals (Conversion::scaleTo7 (Conversion::scaleTo8 (rand)), rand); - } - - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals (Conversion::scaleTo7 (Conversion::scaleTo16 (rand)), rand); - } - - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals (Conversion::scaleTo7 (Conversion::scaleTo32 (rand)), rand); - } - - { - const auto rand = (uint16_t) random.nextInt (0x4000); - expectEquals ((uint64_t) Conversion::scaleTo14 (Conversion::scaleTo16 (rand)), (uint64_t) rand); - } - - { - const auto rand = (uint16_t) random.nextInt (0x4000); - expectEquals ((uint64_t) Conversion::scaleTo14 (Conversion::scaleTo32 (rand)), (uint64_t) rand); - } - } - } - - beginTest ("MIDI 2 -> 1 note on conversions"); - { - { - Packets midi2; - midi2.add (PacketX2 { 0x41946410, 0x12345678 }); - - Packets midi1; - midi1.add (PacketX1 { 0x21946409 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - { - // If the velocity is close to 0, the output velocity should still be 1 - Packets midi2; - midi2.add (PacketX2 { 0x4295327f, 0x00345678 }); - - Packets midi1; - midi1.add (PacketX1 { 0x22953201 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - } - - beginTest ("MIDI 2 -> 1 note off conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x448b0520, 0xfedcba98 }); - - Packets midi1; - midi1.add (PacketX1 { 0x248b057f }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 poly pressure conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x49af0520, 0x80dcba98 }); - - Packets midi1; - midi1.add (PacketX1 { 0x29af0540 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 control change conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x49b00520, 0x80dcba98 }); - - Packets midi1; - midi1.add (PacketX1 { 0x29b00540 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 channel pressure conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x40d20520, 0x80dcba98 }); - - Packets midi1; - midi1.add (PacketX1 { 0x20d24000 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 nrpn rpn conversion"); - { - { - Packets midi2; - midi2.add (PacketX2 { 0x44240123, 0x456789ab }); - - Packets midi1; - midi1.add (PacketX1 { 0x24b46501 }); - midi1.add (PacketX1 { 0x24b46423 }); - midi1.add (PacketX1 { 0x24b40622 }); - midi1.add (PacketX1 { 0x24b42659 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - { - Packets midi2; - midi2.add (PacketX2 { 0x48347f7f, 0xffffffff }); - - Packets midi1; - midi1.add (PacketX1 { 0x28b4637f }); - midi1.add (PacketX1 { 0x28b4627f }); - midi1.add (PacketX1 { 0x28b4067f }); - midi1.add (PacketX1 { 0x28b4267f }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - } - - beginTest ("MIDI 2 -> 1 program change and bank select conversion"); - { - { - // If the bank valid bit is 0, just emit a program change - Packets midi2; - midi2.add (PacketX2 { 0x4cc10000, 0x70004020 }); - - Packets midi1; - midi1.add (PacketX1 { 0x2cc17000 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - { - // If the bank valid bit is 1, emit bank select control changes and a program change - Packets midi2; - midi2.add (PacketX2 { 0x4bc20001, 0x70004020 }); - - Packets midi1; - midi1.add (PacketX1 { 0x2bb20040 }); - midi1.add (PacketX1 { 0x2bb22020 }); - midi1.add (PacketX1 { 0x2bc27000 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - } - - beginTest ("MIDI 2 -> 1 pitch bend conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x4eee0000, 0x12340000 }); - - Packets midi1; - midi1.add (PacketX1 { 0x2eee0d09 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 messages which don't convert"); - { - const uint8_t opcodes[] { 0x0, 0x1, 0x4, 0x5, 0x6, 0xf }; - - for (const auto opcode : opcodes) - { - Packets midi2; - midi2.add (PacketX2 { Utils::bytesToWord (0x40, (uint8_t) (opcode << 0x4), 0, 0), 0x0 }); - checkMidi2ToMidi1Conversion (midi2, {}); - } - } - - beginTest ("MIDI 2 -> 1 messages which are passed through"); - { - const uint8_t typecodesX1[] { 0x0, 0x1, 0x2 }; - - for (const auto typecode : typecodesX1) - { - Packets p; - p.add (PacketX1 { (uint32_t) ((int64_t) typecode << 0x1c | (random.nextInt64() & 0xffffff)) }); - - checkMidi2ToMidi1Conversion (p, p); - } - - { - Packets p; - p.add (PacketX2 { (uint32_t) (0x3 << 0x1c | (random.nextInt64() & 0xffffff)), - (uint32_t) (random.nextInt64() & 0xffffffff) }); - - checkMidi2ToMidi1Conversion (p, p); - } - - { - Packets p; - p.add (PacketX4 { (uint32_t) (0x5 << 0x1c | (random.nextInt64() & 0xffffff)), - (uint32_t) (random.nextInt64() & 0xffffffff), - (uint32_t) (random.nextInt64() & 0xffffffff), - (uint32_t) (random.nextInt64() & 0xffffffff) }); - - checkMidi2ToMidi1Conversion (p, p); - } - } - - beginTest ("MIDI 2 -> 1 control changes which should be ignored"); - { - const uint8_t CCs[] { 6, 38, 98, 99, 100, 101, 0, 32 }; - - for (const auto cc : CCs) - { - Packets midi2; - midi2.add (PacketX2 { (uint32_t) (0x40b00000 | (cc << 0x8)), 0x00000000 }); - - checkMidi2ToMidi1Conversion (midi2, {}); - } - } - - beginTest ("MIDI 1 -> 2 note on conversions"); - { - { - Packets midi1; - midi1.add (PacketX1 { 0x20904040 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40904000, static_cast (Conversion::scaleTo16 (0x40_u8)) << 0x10 }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - // If velocity is 0, convert to a note-off - { - Packets midi1; - midi1.add (PacketX1 { 0x23935100 }); - - Packets midi2; - midi2.add (PacketX2 { 0x43835100, 0x0 }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - } - - beginTest ("MIDI 1 -> 2 note off conversions"); - { - Packets midi1; - midi1.add (PacketX1 { 0x21831020 }); - - Packets midi2; - midi2.add (PacketX2 { 0x41831000, static_cast (Conversion::scaleTo16 (0x20_u8)) << 0x10 }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - beginTest ("MIDI 1 -> 2 poly pressure conversions"); - { - Packets midi1; - midi1.add (PacketX1 { 0x20af7330 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40af7300, Conversion::scaleTo32 (0x30_u8) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - beginTest ("individual MIDI 1 -> 2 control changes which should be ignored"); - { - const uint8_t CCs[] { 6, 38, 98, 99, 100, 101, 0, 32 }; - - for (const auto cc : CCs) - { - Packets midi1; - midi1.add (PacketX1 { Utils::bytesToWord (0x20, 0xb0, cc, 0x00) }); - - checkMidi1ToMidi2Conversion (midi1, {}); - } - } - - beginTest ("MIDI 1 -> 2 control change conversions"); - { - // normal control change - { - Packets midi1; - midi1.add (PacketX1 { 0x29b1017f }); - - Packets midi2; - midi2.add (PacketX2 { 0x49b10100, Conversion::scaleTo32 (0x7f_u8) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - // nrpn - { - Packets midi1; - midi1.add (PacketX1 { 0x20b06301 }); - midi1.add (PacketX1 { 0x20b06223 }); - midi1.add (PacketX1 { 0x20b00645 }); - midi1.add (PacketX1 { 0x20b02667 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40300123, Conversion::scaleTo32 (static_cast ((0x45 << 7) | 0x67)) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - // rpn - { - Packets midi1; - midi1.add (PacketX1 { 0x20b06543 }); - midi1.add (PacketX1 { 0x20b06421 }); - midi1.add (PacketX1 { 0x20b00601 }); - midi1.add (PacketX1 { 0x20b02623 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40204321, Conversion::scaleTo32 (static_cast ((0x01 << 7) | 0x23)) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - } - - beginTest ("MIDI 1 -> MIDI 2 program change and bank select"); - { - Packets midi1; - // program change with bank - midi1.add (PacketX1 { 0x2bb20030 }); - midi1.add (PacketX1 { 0x2bb22010 }); - midi1.add (PacketX1 { 0x2bc24000 }); - // program change without bank (different group and channel) - midi1.add (PacketX1 { 0x20c01000 }); - - Packets midi2; - midi2.add (PacketX2 { 0x4bc20001, 0x40003010 }); - midi2.add (PacketX2 { 0x40c00000, 0x10000000 }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - beginTest ("MIDI 1 -> MIDI 2 channel pressure conversions"); - { - Packets midi1; - midi1.add (PacketX1 { 0x20df3000 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40df0000, Conversion::scaleTo32 (0x30_u8) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - beginTest ("MIDI 1 -> MIDI 2 pitch bend conversions"); - { - Packets midi1; - midi1.add (PacketX1 { 0x20e74567 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40e70000, Conversion::scaleTo32 (static_cast ((0x67 << 7) | 0x45)) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - } - -private: - static Packets convertMidi2ToMidi1 (const Packets& midi2) - { - Packets r; - - for (const auto& packet : midi2) - Conversion::midi2ToMidi1DefaultTranslation (packet, [&r] (const View& v) { r.add (v); }); - - return r; - } - - static Packets convertMidi1ToMidi2 (const Packets& midi1) - { - Packets r; - Midi1ToMidi2DefaultTranslator translator; - - for (const auto& packet : midi1) - translator.dispatch (packet, [&r] (const View& v) { r.add (v); }); - - return r; - } - - void checkBytestreamConversion (const Packets& actual, const Packets& expected) - { - expectEquals ((int) actual.size(), (int) expected.size()); - - if (actual.size() != expected.size()) - return; - - auto actualPtr = actual.data(); - - std::for_each (expected.data(), - expected.data() + expected.size(), - [&] (const uint32_t word) { expectEquals ((uint64_t) *actualPtr++, (uint64_t) word); }); - } - - void checkMidi2ToMidi1Conversion (const Packets& midi2, const Packets& expected) - { - checkBytestreamConversion (convertMidi2ToMidi1 (midi2), expected); - } - - void checkMidi1ToMidi2Conversion (const Packets& midi1, const Packets& expected) - { - checkBytestreamConversion (convertMidi1ToMidi2 (midi1), expected); - } - - MidiMessage createRandomSysEx (Random& random, size_t sysExBytes) - { - std::vector data; - data.reserve (sysExBytes); - - for (size_t i = 0; i != sysExBytes; ++i) - data.push_back (uint8_t (random.nextInt (0x80))); - - return MidiMessage::createSysExMessage (data.data(), int (data.size())); - } - - PacketX1 createRandomUtilityUMP (Random& random) - { - const auto status = random.nextInt (3); - - return PacketX1 { Utils::bytesToWord (0, - uint8_t (status << 0x4), - uint8_t (status == 0 ? 0 : random.nextInt (0x100)), - uint8_t (status == 0 ? 0 : random.nextInt (0x100))) }; - } - - PacketX1 createRandomRealtimeUMP (Random& random) - { - const auto status = [&] - { - switch (random.nextInt (6)) - { - case 0: return 0xf8; - case 1: return 0xfa; - case 2: return 0xfb; - case 3: return 0xfc; - case 4: return 0xfe; - case 5: return 0xff; - } - - jassertfalse; - return 0x00; - }(); - - return PacketX1 { Utils::bytesToWord (0x10, uint8_t (status), 0x00, 0x00) }; - } - - template - void forEachNonSysExTestMessage (Random& random, Fn&& fn) - { - for (uint16_t counter = 0x80; counter != 0x100; ++counter) - { - const auto firstByte = (uint8_t) counter; - - if (firstByte == 0xf0 || firstByte == 0xf7) - continue; // sysEx is tested separately - - const auto length = MidiMessage::getMessageLengthFromFirstByte (firstByte); - const auto getDataByte = [&] { return uint8_t (random.nextInt (256) & 0x7f); }; - - const auto message = [&] - { - switch (length) - { - case 1: return MidiMessage (firstByte); - case 2: return MidiMessage (firstByte, getDataByte()); - case 3: return MidiMessage (firstByte, getDataByte(), getDataByte()); - } - - return MidiMessage(); - }(); - - fn (message); - } - } - - #if JUCE_WINDOWS && ! JUCE_MINGW - #define JUCE_CHECKED_ITERATOR(msg, size) \ - stdext::checked_array_iterator::type> ((msg), (size_t) (size)) - #else - #define JUCE_CHECKED_ITERATOR(msg, size) (msg) - #endif - - static bool equal (const MidiMessage& a, const MidiMessage& b) noexcept - { - return a.getRawDataSize() == b.getRawDataSize() - && std::equal (a.getRawData(), a.getRawData() + a.getRawDataSize(), - JUCE_CHECKED_ITERATOR (b.getRawData(), b.getRawDataSize())); - } - - #undef JUCE_CHECKED_ITERATOR - - static bool equal (const MidiBuffer& a, const MidiBuffer& b) noexcept - { - return a.data == b.data; - } -}; - -static UniversalMidiPacketTests universalMidiPacketTests; - -} -} diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPUtils.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPUtils.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPUtils.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPUtils.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPView.cpp juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPView.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPView.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPView.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPView.h juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPView.h --- juce-6.1.5~ds0/modules/juce_audio_basics/midi/ump/juce_UMPView.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/midi/ump/juce_UMPView.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEInstrument.h juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEInstrument.h --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEInstrument.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEInstrument.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEMessages.cpp juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEMessages.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEMessages.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEMessages.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEMessages.h juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEMessages.h --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEMessages.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEMessages.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPENote.cpp juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPENote.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPENote.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPENote.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPENote.h juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPENote.h --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPENote.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPENote.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiser.h juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiser.h --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEUtils.cpp juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEUtils.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEUtils.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEUtils.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEUtils.h juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEUtils.h --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEUtils.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEUtils.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEValue.cpp juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEValue.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEValue.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEValue.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEValue.h juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEValue.h --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEValue.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEValue.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h --- juce-6.1.5~ds0/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -41,7 +41,6 @@ enum class Type { lower, upper }; MPEZone() = default; - MPEZone (const MPEZone& other) = default; MPEZone (Type type, int memberChannels = 0, int perNotePitchbend = 48, int masterPitchbend = 2) : zoneType (type), diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h juce-7.0.0~ds0/modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h --- juce-6.1.5~ds0/modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h juce-7.0.0~ds0/modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h --- juce-6.1.5~ds0/modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,80 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + + +// This file will be included directly by macOS/iOS-specific .cpps +#pragma once + +#if ! DOXYGEN + +#include + +namespace juce +{ + +struct CoreAudioTimeConversions +{ +public: + CoreAudioTimeConversions() + { + mach_timebase_info_data_t info{}; + mach_timebase_info (&info); + numerator = info.numer; + denominator = info.denom; + } + + uint64_t hostTimeToNanos (uint64_t hostTime) const + { + return multiplyByRatio (hostTime, numerator, denominator); + } + + uint64_t nanosToHostTime (uint64_t nanos) const + { + return multiplyByRatio (nanos, denominator, numerator); + } + +private: + // Adapted from CAHostTimeBase.h in the Core Audio Utility Classes + static uint64_t multiplyByRatio (uint64_t toMultiply, uint64_t numerator, uint64_t denominator) + { + #if defined (__SIZEOF_INT128__) + unsigned __int128 + #else + long double + #endif + result = toMultiply; + + if (numerator != denominator) + { + result *= numerator; + result /= denominator; + } + + return (uint64_t) result; + } + + uint64_t numerator = 0, denominator = 0; +}; + +} // namespace juce + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_AudioSource.h juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_AudioSource.h --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_AudioSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_AudioSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -91,9 +91,9 @@ buffer.setSize (numberOfChannels, 0); - // MSVC2015 seems to need this if statement to not generate a warning during linking. + // MSVC2017 seems to need this if statement to not generate a warning during linking. // As source is set in the constructor, there is no way that source could - // ever equal this, but it seems to make MSVC2015 happy. + // ever equal this, but it seems to make MSVC2017 happy. if (source != this) source->releaseResources(); } diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_MemoryAudioSource.h juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_MemoryAudioSource.h --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_MemoryAudioSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_MemoryAudioSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_MixerAudioSource.h juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_MixerAudioSource.h --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_MixerAudioSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_MixerAudioSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h --- juce-6.1.5~ds0/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp juce-7.0.0~ds0/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h juce-7.0.0~ds0/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h --- juce-6.1.5~ds0/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_ADSR.h juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_ADSR.h --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_ADSR.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_ADSR.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -31,6 +31,10 @@ with setParameters() then call getNextSample() to get the envelope value to be applied to each audio sample or applyEnvelopeToBuffer() to apply the envelope to a whole buffer. + Do not change the parameters during playback. If you change the parameters before the + release stage has completed then you must call reset() before the next call to + noteOn(). + @tags{Audio} */ class JUCE_API ADSR @@ -153,39 +157,54 @@ */ float getNextSample() noexcept { - if (state == State::idle) - return 0.0f; - - if (state == State::attack) + switch (state) { - envelopeVal += attackRate; + case State::idle: + { + return 0.0f; + } + + case State::attack: + { + envelopeVal += attackRate; - if (envelopeVal >= 1.0f) + if (envelopeVal >= 1.0f) + { + envelopeVal = 1.0f; + goToNextState(); + } + + break; + } + + case State::decay: { - envelopeVal = 1.0f; - goToNextState(); + envelopeVal -= decayRate; + + if (envelopeVal <= parameters.sustain) + { + envelopeVal = parameters.sustain; + goToNextState(); + } + + break; } - } - else if (state == State::decay) - { - envelopeVal -= decayRate; - if (envelopeVal <= parameters.sustain) + case State::sustain: { envelopeVal = parameters.sustain; - goToNextState(); + break; } - } - else if (state == State::sustain) - { - envelopeVal = parameters.sustain; - } - else if (state == State::release) - { - envelopeVal -= releaseRate; - if (envelopeVal <= 0.0f) - goToNextState(); + case State::release: + { + envelopeVal -= releaseRate; + + if (envelopeVal <= 0.0f) + goToNextState(); + + break; + } } return envelopeVal; @@ -250,10 +269,18 @@ void goToNextState() noexcept { if (state == State::attack) + { state = (decayRate > 0.0f ? State::decay : State::sustain); - else if (state == State::decay) + return; + } + + if (state == State::decay) + { state = State::sustain; - else if (state == State::release) + return; + } + + if (state == State::release) reset(); } diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_ADSR_test.cpp juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_ADSR_test.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_ADSR_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_ADSR_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_Decibels.h juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_Decibels.h --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_Decibels.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_Decibels.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_GenericInterpolator.h juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_GenericInterpolator.h --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_GenericInterpolator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_GenericInterpolator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,19 +2,16 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_IIRFilter.cpp juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_IIRFilter.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_IIRFilter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_IIRFilter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_IIRFilter.h juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_IIRFilter.h --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_IIRFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_IIRFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_Interpolators.cpp juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_Interpolators.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_Interpolators.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_Interpolators.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,19 +2,16 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_Interpolators.h juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_Interpolators.h --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_Interpolators.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_Interpolators.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,19 +2,16 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_Reverb.h juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_Reverb.h --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_Reverb.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_Reverb.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_SmoothedValue.h juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_SmoothedValue.h --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_SmoothedValue.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_SmoothedValue.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -58,8 +58,6 @@ /** Constructor. */ SmoothedValueBase() = default; - virtual ~SmoothedValueBase() {} - //============================================================================== /** Returns true if the current value is currently being interpolated. */ bool isSmoothing() const noexcept { return countdown > 0; } diff -Nru juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp --- juce-6.1.5~ds0/modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,19 +2,16 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -69,9 +69,14 @@ CallbackHandler (AudioDeviceManager& adm) noexcept : owner (adm) {} private: - void audioDeviceIOCallback (const float** ins, int numIns, float** outs, int numOuts, int numSamples) override + void audioDeviceIOCallbackWithContext (const float** ins, + int numIns, + float** outs, + int numOuts, + int numSamples, + const AudioIODeviceCallbackContext& context) override { - owner.audioDeviceIOCallbackInt (ins, numIns, outs, numOuts, numSamples); + owner.audioDeviceIOCallbackInt (ins, numIns, outs, numOuts, numSamples, context); } void audioDeviceAboutToStart (AudioIODevice* device) override @@ -900,7 +905,8 @@ int numInputChannels, float** outputChannelData, int numOutputChannels, - int numSamples) + int numSamples, + const AudioIODeviceCallbackContext& context) { const ScopedLock sl (audioCallbackLock); @@ -912,15 +918,23 @@ tempBuffer.setSize (jmax (1, numOutputChannels), jmax (1, numSamples), false, false, true); - callbacks.getUnchecked(0)->audioDeviceIOCallback (inputChannelData, numInputChannels, - outputChannelData, numOutputChannels, numSamples); + callbacks.getUnchecked(0)->audioDeviceIOCallbackWithContext (inputChannelData, + numInputChannels, + outputChannelData, + numOutputChannels, + numSamples, + context); auto** tempChans = tempBuffer.getArrayOfWritePointers(); for (int i = callbacks.size(); --i > 0;) { - callbacks.getUnchecked(i)->audioDeviceIOCallback (inputChannelData, numInputChannels, - tempChans, numOutputChannels, numSamples); + callbacks.getUnchecked(i)->audioDeviceIOCallbackWithContext (inputChannelData, + numInputChannels, + tempChans, + numOutputChannels, + numSamples, + context); for (int chan = 0; chan < numOutputChannels; ++chan) { @@ -1074,6 +1088,7 @@ { if (defaultMidiOutputDeviceInfo.identifier != identifier) { + std::unique_ptr oldMidiPort; Array oldCallbacks; { @@ -1085,7 +1100,7 @@ for (int i = oldCallbacks.size(); --i >= 0;) oldCallbacks.getUnchecked (i)->audioDeviceStopped(); - defaultMidiOutput.reset(); + std::swap (oldMidiPort, defaultMidiOutput); if (identifier.isNotEmpty()) defaultMidiOutput = MidiOutput::openDevice (identifier); @@ -1105,7 +1120,7 @@ } updateXml(); - sendChangeMessage(); + sendSynchronousChangeMessage(); } } diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h --- juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -526,8 +526,12 @@ class CallbackHandler; std::unique_ptr callbackHandler; - void audioDeviceIOCallbackInt (const float** inputChannelData, int totalNumInputChannels, - float** outputChannelData, int totalNumOutputChannels, int numSamples); + void audioDeviceIOCallbackInt (const float** inputChannelData, + int totalNumInputChannels, + float** outputChannelData, + int totalNumOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext& context); void audioDeviceAboutToStartInt (AudioIODevice*); void audioDeviceStoppedInt(); void audioDeviceErrorInt (const String&); diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h --- juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -25,6 +25,14 @@ class AudioIODevice; +/** Additional information that may be passed to the AudioIODeviceCallback. */ +struct AudioIODeviceCallbackContext +{ + /** If the host provides this information, this field will be set to point to + an integer holding the current value; otherwise, this will be nullptr. + */ + const uint64_t* hostTimeNs = nullptr; +}; //============================================================================== /** @@ -87,7 +95,26 @@ int numInputChannels, float** outputChannelData, int numOutputChannels, - int numSamples) = 0; + int numSamples) + { + ignoreUnused (inputChannelData, numInputChannels, outputChannelData, numOutputChannels, numSamples); + } + + /** The same as audioDeviceIOCallback(), but with an additional context argument. + + The default implementation of this function will call audioDeviceIOCallback(), + but you can override this function if you need to make use of the context information. + */ + virtual void audioDeviceIOCallbackWithContext (const float** inputChannelData, + int numInputChannels, + float** outputChannelData, + int numOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext& context) + { + audioDeviceIOCallback (inputChannelData, numInputChannels, outputChannelData, numOutputChannels, numSamples); + ignoreUnused (context); + } /** Called to indicate that the device is about to start calling back. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h --- juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,48 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ +namespace SampleRateHelpers +{ + +static inline const std::vector& getAllSampleRates() +{ + static auto sampleRates = [] + { + std::vector result; + constexpr double baseRates[] = { 8000.0, 11025.0, 12000.0 }; + constexpr double maxRate = 768000.0; + + for (auto rate : baseRates) + for (; rate <= maxRate; rate *= 2) + result.insert (std::upper_bound (result.begin(), result.end(), rate), + rate); + + return result; + }(); + + return sampleRates; +} + +} // namespace SampleRateHelpers +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h --- juce-6.1.5~ds0/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/juce_audio_devices.cpp juce-7.0.0~ds0/modules/juce_audio_devices/juce_audio_devices.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/juce_audio_devices.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/juce_audio_devices.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -45,6 +45,8 @@ #include "juce_audio_devices.h" +#include "audio_io/juce_SampleRateHelpers.cpp" + //============================================================================== #if JUCE_MAC || JUCE_IOS #include diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/juce_audio_devices.h juce-7.0.0~ds0/modules/juce_audio_devices/juce_audio_devices.h --- juce-6.1.5~ds0/modules/juce_audio_devices/juce_audio_devices.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/juce_audio_devices.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -32,7 +32,7 @@ ID: juce_audio_devices vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE audio and MIDI I/O device classes description: Classes to play and record from audio and MIDI I/O devices website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/juce_audio_devices.mm juce-7.0.0~ds0/modules/juce_audio_devices/juce_audio_devices.mm --- juce-6.1.5~ds0/modules/juce_audio_devices/juce_audio_devices.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/juce_audio_devices.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/juce_MidiDevices.h juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/juce_MidiDevices.h --- juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/juce_MidiDevices.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/juce_MidiDevices.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h --- juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h --- juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1022 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - The code included in this file is provided under the terms of the ISC license - http://www.isc.org/downloads/software-support-policy/isc-license. 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. - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -namespace juce -{ -namespace universal_midi_packets -{ - -#if JUCE_UNIT_TESTS - -constexpr uint8_t operator""_u8 (unsigned long long int i) { return static_cast (i); } -constexpr uint16_t operator""_u16 (unsigned long long int i) { return static_cast (i); } -constexpr uint32_t operator""_u32 (unsigned long long int i) { return static_cast (i); } -constexpr uint64_t operator""_u64 (unsigned long long int i) { return static_cast (i); } - -class UniversalMidiPacketTests : public UnitTest -{ -public: - UniversalMidiPacketTests() - : UnitTest ("Universal MIDI Packet", UnitTestCategories::midi) - { - } - - void runTest() override - { - auto random = getRandom(); - - beginTest ("Short bytestream midi messages can be round-tripped through the UMP converter"); - { - Midi1ToBytestreamTranslator translator (0); - - forEachNonSysExTestMessage (random, [&] (const MidiMessage& m) - { - Packets packets; - Conversion::toMidi1 (m, packets); - expect (packets.size() == 1); - - // Make sure that the message type is correct - expect (Utils::getMessageType (packets.data()[0]) == ((m.getRawData()[0] >> 0x4) == 0xf ? 0x1 : 0x2)); - - translator.dispatch (View {packets.data() }, - 0, - [&] (const MidiMessage& roundTripped) - { - expect (equal (m, roundTripped)); - }); - }); - } - - beginTest ("Bytestream SysEx converts to universal packets"); - { - { - // Zero length message - Packets packets; - Conversion::toMidi1 (createRandomSysEx (random, 0), packets); - expect (packets.size() == 2); - - expect (packets.data()[0] == 0x30000000); - expect (packets.data()[1] == 0x00000000); - } - - { - const auto message = createRandomSysEx (random, 1); - Packets packets; - Conversion::toMidi1 (message, packets); - expect (packets.size() == 2); - - const auto* sysEx = message.getSysExData(); - expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x01, sysEx[0], 0)); - expect (packets.data()[1] == 0x00000000); - } - - { - const auto message = createRandomSysEx (random, 6); - Packets packets; - Conversion::toMidi1 (message, packets); - expect (packets.size() == 2); - - const auto* sysEx = message.getSysExData(); - expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x06, sysEx[0], sysEx[1])); - expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5])); - } - - { - const auto message = createRandomSysEx (random, 12); - Packets packets; - Conversion::toMidi1 (message, packets); - expect (packets.size() == 4); - - const auto* sysEx = message.getSysExData(); - expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x16, sysEx[0], sysEx[1])); - expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5])); - expect (packets.data()[2] == Utils::bytesToWord (0x30, 0x36, sysEx[6], sysEx[7])); - expect (packets.data()[3] == Utils::bytesToWord (sysEx[8], sysEx[9], sysEx[10], sysEx[11])); - } - - { - const auto message = createRandomSysEx (random, 13); - Packets packets; - Conversion::toMidi1 (message, packets); - expect (packets.size() == 6); - - const auto* sysEx = message.getSysExData(); - expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x16, sysEx[0], sysEx[1])); - expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5])); - expect (packets.data()[2] == Utils::bytesToWord (0x30, 0x26, sysEx[6], sysEx[7])); - expect (packets.data()[3] == Utils::bytesToWord (sysEx[8], sysEx[9], sysEx[10], sysEx[11])); - expect (packets.data()[4] == Utils::bytesToWord (0x30, 0x31, sysEx[12], 0)); - expect (packets.data()[5] == 0x00000000); - } - } - - ToBytestreamDispatcher converter (0); - Packets packets; - - const auto checkRoundTrip = [&] (const MidiBuffer& expected) - { - for (const auto meta : expected) - Conversion::toMidi1 (meta.getMessage(), packets); - - MidiBuffer output; - converter.dispatch (packets.data(), - packets.data() + packets.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - packets.clear(); - - expect (equal (expected, output)); - }; - - beginTest ("Long SysEx bytestream midi messages can be round-tripped through the UMP converter"); - { - for (auto length : { 0, 1, 2, 3, 4, 5, 6, 7, 13, 20, 100, 1000 }) - { - MidiBuffer expected; - expected.addEvent (createRandomSysEx (random, size_t (length)), 0); - checkRoundTrip (expected); - } - } - - beginTest ("UMP SysEx7 messages interspersed with utility messages convert to bytestream"); - { - const auto sysEx = createRandomSysEx (random, 100); - Packets originalPackets; - Conversion::toMidi1 (sysEx, originalPackets); - - Packets modifiedPackets; - - const auto addRandomUtilityUMP = [&] - { - const auto newPacket = createRandomUtilityUMP (random); - modifiedPackets.add (View (newPacket.data())); - }; - - for (const auto& packet : originalPackets) - { - addRandomUtilityUMP(); - modifiedPackets.add (packet); - addRandomUtilityUMP(); - } - - MidiBuffer output; - converter.dispatch (modifiedPackets.data(), - modifiedPackets.data() + modifiedPackets.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - - // All Utility messages should have been ignored - expect (output.getNumEvents() == 1); - - for (const auto meta : output) - expect (equal (meta.getMessage(), sysEx)); - } - - beginTest ("UMP SysEx7 messages interspersed with System Realtime messages convert to bytestream"); - { - const auto sysEx = createRandomSysEx (random, 200); - Packets originalPackets; - Conversion::toMidi1 (sysEx, originalPackets); - - Packets modifiedPackets; - MidiBuffer realtimeMessages; - - const auto addRandomRealtimeUMP = [&] - { - const auto newPacket = createRandomRealtimeUMP (random); - modifiedPackets.add (View (newPacket.data())); - realtimeMessages.addEvent (Midi1ToBytestreamTranslator::fromUmp (newPacket), 0); - }; - - for (const auto& packet : originalPackets) - { - addRandomRealtimeUMP(); - modifiedPackets.add (packet); - addRandomRealtimeUMP(); - } - - MidiBuffer output; - converter.dispatch (modifiedPackets.data(), - modifiedPackets.data() + modifiedPackets.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - - const auto numOutputs = output.getNumEvents(); - const auto numInputs = realtimeMessages.getNumEvents(); - expect (numOutputs == numInputs + 1); - - if (numOutputs == numInputs + 1) - { - const auto isMetadataEquivalent = [] (const MidiMessageMetadata& a, - const MidiMessageMetadata& b) - { - return equal (a.getMessage(), b.getMessage()); - }; - - auto it = output.begin(); - - for (const auto meta : realtimeMessages) - { - if (! isMetadataEquivalent (*it, meta)) - { - expect (equal ((*it).getMessage(), sysEx)); - ++it; - } - - expect (isMetadataEquivalent (*it, meta)); - ++it; - } - } - } - - beginTest ("UMP SysEx7 messages interspersed with System Realtime and Utility messages convert to bytestream"); - { - const auto sysEx = createRandomSysEx (random, 300); - Packets originalPackets; - Conversion::toMidi1 (sysEx, originalPackets); - - Packets modifiedPackets; - MidiBuffer realtimeMessages; - - const auto addRandomRealtimeUMP = [&] - { - const auto newPacket = createRandomRealtimeUMP (random); - modifiedPackets.add (View (newPacket.data())); - realtimeMessages.addEvent (Midi1ToBytestreamTranslator::fromUmp (newPacket), 0); - }; - - const auto addRandomUtilityUMP = [&] - { - const auto newPacket = createRandomUtilityUMP (random); - modifiedPackets.add (View (newPacket.data())); - }; - - for (const auto& packet : originalPackets) - { - addRandomRealtimeUMP(); - addRandomUtilityUMP(); - modifiedPackets.add (packet); - addRandomRealtimeUMP(); - addRandomUtilityUMP(); - } - - MidiBuffer output; - converter.dispatch (modifiedPackets.data(), - modifiedPackets.data() + modifiedPackets.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - - const auto numOutputs = output.getNumEvents(); - const auto numInputs = realtimeMessages.getNumEvents(); - expect (numOutputs == numInputs + 1); - - if (numOutputs == numInputs + 1) - { - const auto isMetadataEquivalent = [] (const MidiMessageMetadata& a, const MidiMessageMetadata& b) - { - return equal (a.getMessage(), b.getMessage()); - }; - - auto it = output.begin(); - - for (const auto meta : realtimeMessages) - { - if (! isMetadataEquivalent (*it, meta)) - { - expect (equal ((*it).getMessage(), sysEx)); - ++it; - } - - expect (isMetadataEquivalent (*it, meta)); - ++it; - } - } - } - - beginTest ("SysEx messages are terminated by non-Utility, non-Realtime messages"); - { - const auto noteOn = [&] - { - MidiBuffer b; - b.addEvent (MidiMessage::noteOn (1, uint8_t (64), uint8_t (64)), 0); - return b; - }(); - - const auto noteOnPackets = [&] - { - Packets p; - - for (const auto meta : noteOn) - Conversion::toMidi1 (meta.getMessage(), p); - - return p; - }(); - - const auto sysEx = createRandomSysEx (random, 300); - - const auto originalPackets = [&] - { - Packets p; - Conversion::toMidi1 (sysEx, p); - return p; - }(); - - const auto modifiedPackets = [&] - { - Packets p; - - const auto insertionPoint = std::next (originalPackets.begin(), 10); - std::for_each (originalPackets.begin(), - insertionPoint, - [&] (const View& view) { p.add (view); }); - - for (const auto& view : noteOnPackets) - p.add (view); - - std::for_each (insertionPoint, - originalPackets.end(), - [&] (const View& view) { p.add (view); }); - - return p; - }(); - - // modifiedPackets now contains some SysEx packets interrupted by a MIDI 1 noteOn - - MidiBuffer output; - - const auto pushToOutput = [&] (const Packets& p) - { - converter.dispatch (p.data(), - p.data() + p.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - }; - - pushToOutput (modifiedPackets); - - // Interrupted sysEx shouldn't be present - expect (equal (output, noteOn)); - - const auto newSysEx = createRandomSysEx (random, 300); - Packets newSysExPackets; - Conversion::toMidi1 (newSysEx, newSysExPackets); - - // If we push another midi event without interrupting it, - // it should get through without being modified, - // and it shouldn't be affected by the previous (interrupted) sysex. - - output.clear(); - pushToOutput (newSysExPackets); - - expect (output.getNumEvents() == 1); - - for (const auto meta : output) - expect (equal (meta.getMessage(), newSysEx)); - } - - beginTest ("Widening conversions work"); - { - // This is similar to the 'slow' example code from the MIDI 2.0 spec - const auto baselineScale = [] (uint32_t srcVal, uint32_t srcBits, uint32_t dstBits) - { - const auto scaleBits = (uint32_t) (dstBits - srcBits); - - auto bitShiftedValue = (uint32_t) (srcVal << scaleBits); - - const auto srcCenter = (uint32_t) (1 << (srcBits - 1)); - - if (srcVal <= srcCenter) - return bitShiftedValue; - - const auto repeatBits = (uint32_t) (srcBits - 1); - const auto repeatMask = (uint32_t) ((1 << repeatBits) - 1); - - auto repeatValue = (uint32_t) (srcVal & repeatMask); - - if (scaleBits > repeatBits) - repeatValue <<= scaleBits - repeatBits; - else - repeatValue >>= repeatBits - scaleBits; - - while (repeatValue != 0) - { - bitShiftedValue |= repeatValue; - repeatValue >>= repeatBits; - } - - return bitShiftedValue; - }; - - const auto baselineScale7To8 = [&] (uint8_t in) - { - return baselineScale (in, 7, 8); - }; - - const auto baselineScale7To16 = [&] (uint8_t in) - { - return baselineScale (in, 7, 16); - }; - - const auto baselineScale14To16 = [&] (uint16_t in) - { - return baselineScale (in, 14, 16); - }; - - const auto baselineScale7To32 = [&] (uint8_t in) - { - return baselineScale (in, 7, 32); - }; - - const auto baselineScale14To32 = [&] (uint16_t in) - { - return baselineScale (in, 14, 32); - }; - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals ((int64_t) Conversion::scaleTo8 (rand), - (int64_t) baselineScale7To8 (rand)); - } - - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x00), (int64_t) 0x0000); - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x0a), (int64_t) 0x1400); - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x40), (int64_t) 0x8000); - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x57), (int64_t) 0xaeba); - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x7f), (int64_t) 0xffff); - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals ((int64_t) Conversion::scaleTo16 (rand), - (int64_t) baselineScale7To16 (rand)); - } - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint16_t) random.nextInt (0x4000); - expectEquals ((int64_t) Conversion::scaleTo16 (rand), - (int64_t) baselineScale14To16 (rand)); - } - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals ((int64_t) Conversion::scaleTo32 (rand), - (int64_t) baselineScale7To32 (rand)); - } - - expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x0000), (int64_t) 0x00000000); - expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x2000), (int64_t) 0x80000000); - expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x3fff), (int64_t) 0xffffffff); - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint16_t) random.nextInt (0x4000); - expectEquals ((int64_t) Conversion::scaleTo32 (rand), - (int64_t) baselineScale14To32 (rand)); - } - } - - beginTest ("Round-trip widening/narrowing conversions work"); - { - for (auto i = 0; i != 100; ++i) - { - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals (Conversion::scaleTo7 (Conversion::scaleTo8 (rand)), rand); - } - - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals (Conversion::scaleTo7 (Conversion::scaleTo16 (rand)), rand); - } - - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals (Conversion::scaleTo7 (Conversion::scaleTo32 (rand)), rand); - } - - { - const auto rand = (uint16_t) random.nextInt (0x4000); - expectEquals ((uint64_t) Conversion::scaleTo14 (Conversion::scaleTo16 (rand)), (uint64_t) rand); - } - - { - const auto rand = (uint16_t) random.nextInt (0x4000); - expectEquals ((uint64_t) Conversion::scaleTo14 (Conversion::scaleTo32 (rand)), (uint64_t) rand); - } - } - } - - beginTest ("MIDI 2 -> 1 note on conversions"); - { - { - Packets midi2; - midi2.add (PacketX2 { 0x41946410, 0x12345678 }); - - Packets midi1; - midi1.add (PacketX1 { 0x21946409 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - { - // If the velocity is close to 0, the output velocity should still be 1 - Packets midi2; - midi2.add (PacketX2 { 0x4295327f, 0x00345678 }); - - Packets midi1; - midi1.add (PacketX1 { 0x22953201 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - } - - beginTest ("MIDI 2 -> 1 note off conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x448b0520, 0xfedcba98 }); - - Packets midi1; - midi1.add (PacketX1 { 0x248b057f }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 poly pressure conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x49af0520, 0x80dcba98 }); - - Packets midi1; - midi1.add (PacketX1 { 0x29af0540 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 control change conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x49b00520, 0x80dcba98 }); - - Packets midi1; - midi1.add (PacketX1 { 0x29b00540 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 channel pressure conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x40d20520, 0x80dcba98 }); - - Packets midi1; - midi1.add (PacketX1 { 0x20d24000 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 nrpn rpn conversion"); - { - { - Packets midi2; - midi2.add (PacketX2 { 0x44240123, 0x456789ab }); - - Packets midi1; - midi1.add (PacketX1 { 0x24b46501 }); - midi1.add (PacketX1 { 0x24b46423 }); - midi1.add (PacketX1 { 0x24b40622 }); - midi1.add (PacketX1 { 0x24b42659 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - { - Packets midi2; - midi2.add (PacketX2 { 0x48347f7f, 0xffffffff }); - - Packets midi1; - midi1.add (PacketX1 { 0x28b4637f }); - midi1.add (PacketX1 { 0x28b4627f }); - midi1.add (PacketX1 { 0x28b4067f }); - midi1.add (PacketX1 { 0x28b4267f }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - } - - beginTest ("MIDI 2 -> 1 program change and bank select conversion"); - { - { - // If the bank valid bit is 0, just emit a program change - Packets midi2; - midi2.add (PacketX2 { 0x4cc10000, 0x70004020 }); - - Packets midi1; - midi1.add (PacketX1 { 0x2cc17000 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - { - // If the bank valid bit is 1, emit bank select control changes and a program change - Packets midi2; - midi2.add (PacketX2 { 0x4bc20001, 0x70004020 }); - - Packets midi1; - midi1.add (PacketX1 { 0x2bb20040 }); - midi1.add (PacketX1 { 0x2bb22020 }); - midi1.add (PacketX1 { 0x2bc27000 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - } - - beginTest ("MIDI 2 -> 1 pitch bend conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x4eee0000, 0x12340000 }); - - Packets midi1; - midi1.add (PacketX1 { 0x2eee0d09 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 messages which don't convert"); - { - const uint8_t opcodes[] { 0x0, 0x1, 0x4, 0x5, 0x6, 0xf }; - - for (const auto opcode : opcodes) - { - Packets midi2; - midi2.add (PacketX2 { Utils::bytesToWord (0x40, (uint8_t) (opcode << 0x4), 0, 0), 0x0 }); - checkMidi2ToMidi1Conversion (midi2, {}); - } - } - - beginTest ("MIDI 2 -> 1 messages which are passed through"); - { - const uint8_t typecodesX1[] { 0x0, 0x1, 0x2 }; - - for (const auto typecode : typecodesX1) - { - Packets p; - p.add (PacketX1 { (uint32_t) ((int64_t) typecode << 0x1c | (random.nextInt64() & 0xffffff)) }); - - checkMidi2ToMidi1Conversion (p, p); - } - - { - Packets p; - p.add (PacketX2 { (uint32_t) (0x3 << 0x1c | (random.nextInt64() & 0xffffff)), - (uint32_t) (random.nextInt64() & 0xffffffff) }); - - checkMidi2ToMidi1Conversion (p, p); - } - - { - Packets p; - p.add (PacketX4 { (uint32_t) (0x5 << 0x1c | (random.nextInt64() & 0xffffff)), - (uint32_t) (random.nextInt64() & 0xffffffff), - (uint32_t) (random.nextInt64() & 0xffffffff), - (uint32_t) (random.nextInt64() & 0xffffffff) }); - - checkMidi2ToMidi1Conversion (p, p); - } - } - - beginTest ("MIDI 2 -> 1 control changes which should be ignored"); - { - const uint8_t CCs[] { 6, 38, 98, 99, 100, 101, 0, 32 }; - - for (const auto cc : CCs) - { - Packets midi2; - midi2.add (PacketX2 { (uint32_t) (0x40b00000 | (cc << 0x8)), 0x00000000 }); - - checkMidi2ToMidi1Conversion (midi2, {}); - } - } - - beginTest ("MIDI 1 -> 2 note on conversions"); - { - { - Packets midi1; - midi1.add (PacketX1 { 0x20904040 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40904000, static_cast (Conversion::scaleTo16 (0x40_u8)) << 0x10 }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - // If velocity is 0, convert to a note-off - { - Packets midi1; - midi1.add (PacketX1 { 0x23935100 }); - - Packets midi2; - midi2.add (PacketX2 { 0x43835100, 0x0 }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - } - - beginTest ("MIDI 1 -> 2 note off conversions"); - { - Packets midi1; - midi1.add (PacketX1 { 0x21831020 }); - - Packets midi2; - midi2.add (PacketX2 { 0x41831000, static_cast (Conversion::scaleTo16 (0x20_u8)) << 0x10 }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - beginTest ("MIDI 1 -> 2 poly pressure conversions"); - { - Packets midi1; - midi1.add (PacketX1 { 0x20af7330 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40af7300, Conversion::scaleTo32 (0x30_u8) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - beginTest ("individual MIDI 1 -> 2 control changes which should be ignored"); - { - const uint8_t CCs[] { 6, 38, 98, 99, 100, 101, 0, 32 }; - - for (const auto cc : CCs) - { - Packets midi1; - midi1.add (PacketX1 { Utils::bytesToWord (0x20, 0xb0, cc, 0x00) }); - - checkMidi1ToMidi2Conversion (midi1, {}); - } - } - - beginTest ("MIDI 1 -> 2 control change conversions"); - { - // normal control change - { - Packets midi1; - midi1.add (PacketX1 { 0x29b1017f }); - - Packets midi2; - midi2.add (PacketX2 { 0x49b10100, Conversion::scaleTo32 (0x7f_u8) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - // nrpn - { - Packets midi1; - midi1.add (PacketX1 { 0x20b06301 }); - midi1.add (PacketX1 { 0x20b06223 }); - midi1.add (PacketX1 { 0x20b00645 }); - midi1.add (PacketX1 { 0x20b02667 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40300123, Conversion::scaleTo32 (static_cast ((0x45 << 7) | 0x67)) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - // rpn - { - Packets midi1; - midi1.add (PacketX1 { 0x20b06543 }); - midi1.add (PacketX1 { 0x20b06421 }); - midi1.add (PacketX1 { 0x20b00601 }); - midi1.add (PacketX1 { 0x20b02623 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40204321, Conversion::scaleTo32 (static_cast ((0x01 << 7) | 0x23)) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - } - - beginTest ("MIDI 1 -> MIDI 2 program change and bank select"); - { - Packets midi1; - // program change with bank - midi1.add (PacketX1 { 0x2bb20030 }); - midi1.add (PacketX1 { 0x2bb22010 }); - midi1.add (PacketX1 { 0x2bc24000 }); - // program change without bank (different group and channel) - midi1.add (PacketX1 { 0x20c01000 }); - - Packets midi2; - midi2.add (PacketX2 { 0x4bc20001, 0x40003010 }); - midi2.add (PacketX2 { 0x40c00000, 0x10000000 }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - beginTest ("MIDI 1 -> MIDI 2 channel pressure conversions"); - { - Packets midi1; - midi1.add (PacketX1 { 0x20df3000 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40df0000, Conversion::scaleTo32 (0x30_u8) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - beginTest ("MIDI 1 -> MIDI 2 pitch bend conversions"); - { - Packets midi1; - midi1.add (PacketX1 { 0x20e74567 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40e70000, Conversion::scaleTo32 (static_cast ((0x67 << 7) | 0x45)) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - } - -private: - static Packets convertMidi2ToMidi1 (const Packets& midi2) - { - Packets r; - - for (const auto& packet : midi2) - Conversion::midi2ToMidi1DefaultTranslation (packet, [&r] (const View& v) { r.add (v); }); - - return r; - } - - static Packets convertMidi1ToMidi2 (const Packets& midi1) - { - Packets r; - Midi1ToMidi2DefaultTranslator translator; - - for (const auto& packet : midi1) - translator.dispatch (packet, [&r] (const View& v) { r.add (v); }); - - return r; - } - - void checkBytestreamConversion (const Packets& actual, const Packets& expected) - { - expectEquals ((int) actual.size(), (int) expected.size()); - - if (actual.size() != expected.size()) - return; - - auto actualPtr = actual.data(); - - std::for_each (expected.data(), - expected.data() + expected.size(), - [&] (const uint32_t word) { expectEquals ((uint64_t) *actualPtr++, (uint64_t) word); }); - } - - void checkMidi2ToMidi1Conversion (const Packets& midi2, const Packets& expected) - { - checkBytestreamConversion (convertMidi2ToMidi1 (midi2), expected); - } - - void checkMidi1ToMidi2Conversion (const Packets& midi1, const Packets& expected) - { - checkBytestreamConversion (convertMidi1ToMidi2 (midi1), expected); - } - - MidiMessage createRandomSysEx (Random& random, size_t sysExBytes) - { - std::vector data; - data.reserve (sysExBytes); - - for (size_t i = 0; i != sysExBytes; ++i) - data.push_back (uint8_t (random.nextInt (0x80))); - - return MidiMessage::createSysExMessage (data.data(), int (data.size())); - } - - PacketX1 createRandomUtilityUMP (Random& random) - { - const auto status = random.nextInt (3); - - return PacketX1 { Utils::bytesToWord (0, - uint8_t (status << 0x4), - uint8_t (status == 0 ? 0 : random.nextInt (0x100)), - uint8_t (status == 0 ? 0 : random.nextInt (0x100))) }; - } - - PacketX1 createRandomRealtimeUMP (Random& random) - { - const auto status = [&] - { - switch (random.nextInt (6)) - { - case 0: return 0xf8; - case 1: return 0xfa; - case 2: return 0xfb; - case 3: return 0xfc; - case 4: return 0xfe; - case 5: return 0xff; - } - - jassertfalse; - return 0x00; - }(); - - return PacketX1 { Utils::bytesToWord (0x10, uint8_t (status), 0x00, 0x00) }; - } - - template - void forEachNonSysExTestMessage (Random& random, Fn&& fn) - { - for (uint16_t counter = 0x80; counter != 0x100; ++counter) - { - const auto firstByte = (uint8_t) counter; - - if (firstByte == 0xf0 || firstByte == 0xf7) - continue; // sysEx is tested separately - - const auto length = MidiMessage::getMessageLengthFromFirstByte (firstByte); - const auto getDataByte = [&] { return uint8_t (random.nextInt (256) & 0x7f); }; - - const auto message = [&] - { - switch (length) - { - case 1: return MidiMessage (firstByte); - case 2: return MidiMessage (firstByte, getDataByte()); - case 3: return MidiMessage (firstByte, getDataByte(), getDataByte()); - } - - return MidiMessage(); - }(); - - fn (message); - } - } - - #if JUCE_WINDOWS && ! JUCE_MINGW - #define JUCE_CHECKED_ITERATOR(msg, size) \ - stdext::checked_array_iterator::type> ((msg), (size_t) (size)) - #else - #define JUCE_CHECKED_ITERATOR(msg, size) (msg) - #endif - - static bool equal (const MidiMessage& a, const MidiMessage& b) noexcept - { - return a.getRawDataSize() == b.getRawDataSize() - && std::equal (a.getRawData(), a.getRawData() + a.getRawDataSize(), - JUCE_CHECKED_ITERATOR (b.getRawData(), b.getRawDataSize())); - } - - #undef JUCE_CHECKED_ITERATOR - - static bool equal (const MidiBuffer& a, const MidiBuffer& b) noexcept - { - return a.data == b.data; - } -}; - -static UniversalMidiPacketTests universalMidiPacketTests; - -#endif - -} -} diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h --- juce-6.1.5~ds0/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/java/app/com/rmsl/juce/JuceMidiSupport.java juce-7.0.0~ds0/modules/juce_audio_devices/native/java/app/com/rmsl/juce/JuceMidiSupport.java --- juce-6.1.5~ds0/modules/juce_audio_devices/native/java/app/com/rmsl/juce/JuceMidiSupport.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/java/app/com/rmsl/juce/JuceMidiSupport.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_android_Audio.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_android_Audio.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_android_Audio.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_android_Audio.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -357,9 +357,11 @@ if (callback != nullptr) { - callback->audioDeviceIOCallback (inputChannelBuffer.getArrayOfReadPointers(), numClientInputChannels, - outputChannelBuffer.getArrayOfWritePointers(), numClientOutputChannels, - actualBufferSize); + callback->audioDeviceIOCallbackWithContext (inputChannelBuffer.getArrayOfReadPointers(), + numClientInputChannels, + outputChannelBuffer.getArrayOfWritePointers(), + numClientOutputChannels, + actualBufferSize, {}); } else { diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_android_Midi.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_android_Midi.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_android_Midi.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_android_Midi.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_android_Oboe.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_android_Oboe.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_android_Oboe.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_android_Oboe.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -428,8 +428,12 @@ { if (auto* cb = callback.exchange (nullptr)) { - cb->audioDeviceIOCallback (inputChannelData, numInputChannels, - outputChannelData, numOutputChannels, numFrames); + cb->audioDeviceIOCallbackWithContext (inputChannelData, + numInputChannels, + outputChannelData, + numOutputChannels, + numFrames, + {}); callback.set (cb); } else @@ -1416,6 +1420,7 @@ }; //============================================================================== +pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr); pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr) { auto thread = std::make_unique(); diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_android_OpenSL.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_android_OpenSL.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_android_OpenSL.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_android_OpenSL.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -605,7 +605,7 @@ { if (auto* cb = callback.exchange (nullptr)) { - cb->audioDeviceIOCallback (inputChannelData, inputChannels, outputChannelData, outputChannels, bufferSize); + cb->audioDeviceIOCallbackWithContext (inputChannelData, inputChannels, outputChannelData, outputChannels, bufferSize, {}); callback.set (cb); } else @@ -1273,6 +1273,7 @@ }; //============================================================================== +pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr); pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr) { auto thread = std::make_unique(); diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_ios_Audio.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_ios_Audio.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_ios_Audio.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_ios_Audio.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -20,6 +20,8 @@ ============================================================================== */ +#include + namespace juce { @@ -250,8 +252,7 @@ }; //============================================================================== -struct iOSAudioIODevice::Pimpl : public AudioPlayHead, - public AsyncUpdater +struct iOSAudioIODevice::Pimpl : public AsyncUpdater { Pimpl (iOSAudioIODeviceType* ioDeviceType, iOSAudioIODevice& ioDevice) : deviceType (ioDeviceType), @@ -564,132 +565,140 @@ } //============================================================================== - bool canControlTransport() override { return interAppAudioConnected; } - - void transportPlay (bool shouldSartPlaying) override - { - if (! canControlTransport()) - return; - - HostCallbackInfo callbackInfo; - fillHostCallbackInfo (callbackInfo); - - Boolean hostIsPlaying = NO; - OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, - &hostIsPlaying, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr); - - ignoreUnused (err); - jassert (err == noErr); - - if (hostIsPlaying != shouldSartPlaying) - handleAudioTransportEvent (kAudioUnitRemoteControlEvent_TogglePlayPause); - } - - void transportRecord (bool shouldStartRecording) override - { - if (! canControlTransport()) - return; - - HostCallbackInfo callbackInfo; - fillHostCallbackInfo (callbackInfo); - - Boolean hostIsRecording = NO; - OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, - nullptr, - &hostIsRecording, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr); - ignoreUnused (err); - jassert (err == noErr); - - if (hostIsRecording != shouldStartRecording) - handleAudioTransportEvent (kAudioUnitRemoteControlEvent_ToggleRecord); - } - - void transportRewind() override + class PlayHead : public AudioPlayHead { - if (canControlTransport()) - handleAudioTransportEvent (kAudioUnitRemoteControlEvent_Rewind); - } + public: + explicit PlayHead (Pimpl& implIn) : impl (implIn) {} - bool getCurrentPosition (CurrentPositionInfo& result) override - { - if (! canControlTransport()) - return false; + bool canControlTransport() override { return canControlTransportImpl(); } - zerostruct (result); + void transportPlay (bool shouldSartPlaying) override + { + if (! canControlTransport()) + return; - HostCallbackInfo callbackInfo; - fillHostCallbackInfo (callbackInfo); + HostCallbackInfo callbackInfo; + impl.fillHostCallbackInfo (callbackInfo); - if (callbackInfo.hostUserData == nullptr) - return false; + Boolean hostIsPlaying = NO; + OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, + &hostIsPlaying, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr); - Boolean hostIsPlaying = NO; - Boolean hostIsRecording = NO; - Float64 hostCurrentSampleInTimeLine = 0; - Boolean hostIsCycling = NO; - Float64 hostCycleStartBeat = 0; - Float64 hostCycleEndBeat = 0; - OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, - &hostIsPlaying, - &hostIsRecording, - nullptr, - &hostCurrentSampleInTimeLine, - &hostIsCycling, - &hostCycleStartBeat, - &hostCycleEndBeat); - if (err == kAUGraphErr_CannotDoInCurrentContext) - return false; + ignoreUnused (err); + jassert (err == noErr); - jassert (err == noErr); + if (hostIsPlaying != shouldSartPlaying) + impl.handleAudioTransportEvent (kAudioUnitRemoteControlEvent_TogglePlayPause); + } - result.timeInSamples = (int64) hostCurrentSampleInTimeLine; - result.isPlaying = hostIsPlaying; - result.isRecording = hostIsRecording; - result.isLooping = hostIsCycling; - result.ppqLoopStart = hostCycleStartBeat; - result.ppqLoopEnd = hostCycleEndBeat; - - result.timeInSeconds = result.timeInSamples / sampleRate; - - Float64 hostBeat = 0; - Float64 hostTempo = 0; - err = callbackInfo.beatAndTempoProc (callbackInfo.hostUserData, - &hostBeat, - &hostTempo); - jassert (err == noErr); + void transportRecord (bool shouldStartRecording) override + { + if (! canControlTransport()) + return; - result.ppqPosition = hostBeat; - result.bpm = hostTempo; + HostCallbackInfo callbackInfo; + impl.fillHostCallbackInfo (callbackInfo); - Float32 hostTimeSigNumerator = 0; - UInt32 hostTimeSigDenominator = 0; - Float64 hostCurrentMeasureDownBeat = 0; - err = callbackInfo.musicalTimeLocationProc (callbackInfo.hostUserData, - nullptr, - &hostTimeSigNumerator, - &hostTimeSigDenominator, - &hostCurrentMeasureDownBeat); - jassert (err == noErr); + Boolean hostIsRecording = NO; + OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, + nullptr, + &hostIsRecording, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr); + ignoreUnused (err); + jassert (err == noErr); + + if (hostIsRecording != shouldStartRecording) + impl.handleAudioTransportEvent (kAudioUnitRemoteControlEvent_ToggleRecord); + } + + void transportRewind() override + { + if (canControlTransport()) + impl.handleAudioTransportEvent (kAudioUnitRemoteControlEvent_Rewind); + } + + Optional getPosition() const override + { + if (! canControlTransportImpl()) + return {}; + + HostCallbackInfo callbackInfo; + impl.fillHostCallbackInfo (callbackInfo); + + if (callbackInfo.hostUserData == nullptr) + return {}; + + Boolean hostIsPlaying = NO; + Boolean hostIsRecording = NO; + Float64 hostCurrentSampleInTimeLine = 0; + Boolean hostIsCycling = NO; + Float64 hostCycleStartBeat = 0; + Float64 hostCycleEndBeat = 0; + OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, + &hostIsPlaying, + &hostIsRecording, + nullptr, + &hostCurrentSampleInTimeLine, + &hostIsCycling, + &hostCycleStartBeat, + &hostCycleEndBeat); + if (err == kAUGraphErr_CannotDoInCurrentContext) + return {}; + + jassert (err == noErr); + + PositionInfo result; + + result.setTimeInSamples ((int64) hostCurrentSampleInTimeLine); + result.setIsPlaying (hostIsPlaying); + result.setIsRecording (hostIsRecording); + result.setIsLooping (hostIsCycling); + result.setLoopPoints (LoopPoints { hostCycleStartBeat, hostCycleEndBeat }); + result.setTimeInSeconds (*result.getTimeInSamples() / impl.sampleRate); + + Float64 hostBeat = 0; + Float64 hostTempo = 0; + err = callbackInfo.beatAndTempoProc (callbackInfo.hostUserData, + &hostBeat, + &hostTempo); + jassert (err == noErr); + + result.setPpqPosition (hostBeat); + result.setBpm (hostTempo); + + Float32 hostTimeSigNumerator = 0; + UInt32 hostTimeSigDenominator = 0; + Float64 hostCurrentMeasureDownBeat = 0; + err = callbackInfo.musicalTimeLocationProc (callbackInfo.hostUserData, + nullptr, + &hostTimeSigNumerator, + &hostTimeSigDenominator, + &hostCurrentMeasureDownBeat); + jassert (err == noErr); + + result.setPpqPositionOfLastBarStart (hostCurrentMeasureDownBeat); + result.setTimeSignature (TimeSignature { (int) hostTimeSigNumerator, (int) hostTimeSigDenominator }); + + result.setFrameRate (AudioPlayHead::fpsUnknown); - result.ppqPositionOfLastBarStart = hostCurrentMeasureDownBeat; - result.timeSigNumerator = (int) hostTimeSigNumerator; - result.timeSigDenominator = (int) hostTimeSigDenominator; + return result; + } - result.frameRate = AudioPlayHead::fpsUnknown; + private: + bool canControlTransportImpl() const { return impl.interAppAudioConnected; } - return true; - } + Pimpl& impl; + }; //============================================================================== #if JUCE_MODULE_AVAILABLE_juce_graphics @@ -900,9 +909,14 @@ zeromem (inputData[c], channelDataSize); } - callback->audioDeviceIOCallback ((const float**) inputData, channelData.inputs ->numActiveChannels, - outputData, channelData.outputs->numActiveChannels, - (int) numFrames); + const auto nanos = time != nullptr ? timeConversions.hostTimeToNanos (time->mHostTime) : 0; + + callback->audioDeviceIOCallbackWithContext ((const float**) inputData, + channelData.inputs ->numActiveChannels, + outputData, + channelData.outputs->numActiveChannels, + (int) numFrames, + { (time != nullptr && (time->mFlags & kAudioTimeStampHostTimeValid) != 0) ? &nanos : nullptr }); for (int c = 0; c < channelData.outputs->numActiveChannels; ++c) { @@ -1329,6 +1343,8 @@ AudioBuffer audioData { 0, 0 }; }; + CoreAudioTimeConversions timeConversions; + IOChannelData channelData; BigInteger requestedInputChannels, requestedOutputChannels; @@ -1370,6 +1386,7 @@ Float64 lastSampleTime; unsigned int lastNumFrames; int xrun; + PlayHead playhead { *this }; JUCE_DECLARE_NON_COPYABLE (Pimpl) }; @@ -1420,7 +1437,7 @@ int iOSAudioIODevice::getXRunCount() const noexcept { return pimpl->xrun; } void iOSAudioIODevice::setMidiMessageCollector (MidiMessageCollector* collector) { pimpl->messageCollector = collector; } -AudioPlayHead* iOSAudioIODevice::getAudioPlayHead() const { return pimpl.get(); } +AudioPlayHead* iOSAudioIODevice::getAudioPlayHead() const { return &pimpl->playhead; } bool iOSAudioIODevice::isInterAppAudioConnected() const { return pimpl->interAppAudioConnected; } #if JUCE_MODULE_AVAILABLE_juce_graphics diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_ios_Audio.h juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_ios_Audio.h --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_ios_Audio.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_ios_Audio.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_linux_ALSA.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_linux_ALSA.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_linux_ALSA.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_linux_ALSA.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -50,17 +50,15 @@ static void getDeviceSampleRates (snd_pcm_t* handle, Array& rates) { - const int ratesToTry[] = { 22050, 24000, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 }; - snd_pcm_hw_params_t* hwParams; snd_pcm_hw_params_alloca (&hwParams); - for (int i = 0; ratesToTry[i] != 0; ++i) + for (const auto rateToTry : SampleRateHelpers::getAllSampleRates()) { if (snd_pcm_hw_params_any (handle, hwParams) >= 0 - && snd_pcm_hw_params_test_rate (handle, hwParams, (unsigned int) ratesToTry[i], 0) == 0) + && snd_pcm_hw_params_test_rate (handle, hwParams, (unsigned int) rateToTry, 0) == 0) { - rates.addIfNotAlreadyThere ((double) ratesToTry[i]); + rates.addIfNotAlreadyThere (rateToTry); } } } @@ -713,11 +711,12 @@ if (callback != nullptr) { - callback->audioDeviceIOCallback (inputChannelDataForCallback.getRawDataPointer(), - inputChannelDataForCallback.size(), - outputChannelDataForCallback.getRawDataPointer(), - outputChannelDataForCallback.size(), - bufferSize); + callback->audioDeviceIOCallbackWithContext (inputChannelDataForCallback.getRawDataPointer(), + inputChannelDataForCallback.size(), + outputChannelDataForCallback.getRawDataPointer(), + outputChannelDataForCallback.size(), + bufferSize, + {}); } else { @@ -792,7 +791,7 @@ const String inputId, outputId; std::unique_ptr outputDevice, inputDevice; std::atomic numCallbacks { 0 }; - bool audioIoInProgress = false; + std::atomic audioIoInProgress { false }; CriticalSection callbackLock; @@ -1289,12 +1288,12 @@ } //============================================================================== -AudioIODeviceType* createAudioIODeviceType_ALSA_Soundcards() +static inline AudioIODeviceType* createAudioIODeviceType_ALSA_Soundcards() { return new ALSAAudioIODeviceType (true, "ALSA HW"); } -AudioIODeviceType* createAudioIODeviceType_ALSA_PCMDevices() +static inline AudioIODeviceType* createAudioIODeviceType_ALSA_PCMDevices() { return new ALSAAudioIODeviceType (false, "ALSA"); } diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_linux_Bela.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_linux_Bela.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_linux_Bela.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_linux_Bela.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -433,9 +433,12 @@ channelOutBuffer[ch] = &context.analogOut[(Frames) (ch - analogChannelStart) * context.audioFrames]; } - callback->audioDeviceIOCallback (channelInBuffer.getData(), actualNumberOfInputs, - channelOutBuffer.getData(), actualNumberOfOutputs, - (int) context.audioFrames); + callback->audioDeviceIOCallbackWithContext (channelInBuffer.getData(), + actualNumberOfInputs, + channelOutBuffer.getData(), + actualNumberOfOutputs, + (int) context.audioFrames, + {}); } } diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -462,8 +462,12 @@ if (callback != nullptr) { if ((numActiveInChans + numActiveOutChans) > 0) - callback->audioDeviceIOCallback (const_cast (inChans.getData()), numActiveInChans, - outChans, numActiveOutChans, numSamples); + callback->audioDeviceIOCallbackWithContext (const_cast (inChans.getData()), + numActiveInChans, + outChans, + numActiveOutChans, + numSamples, + {}); } else { diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_linux_Midi.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_linux_Midi.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_linux_Midi.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_linux_Midi.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -20,6 +20,8 @@ ============================================================================== */ +#include + namespace juce { @@ -294,15 +296,11 @@ if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, ranges))) { - for (auto r : { 8000, 11025, 16000, 22050, 24000, 32000, - 44100, 48000, 88200, 96000, 176400, - 192000, 352800, 384000, 705600, 768000 }) + for (const auto rate : SampleRateHelpers::getAllSampleRates()) { - auto rate = (double) r; - for (int j = size / (int) sizeof (AudioValueRange); --j >= 0;) { - if (rate >= ranges[j].mMinimum - 2 && rate <= ranges[j].mMaximum + 2) + if (ranges[j].mMinimum - 2 <= rate && rate <= ranges[j].mMaximum + 2) { newSampleRates.add (rate); break; @@ -315,6 +313,11 @@ if (newSampleRates.isEmpty() && sampleRate > 0) newSampleRates.add (sampleRate); + auto nominalRate = getNominalSampleRate(); + + if ((nominalRate > 0) && ! newSampleRates.contains (nominalRate)) + newSampleRates.addUsingDefaultSort (nominalRate); + return newSampleRates; } @@ -745,7 +748,8 @@ double getSampleRate() const { return sampleRate; } int getBufferSize() const { return bufferSize; } - void audioCallback (const AudioBufferList* inInputData, + void audioCallback (const AudioTimeStamp* timeStamp, + const AudioBufferList* inInputData, AudioBufferList* outOutputData) { const ScopedLock sl (callbackLock); @@ -777,11 +781,14 @@ } } - callback->audioDeviceIOCallback (const_cast (tempInputBuffers.get()), - numInputChans, - tempOutputBuffers, - numOutputChans, - bufferSize); + const auto nanos = timeStamp != nullptr ? timeConversions.hostTimeToNanos (timeStamp->mHostTime) : 0; + + callback->audioDeviceIOCallbackWithContext (const_cast (tempInputBuffers.get()), + numInputChans, + tempOutputBuffers, + numOutputChans, + bufferSize, + { timeStamp != nullptr ? &nanos : nullptr }); for (int i = numOutputChans; --i >= 0;) { @@ -837,13 +844,14 @@ AudioDeviceIOProcID audioProcID = {}; private: + CoreAudioTimeConversions timeConversions; AudioIODeviceCallback* callback = nullptr; CriticalSection callbackLock; AudioDeviceID deviceID; bool started = false, audioDeviceStopPending = false; std::atomic playing { false }; double sampleRate = 0; - int bufferSize = 512; + int bufferSize = 0; HeapBlock audioBuffer; int numInputChans = 0; int numOutputChans = 0; @@ -875,14 +883,14 @@ } static OSStatus audioIOProc (AudioDeviceID /*inDevice*/, - const AudioTimeStamp* /*inNow*/, + const AudioTimeStamp* inNow, const AudioBufferList* inInputData, const AudioTimeStamp* /*inInputTime*/, AudioBufferList* outOutputData, const AudioTimeStamp* /*inOutputTime*/, void* device) { - static_cast (device)->audioCallback (inInputData, outOutputData); + static_cast (device)->audioCallback (inNow, inInputData, outOutputData); return noErr; } @@ -1555,7 +1563,7 @@ newCallback->audioDeviceAboutToStart (this); const ScopedLock sl (callbackLock); - previousCallback = std::exchange (callback, newCallback); + previousCallback = callback = newCallback; } } @@ -1623,8 +1631,12 @@ const ScopedLock sl (callbackLock); if (callback != nullptr) - callback->audioDeviceIOCallback ((const float**) inputChans.getRawDataPointer(), numInputChans, - outputChans.getRawDataPointer(), numOutputChans, numSamples); + callback->audioDeviceIOCallbackWithContext ((const float**) inputChans.getRawDataPointer(), + numInputChans, + outputChans.getRawDataPointer(), + numOutputChans, + numSamples, + {}); // Can't predict when the next output callback will happen else didCallback = false; } @@ -1919,9 +1931,12 @@ outputFifo.finishedWrite (size1 + size2); } - void audioDeviceIOCallback (const float** inputChannelData, int numInputChannels, - float** outputChannelData, int numOutputChannels, - int numSamples) override + void audioDeviceIOCallbackWithContext (const float** inputChannelData, + int numInputChannels, + float** outputChannelData, + int numOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext&) override { if (numInputChannels > 0) { diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -82,10 +82,8 @@ struct Sender; #if JUCE_HAS_NEW_COREMIDI_API - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") - template <> - struct Sender : public SenderBase + struct API_AVAILABLE (macos (11.0), ios (14.0)) Sender : public SenderBase { explicit Sender (MIDIEndpointRef ep) : umpConverter (getProtocolForEndpoint (ep)) @@ -177,8 +175,6 @@ send(); } }; - - JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif #if JUCE_HAS_OLD_COREMIDI_API @@ -829,10 +825,8 @@ struct CreatorFunctions; #if JUCE_HAS_NEW_COREMIDI_API - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") - template <> - struct CreatorFunctions + struct API_AVAILABLE (macos (11.0), ios (14.0)) CreatorFunctions { static OSStatus createInputPort (ump::PacketProtocol protocol, MIDIClientRef client, @@ -894,8 +888,6 @@ static_cast (readProcRefCon)->handlePackets (*list); } }; - - JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif #if JUCE_HAS_OLD_COREMIDI_API diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_win32_ASIO.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_win32_ASIO.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_win32_ASIO.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_win32_ASIO.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -349,13 +349,9 @@ Array newRates; if (asioObject != nullptr) - { - for (auto rate : { 8000, 11025, 16000, 22050, 24000, 32000, - 44100, 48000, 88200, 96000, 176400, - 192000, 352800, 384000, 705600, 768000 }) - if (asioObject->canSampleRate ((double) rate) == 0) - newRates.add ((double) rate); - } + for (const auto rate : SampleRateHelpers::getAllSampleRates()) + if (asioObject->canSampleRate (rate) == 0) + newRates.add (rate); if (newRates.isEmpty()) { @@ -1330,8 +1326,12 @@ inputFormat[i].convertToFloat (infos[i].buffers[bufferIndex], inBuffers[i], samps); } - currentCallback->audioDeviceIOCallback (const_cast (inBuffers.getData()), numActiveInputChans, - outBuffers, numActiveOutputChans, samps); + currentCallback->audioDeviceIOCallbackWithContext (const_cast (inBuffers.getData()), + numActiveInputChans, + outBuffers, + numActiveOutputChans, + samps, + {}); for (int i = 0; i < numActiveOutputChans; ++i) { diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -130,7 +130,7 @@ //============================================================================== namespace DSoundLogging { - String getErrorMessage (HRESULT hr) + static String getErrorMessage (HRESULT hr) { const char* result = nullptr; @@ -1016,9 +1016,12 @@ if (isStarted) { - callback->audioDeviceIOCallback (inputBuffers.getArrayOfReadPointers(), inputBuffers.getNumChannels(), - outputBuffers.getArrayOfWritePointers(), outputBuffers.getNumChannels(), - bufferSizeSamples); + callback->audioDeviceIOCallbackWithContext (inputBuffers.getArrayOfReadPointers(), + inputBuffers.getNumChannels(), + outputBuffers.getArrayOfWritePointers(), + outputBuffers.getNumChannels(), + bufferSizeSamples, + {}); } else { diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_win32_Midi.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_win32_Midi.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_win32_Midi.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_win32_Midi.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -33,7 +33,7 @@ namespace WasapiClasses { -void logFailure (HRESULT hr) +static void logFailure (HRESULT hr) { ignoreUnused (hr); jassert (hr != (HRESULT) 0x800401f0); // If you hit this, it means you're trying to call from @@ -89,7 +89,7 @@ #undef check -bool check (HRESULT hr) +static bool check (HRESULT hr) { logFailure (hr); return SUCCEEDED (hr); @@ -361,7 +361,7 @@ namespace WasapiClasses { -String getDeviceID (IMMDevice* device) +static String getDeviceID (IMMDevice* device) { String s; WCHAR* deviceId = nullptr; @@ -676,9 +676,7 @@ void querySupportedSampleRates (WAVEFORMATEXTENSIBLE format, ComSmartPtr& audioClient) { - for (auto rate : { 8000, 11025, 16000, 22050, 24000, 32000, - 44100, 48000, 88200, 96000, 176400, - 192000, 352800, 384000, 705600, 768000 }) + for (auto rate : SampleRateHelpers::getAllSampleRates()) { if (rates.contains (rate)) continue; @@ -695,7 +693,7 @@ : &nearestFormat))) { if (nearestFormat != nullptr) - rate = (int) nearestFormat->nSamplesPerSec; + rate = (double) nearestFormat->nSamplesPerSec; if (! rates.contains (rate)) rates.addUsingDefaultSort (rate); @@ -1517,8 +1515,12 @@ const ScopedTryLock sl (startStopLock); if (sl.isLocked() && isStarted) - callback->audioDeviceIOCallback (const_cast (inputBuffers), numInputBuffers, - outputBuffers, numOutputBuffers, bufferSize); + callback->audioDeviceIOCallbackWithContext (const_cast (inputBuffers), + numInputBuffers, + outputBuffers, + numOutputBuffers, + bufferSize, + {}); else outs.clear(); } diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp juce-7.0.0~ds0/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h juce-7.0.0~ds0/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h --- juce-6.1.5~ds0/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp juce-7.0.0~ds0/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp --- juce-6.1.5~ds0/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_devices/sources/juce_AudioTransportSource.h juce-7.0.0~ds0/modules/juce_audio_devices/sources/juce_AudioTransportSource.h --- juce-6.1.5~ds0/modules/juce_audio_devices/sources/juce_AudioTransportSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_devices/sources/juce_AudioTransportSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -153,12 +153,13 @@ #include "flac/libFLAC/stream_encoder_framing.c" #include "flac/libFLAC/window_flac.c" #undef VERSION -#else - #include -#endif JUCE_END_IGNORE_WARNINGS_GCC_LIKE JUCE_END_IGNORE_WARNINGS_MSVC + +#else + #include +#endif } #undef max diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -49,7 +49,8 @@ "-Wredundant-decls", "-Wmisleading-indentation", "-Wmissing-prototypes", - "-Wcast-align") + "-Wcast-align", + "-Wmaybe-uninitialized") JUCE_BEGIN_NO_SANITIZE ("undefined") #include "oggvorbis/vorbisenc.h" diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -168,8 +168,94 @@ const char* const WavAudioFormat::riffInfoWrittenBy = "IWRI"; const char* const WavAudioFormat::riffInfoYear = "YEAR"; -const char* const WavAudioFormat::ISRC = "ISRC"; -const char* const WavAudioFormat::tracktionLoopInfo = "tracktion loop info"; +const char* const WavAudioFormat::aswgContentType = "contentType"; +const char* const WavAudioFormat::aswgProject = "project"; +const char* const WavAudioFormat::aswgOriginator = "originator"; +const char* const WavAudioFormat::aswgOriginatorStudio = "originatorStudio"; +const char* const WavAudioFormat::aswgNotes = "notes"; +const char* const WavAudioFormat::aswgSession = "session"; +const char* const WavAudioFormat::aswgState = "state"; +const char* const WavAudioFormat::aswgEditor = "editor"; +const char* const WavAudioFormat::aswgMixer = "mixer"; +const char* const WavAudioFormat::aswgFxChainName = "fxChainName"; +const char* const WavAudioFormat::aswgChannelConfig = "channelConfig"; +const char* const WavAudioFormat::aswgAmbisonicFormat = "ambisonicFormat"; +const char* const WavAudioFormat::aswgAmbisonicChnOrder = "ambisonicChnOrder"; +const char* const WavAudioFormat::aswgAmbisonicNorm = "ambisonicNorm"; +const char* const WavAudioFormat::aswgMicType = "micType"; +const char* const WavAudioFormat::aswgMicConfig = "micConfig"; +const char* const WavAudioFormat::aswgMicDistance = "micDistance"; +const char* const WavAudioFormat::aswgRecordingLoc = "recordingLoc"; +const char* const WavAudioFormat::aswgIsDesigned = "isDesigned"; +const char* const WavAudioFormat::aswgRecEngineer = "recEngineer"; +const char* const WavAudioFormat::aswgRecStudio = "recStudio"; +const char* const WavAudioFormat::aswgImpulseLocation = "impulseLocation"; +const char* const WavAudioFormat::aswgCategory = "category"; +const char* const WavAudioFormat::aswgSubCategory = "subCategory"; +const char* const WavAudioFormat::aswgCatId = "catId"; +const char* const WavAudioFormat::aswgUserCategory = "userCategory"; +const char* const WavAudioFormat::aswgUserData = "userData"; +const char* const WavAudioFormat::aswgVendorCategory = "vendorCategory"; +const char* const WavAudioFormat::aswgFxName = "fxName"; +const char* const WavAudioFormat::aswgLibrary = "library"; +const char* const WavAudioFormat::aswgCreatorId = "creatorId"; +const char* const WavAudioFormat::aswgSourceId = "sourceId"; +const char* const WavAudioFormat::aswgRmsPower = "rmsPower"; +const char* const WavAudioFormat::aswgLoudness = "loudness"; +const char* const WavAudioFormat::aswgLoudnessRange = "loudnessRange"; +const char* const WavAudioFormat::aswgMaxPeak = "maxPeak"; +const char* const WavAudioFormat::aswgSpecDensity = "specDensity"; +const char* const WavAudioFormat::aswgZeroCrossRate = "zeroCrossRate"; +const char* const WavAudioFormat::aswgPapr = "papr"; +const char* const WavAudioFormat::aswgText = "text"; +const char* const WavAudioFormat::aswgEfforts = "efforts"; +const char* const WavAudioFormat::aswgEffortType = "effortType"; +const char* const WavAudioFormat::aswgProjection = "projection"; +const char* const WavAudioFormat::aswgLanguage = "language"; +const char* const WavAudioFormat::aswgTimingRestriction = "timingRestriction"; +const char* const WavAudioFormat::aswgCharacterName = "characterName"; +const char* const WavAudioFormat::aswgCharacterGender = "characterGender"; +const char* const WavAudioFormat::aswgCharacterAge = "characterAge"; +const char* const WavAudioFormat::aswgCharacterRole = "characterRole"; +const char* const WavAudioFormat::aswgActorName = "actorName"; +const char* const WavAudioFormat::aswgActorGender = "actorGender"; +const char* const WavAudioFormat::aswgDirector = "director"; +const char* const WavAudioFormat::aswgDirection = "direction"; +const char* const WavAudioFormat::aswgFxUsed = "fxUsed"; +const char* const WavAudioFormat::aswgUsageRights = "usageRights"; +const char* const WavAudioFormat::aswgIsUnion = "isUnion"; +const char* const WavAudioFormat::aswgAccent = "accent"; +const char* const WavAudioFormat::aswgEmotion = "emotion"; +const char* const WavAudioFormat::aswgComposor = "composor"; +const char* const WavAudioFormat::aswgArtist = "artist"; +const char* const WavAudioFormat::aswgSongTitle = "songTitle"; +const char* const WavAudioFormat::aswgGenre = "genre"; +const char* const WavAudioFormat::aswgSubGenre = "subGenre"; +const char* const WavAudioFormat::aswgProducer = "producer"; +const char* const WavAudioFormat::aswgMusicSup = "musicSup"; +const char* const WavAudioFormat::aswgInstrument = "instrument"; +const char* const WavAudioFormat::aswgMusicPublisher = "musicPublisher"; +const char* const WavAudioFormat::aswgRightsOwner = "rightsOwner"; +const char* const WavAudioFormat::aswgIsSource = "isSource"; +const char* const WavAudioFormat::aswgIsLoop = "isLoop"; +const char* const WavAudioFormat::aswgIntensity = "intensity"; +const char* const WavAudioFormat::aswgIsFinal = "isFinal"; +const char* const WavAudioFormat::aswgOrderRef = "orderRef"; +const char* const WavAudioFormat::aswgIsOst = "isOst"; +const char* const WavAudioFormat::aswgIsCinematic = "isCinematic"; +const char* const WavAudioFormat::aswgIsLicensed = "isLicensed"; +const char* const WavAudioFormat::aswgIsDiegetic = "isDiegetic"; +const char* const WavAudioFormat::aswgMusicVersion = "musicVersion"; +const char* const WavAudioFormat::aswgIsrcId = "isrcId"; +const char* const WavAudioFormat::aswgTempo = "tempo"; +const char* const WavAudioFormat::aswgTimeSig = "timeSig"; +const char* const WavAudioFormat::aswgInKey = "inKey"; +const char* const WavAudioFormat::aswgBillingCode = "billingCode"; +const char* const WavAudioFormat::aswgVersion = "IXML_VERSION"; + +const char* const WavAudioFormat::ISRC = "ISRC"; +const char* const WavAudioFormat::internationalStandardRecordingCode = "international standard recording code"; +const char* const WavAudioFormat::tracktionLoopInfo = "tracktion loop info"; //============================================================================== namespace WavFileHelpers @@ -862,6 +948,157 @@ } }; + //============================================================================= + namespace IXMLChunk + { + static const std::unordered_set aswgMetadataKeys + { + WavAudioFormat::aswgContentType, + WavAudioFormat::aswgProject, + WavAudioFormat::aswgOriginator, + WavAudioFormat::aswgOriginatorStudio, + WavAudioFormat::aswgNotes, + WavAudioFormat::aswgSession, + WavAudioFormat::aswgState, + WavAudioFormat::aswgEditor, + WavAudioFormat::aswgMixer, + WavAudioFormat::aswgFxChainName, + WavAudioFormat::aswgChannelConfig, + WavAudioFormat::aswgAmbisonicFormat, + WavAudioFormat::aswgAmbisonicChnOrder, + WavAudioFormat::aswgAmbisonicNorm, + WavAudioFormat::aswgMicType, + WavAudioFormat::aswgMicConfig, + WavAudioFormat::aswgMicDistance, + WavAudioFormat::aswgRecordingLoc, + WavAudioFormat::aswgIsDesigned, + WavAudioFormat::aswgRecEngineer, + WavAudioFormat::aswgRecStudio, + WavAudioFormat::aswgImpulseLocation, + WavAudioFormat::aswgCategory, + WavAudioFormat::aswgSubCategory, + WavAudioFormat::aswgCatId, + WavAudioFormat::aswgUserCategory, + WavAudioFormat::aswgUserData, + WavAudioFormat::aswgVendorCategory, + WavAudioFormat::aswgFxName, + WavAudioFormat::aswgLibrary, + WavAudioFormat::aswgCreatorId, + WavAudioFormat::aswgSourceId, + WavAudioFormat::aswgRmsPower, + WavAudioFormat::aswgLoudness, + WavAudioFormat::aswgLoudnessRange, + WavAudioFormat::aswgMaxPeak, + WavAudioFormat::aswgSpecDensity, + WavAudioFormat::aswgZeroCrossRate, + WavAudioFormat::aswgPapr, + WavAudioFormat::aswgText, + WavAudioFormat::aswgEfforts, + WavAudioFormat::aswgEffortType, + WavAudioFormat::aswgProjection, + WavAudioFormat::aswgLanguage, + WavAudioFormat::aswgTimingRestriction, + WavAudioFormat::aswgCharacterName, + WavAudioFormat::aswgCharacterGender, + WavAudioFormat::aswgCharacterAge, + WavAudioFormat::aswgCharacterRole, + WavAudioFormat::aswgActorName, + WavAudioFormat::aswgActorGender, + WavAudioFormat::aswgDirector, + WavAudioFormat::aswgDirection, + WavAudioFormat::aswgFxUsed, + WavAudioFormat::aswgUsageRights, + WavAudioFormat::aswgIsUnion, + WavAudioFormat::aswgAccent, + WavAudioFormat::aswgEmotion, + WavAudioFormat::aswgComposor, + WavAudioFormat::aswgArtist, + WavAudioFormat::aswgSongTitle, + WavAudioFormat::aswgGenre, + WavAudioFormat::aswgSubGenre, + WavAudioFormat::aswgProducer, + WavAudioFormat::aswgMusicSup, + WavAudioFormat::aswgInstrument, + WavAudioFormat::aswgMusicPublisher, + WavAudioFormat::aswgRightsOwner, + WavAudioFormat::aswgIsSource, + WavAudioFormat::aswgIsLoop, + WavAudioFormat::aswgIntensity, + WavAudioFormat::aswgIsFinal, + WavAudioFormat::aswgOrderRef, + WavAudioFormat::aswgIsOst, + WavAudioFormat::aswgIsCinematic, + WavAudioFormat::aswgIsLicensed, + WavAudioFormat::aswgIsDiegetic, + WavAudioFormat::aswgMusicVersion, + WavAudioFormat::aswgIsrcId, + WavAudioFormat::aswgTempo, + WavAudioFormat::aswgTimeSig, + WavAudioFormat::aswgInKey, + WavAudioFormat::aswgBillingCode + }; + + static void addToMetadata (StringMap& destValues, const String& source) + { + if (auto xml = parseXML (source)) + { + if (xml->hasTagName ("BWFXML")) + { + if (const auto* entry = xml->getChildByName (WavAudioFormat::aswgVersion)) + destValues[WavAudioFormat::aswgVersion] = entry->getAllSubText(); + + if (const auto* aswgElement = xml->getChildByName ("ASWG")) + { + for (const auto* entry : aswgElement->getChildIterator()) + { + const auto& tag = entry->getTagName(); + + if (aswgMetadataKeys.find (tag) != aswgMetadataKeys.end()) + destValues[tag] = entry->getAllSubText(); + } + } + } + } + } + + static MemoryBlock createFrom (const StringMap& values) + { + auto createTextElement = [] (const StringRef& key, const StringRef& value) + { + auto* elem = new XmlElement (key); + elem->addTextElement (value); + return elem; + }; + + std::unique_ptr aswgElement; + + for (const auto& pair : values) + { + if (aswgMetadataKeys.find (pair.first) != aswgMetadataKeys.end()) + { + if (aswgElement == nullptr) + aswgElement = std::make_unique ("ASWG"); + + aswgElement->addChildElement (createTextElement (pair.first, pair.second)); + } + } + + MemoryOutputStream outputStream; + + if (aswgElement != nullptr) + { + XmlElement xml ("BWFXML"); + auto aswgVersion = getValueWithDefault (values, WavAudioFormat::aswgVersion, "3.01"); + xml.addChildElement (createTextElement (WavAudioFormat::aswgVersion, aswgVersion)); + xml.addChildElement (aswgElement.release()); + xml.writeTo (outputStream); + outputStream.writeRepeatedByte (0, outputStream.getDataSize()); + } + + return outputStream.getMemoryBlock(); + } + } + //============================================================================== namespace AXMLChunk { @@ -880,7 +1117,12 @@ auto ISRCCode = xml4->getAllSubText().fromFirstOccurrenceOf ("ISRC:", false, true); if (ISRCCode.isNotEmpty()) - destValues[WavAudioFormat::ISRC] = ISRCCode; + { + // We set ISRC here for backwards compatibility. + // If the INFO 'source' field is set in the info chunk, then the + // value for this key will be overwritten later. + destValues[WavAudioFormat::riffInfoSource] = destValues[WavAudioFormat::internationalStandardRecordingCode] = ISRCCode; + } } } } @@ -890,11 +1132,24 @@ static MemoryBlock createFrom (const StringMap& values) { - auto ISRC = getValueWithDefault (values, WavAudioFormat::ISRC); + // Use the new ISRC key if it is present, but fall back to the + // INFO 'source' value for backwards compatibility. + auto ISRC = getValueWithDefault (values, + WavAudioFormat::internationalStandardRecordingCode, + getValueWithDefault (values, WavAudioFormat::riffInfoSource)); + MemoryOutputStream xml; if (ISRC.isNotEmpty()) { + // If you are trying to set the ISRC, make sure that you are using + // WavAudioFormat::internationalStandardRecordingCode as the metadata key, + // and that the value is 12 characters long. If you are trying to set the + // 'source' field in the INFO chunk, set the + // WavAudioFormat::internationalStandardRecordingCode metadata field to the + // empty string to silence this assertion. + jassert (ISRC.length() == 12); + xml << "" "" @@ -1124,6 +1379,12 @@ input->readIntoMemoryBlock (axml, (ssize_t) length); AXMLChunk::addToMetadata (dict, axml.toString()); } + else if (chunkType == chunkName ("iXML")) + { + MemoryBlock ixml; + input->readIntoMemoryBlock (ixml, (ssize_t) length); + IXMLChunk::addToMetadata (dict, ixml.toString()); + } else if (chunkType == chunkName ("LIST")) { auto subChunkType = input->readInt(); @@ -1338,6 +1599,7 @@ const auto map = toMap (metadataValues); bwavChunk = BWAVChunk::createFrom (map); + ixmlChunk = IXMLChunk::createFrom (map); axmlChunk = AXMLChunk::createFrom (map); smplChunk = SMPLChunk::createFrom (map); instChunk = InstChunk::createFrom (map); @@ -1408,7 +1670,7 @@ } private: - MemoryBlock tempBlock, bwavChunk, axmlChunk, smplChunk, instChunk, cueChunk, listChunk, listInfoChunk, acidChunk, trckChunk; + MemoryBlock tempBlock, bwavChunk, ixmlChunk, axmlChunk, smplChunk, instChunk, cueChunk, listChunk, listInfoChunk, acidChunk, trckChunk; uint64 lengthInSamples = 0, bytesWritten = 0; int64 headerPosition = 0; bool writeFailed = false; @@ -1438,6 +1700,7 @@ int64 riffChunkSize = (int64) (4 /* 'RIFF' */ + 8 + 40 /* WAVEFORMATEX */ + 8 + audioDataSize + (audioDataSize & 1) + chunkSize (bwavChunk) + + chunkSize (ixmlChunk) + chunkSize (axmlChunk) + chunkSize (smplChunk) + chunkSize (instChunk) @@ -1520,6 +1783,7 @@ } writeChunk (bwavChunk, chunkName ("bext")); + writeChunk (ixmlChunk, chunkName ("iXML")); writeChunk (axmlChunk, chunkName ("axml")); writeChunk (smplChunk, chunkName ("smpl")); writeChunk (instChunk, chunkName ("inst"), 7); @@ -1869,6 +2133,8 @@ for (int i = numElementsInArray (WavFileHelpers::ListInfoChunk::types); --i >= 0;) metadataValues[WavFileHelpers::ListInfoChunk::types[i]] = WavFileHelpers::ListInfoChunk::types[i]; + metadataValues[WavAudioFormat::internationalStandardRecordingCode] = WavAudioFormat::internationalStandardRecordingCode; + if (metadataValues.size() > 0) metadataValues["MetaDataSource"] = "WAV"; @@ -1882,30 +2148,168 @@ metadataArray.addUnorderedMap (metadataValues); { - beginTest ("Creating a basic wave writer"); + beginTest ("Metadata can be written and read"); - std::unique_ptr writer (format.createWriterFor (new MemoryOutputStream (memoryBlock, false), - 44100.0, numTestAudioBufferChannels, - 32, metadataArray, 0)); - expect (writer != nullptr); + const auto newMetadata = getMetadataAfterReading (format, writeToBlock (format, metadataArray)); + expect (newMetadata == metadataArray, "Somehow, the metadata is different!"); + } - AudioBuffer buffer (numTestAudioBufferChannels, numTestAudioBufferSamples); - buffer.clear(); + { + beginTest ("Files containing a riff info source and an empty ISRC associate the source with the riffInfoSource key"); + StringPairArray meta; + meta.addMap ({ { WavAudioFormat::riffInfoSource, "customsource" }, + { WavAudioFormat::internationalStandardRecordingCode, "" } }); + const auto mb = writeToBlock (format, meta); + checkPatternsPresent (mb, { "INFOISRC" }); + checkPatternsNotPresent (mb, { "ISRC:", "writeFromAudioSampleBuffer (buffer, 0, numTestAudioBufferSamples)); + { + beginTest ("Files containing a riff info source and no ISRC associate the source with both keys " + "for backwards compatibility"); + StringPairArray meta; + meta.addMap ({ { WavAudioFormat::riffInfoSource, "customsource" } }); + const auto mb = writeToBlock (format, meta); + checkPatternsPresent (mb, { "INFOISRC", "ISRC:customsource", " reader (format.createReaderFor (new MemoryInputStream (memoryBlock, false), false)); - expect (reader != nullptr); - expect (reader->metadataValues == metadataArray, "Somehow, the metadata is different!"); + { + beginTest ("Files containing an ISRC and a riff info source associate the values with the appropriate keys"); + StringPairArray meta; + meta.addMap ({ { WavAudioFormat::riffInfoSource, "source" } }); + meta.addMap ({ { WavAudioFormat::internationalStandardRecordingCode, "UUVVVXXYYYYY" } }); + const auto mb = writeToBlock (format, meta); + checkPatternsPresent (mb, { "INFOISRC", "ISRC:UUVVVXXYYYYY", ""); + + { + auto writer = rawToUniquePtr (WavAudioFormat().createWriterFor (new MemoryOutputStream (block, false), 48000, 1, 32, meta, 0)); + expect (writer != nullptr); + } + + expect ([&] + { + auto input = std::make_unique (block, false); + + while (! input->isExhausted()) + { + char chunkType[4] {}; + auto pos = input->getPosition(); + + input->read (chunkType, 4); + + if (memcmp (chunkType, "iXML", 4) == 0) + { + auto length = (uint32) input->readInt(); + + MemoryBlock xmlBlock; + input->readIntoMemoryBlock (xmlBlock, (ssize_t) length); + + return parseXML (xmlBlock.toString()) != nullptr; + } + + input->setPosition (pos + 1); + } + + return false; + }()); + + { + auto reader = rawToUniquePtr (WavAudioFormat().createReaderFor (new MemoryInputStream (block, false), true)); + expect (reader != nullptr); + + for (const auto& key : meta.getAllKeys()) + { + const auto oldValue = meta.getValue (key, "!"); + const auto newValue = reader->metadataValues.getValue (key, ""); + expectEquals (oldValue, newValue); + } + + expect (reader->metadataValues.getValue (WavAudioFormat::aswgVersion, "") == "3.01"); + } } } private: + MemoryBlock writeToBlock (WavAudioFormat& format, StringPairArray meta) + { + MemoryBlock mb; + + { + // The destructor of the writer will modify the block, so make sure that we've + // destroyed the writer before returning the block! + auto writer = rawToUniquePtr (format.createWriterFor (new MemoryOutputStream (mb, false), + 44100.0, + numTestAudioBufferChannels, + 16, + meta, + 0)); + expect (writer != nullptr); + AudioBuffer buffer (numTestAudioBufferChannels, numTestAudioBufferSamples); + expect (writer->writeFromAudioSampleBuffer (buffer, 0, numTestAudioBufferSamples)); + } + + return mb; + } + + StringPairArray getMetadataAfterReading (WavAudioFormat& format, const MemoryBlock& mb) + { + auto reader = rawToUniquePtr (format.createReaderFor (new MemoryInputStream (mb, false), true)); + expect (reader != nullptr); + return reader->metadataValues; + } + + template + void checkPatterns (const MemoryBlock& mb, const std::vector& patterns, Fn&& fn) + { + for (const auto& pattern : patterns) + { + const auto begin = static_cast (mb.getData()); + const auto end = begin + mb.getSize(); + expect (fn (std::search (begin, end, pattern.begin(), pattern.end()), end)); + } + } + + void checkPatternsPresent (const MemoryBlock& mb, const std::vector& patterns) + { + checkPatterns (mb, patterns, std::not_equal_to<>{}); + } + + void checkPatternsNotPresent (const MemoryBlock& mb, const std::vector& patterns) + { + checkPatterns (mb, patterns, std::equal_to<>{}); + } + enum { numTestAudioBufferChannels = 2, diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -176,9 +176,101 @@ static const char* const riffInfoYear; /**< Metadata property name used in INFO chunks. */ //============================================================================== + // ASWG chunk properties: + + static const char* const aswgContentType; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgProject; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgOriginator; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgOriginatorStudio; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgNotes; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgSession; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgState; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgEditor; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMixer; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgFxChainName; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgChannelConfig; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgAmbisonicFormat; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgAmbisonicChnOrder; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgAmbisonicNorm; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMicType; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMicConfig; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMicDistance; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgRecordingLoc; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsDesigned; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgRecEngineer; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgRecStudio; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgImpulseLocation; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCategory; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgSubCategory; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCatId; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgUserCategory; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgUserData; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgVendorCategory; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgFxName; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgLibrary; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCreatorId; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgSourceId; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgRmsPower; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgLoudness; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgLoudnessRange; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMaxPeak; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgSpecDensity; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgZeroCrossRate; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgPapr; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgText; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgEfforts; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgEffortType; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgProjection; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgLanguage; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgTimingRestriction; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCharacterName; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCharacterGender; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCharacterAge; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCharacterRole; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgActorName; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgActorGender; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgDirector; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgDirection; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgFxUsed; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgUsageRights; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsUnion; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgAccent; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgEmotion; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgComposor; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgArtist; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgSongTitle; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgGenre; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgSubGenre; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgProducer; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMusicSup; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgInstrument; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMusicPublisher; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgRightsOwner; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsSource; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsLoop; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIntensity; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsFinal; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgOrderRef; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsOst; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsCinematic; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsLicensed; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsDiegetic; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMusicVersion; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsrcId; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgTempo; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgTimeSig; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgInKey; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgBillingCode; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgVersion; /**< Metadata property name used in ASWG/iXML chunks. */ + + //============================================================================== /** Metadata property name used when reading an ISRC code from an AXML chunk. */ + [[deprecated ("This string is identical to riffInfoSource, making it impossible to differentiate between the two")]] static const char* const ISRC; + /** Metadata property name used when reading and writing ISRC codes to/from AXML chunks. */ + static const char* const internationalStandardRecordingCode; + /** Metadata property name used when reading a WAV file with a Tracktion chunk. */ static const char* const tracktionLoopInfo; diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h --- juce-6.1.5~ds0/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,310 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +namespace juce +{ + +ARAAudioSourceReader::ARAAudioSourceReader (ARAAudioSource* audioSource) + : AudioFormatReader (nullptr, "ARAAudioSourceReader"), + audioSourceBeingRead (audioSource) +{ + jassert (audioSourceBeingRead != nullptr); + + bitsPerSample = 32; + usesFloatingPointData = true; + sampleRate = audioSourceBeingRead->getSampleRate(); + numChannels = (unsigned int) audioSourceBeingRead->getChannelCount(); + lengthInSamples = audioSourceBeingRead->getSampleCount(); + tmpPtrs.resize (numChannels); + + audioSourceBeingRead->addListener (this); + + if (audioSourceBeingRead->isSampleAccessEnabled()) + hostReader.reset (new ARA::PlugIn::HostAudioReader (audioSourceBeingRead)); +} + +ARAAudioSourceReader::~ARAAudioSourceReader() +{ + invalidate(); +} + +void ARAAudioSourceReader::invalidate() +{ + ScopedWriteLock scopedLock (lock); + + if (! isValid()) + return; + + hostReader.reset(); + + audioSourceBeingRead->removeListener (this); + audioSourceBeingRead = nullptr; +} + +void ARAAudioSourceReader::willUpdateAudioSourceProperties (ARAAudioSource* audioSource, + ARAAudioSource::PropertiesPtr newProperties) +{ + if (audioSource->getSampleCount() != newProperties->sampleCount + || audioSource->getSampleRate() != newProperties->sampleRate + || audioSource->getChannelCount() != newProperties->channelCount) + { + invalidate(); + } +} + +void ARAAudioSourceReader::doUpdateAudioSourceContent (ARAAudioSource* audioSource, + ARAContentUpdateScopes scopeFlags) +{ + jassertquiet (audioSourceBeingRead == audioSource); + + // Don't invalidate if the audio signal is unchanged + if (scopeFlags.affectSamples()) + invalidate(); +} + +void ARAAudioSourceReader::willEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) +{ + jassertquiet (audioSourceBeingRead == audioSource); + + // Invalidate our reader if sample access is disabled + if (! enable) + { + ScopedWriteLock scopedLock (lock); + hostReader.reset(); + } +} + +void ARAAudioSourceReader::didEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) +{ + jassertquiet (audioSourceBeingRead == audioSource); + + // Recreate our reader if sample access is enabled + if (enable && isValid()) + { + ScopedWriteLock scopedLock (lock); + hostReader.reset (new ARA::PlugIn::HostAudioReader (audioSourceBeingRead)); + } +} + +void ARAAudioSourceReader::willDestroyAudioSource (ARAAudioSource* audioSource) +{ + jassertquiet (audioSourceBeingRead == audioSource); + + invalidate(); +} + +bool ARAAudioSourceReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) +{ + const auto destSize = (bitsPerSample / 8) * (size_t) numSamples; + const auto bufferOffset = (int) (bitsPerSample / 8) * startOffsetInDestBuffer; + + if (isValid() && hostReader != nullptr) + { + const ScopedTryReadLock readLock (lock); + + if (readLock.isLocked()) + { + for (size_t i = 0; i < tmpPtrs.size(); ++i) + { + if ((i < (size_t) numDestChannels) && (destSamples[i] != nullptr)) + { + tmpPtrs[i] = ((uint8_t*) destSamples[i]) + bufferOffset; + } + else + { + // We need to provide destination pointers for all channels in the ARA read call, even if + // readSamples is not reading all of them. Hence we use this dummy buffer to pad the read + // destination area. + static thread_local std::vector dummyBuffer; + + if (destSize > dummyBuffer.size()) + dummyBuffer.resize (destSize); + + tmpPtrs[i] = dummyBuffer.data(); + } + } + + return hostReader->readAudioSamples (startSampleInFile, numSamples, tmpPtrs.data()); + } + } + + for (int i = 0; i < numDestChannels; ++i) + if (destSamples[i] != nullptr) + zeromem (((uint8_t*) destSamples[i]) + bufferOffset, destSize); + + return false; +} + +//============================================================================== +ARAPlaybackRegionReader::ARAPlaybackRegionReader (ARAPlaybackRegion* playbackRegion) + : ARAPlaybackRegionReader (playbackRegion->getAudioModification()->getAudioSource()->getSampleRate(), + playbackRegion->getAudioModification()->getAudioSource()->getChannelCount(), + { playbackRegion }) +{} + +ARAPlaybackRegionReader::ARAPlaybackRegionReader (double rate, int numChans, + const std::vector& playbackRegions) + : AudioFormatReader (nullptr, "ARAPlaybackRegionReader") +{ + // We're only providing the minimal set of meaningful values, since the ARA renderer should only + // look at the time position and the playing state, and read any related tempo or bar signature + // information from the ARA model directly (MusicalContext). + positionInfo.setIsPlaying (true); + + sampleRate = rate; + numChannels = (unsigned int) numChans; + bitsPerSample = 32; + usesFloatingPointData = true; + + auto* documentController = (! playbackRegions.empty()) + ? playbackRegions.front()->getDocumentController() + : nullptr; + + playbackRenderer.reset (documentController ? static_cast (documentController->doCreatePlaybackRenderer()) + : nullptr); + + if (playbackRenderer != nullptr) + { + double regionsStartTime = std::numeric_limits::max(); + double regionsEndTime = std::numeric_limits::lowest(); + + for (const auto& playbackRegion : playbackRegions) + { + jassert (playbackRegion->getDocumentController() == documentController); + auto playbackRegionTimeRange = playbackRegion->getTimeRange (ARAPlaybackRegion::IncludeHeadAndTail::yes); + regionsStartTime = jmin (regionsStartTime, playbackRegionTimeRange.getStart()); + regionsEndTime = jmax (regionsEndTime, playbackRegionTimeRange.getEnd()); + + playbackRenderer->addPlaybackRegion (ARA::PlugIn::toRef (playbackRegion)); + playbackRegion->addListener (this); + } + + startInSamples = (int64) (regionsStartTime * sampleRate + 0.5); + lengthInSamples = (int64) ((regionsEndTime - regionsStartTime) * sampleRate + 0.5); + + playbackRenderer->prepareToPlay (rate, + maximumBlockSize, + numChans, + AudioProcessor::ProcessingPrecision::singlePrecision, + ARARenderer::AlwaysNonRealtime::yes); + } + else + { + startInSamples = 0; + lengthInSamples = 0; + } +} + +ARAPlaybackRegionReader::~ARAPlaybackRegionReader() +{ + invalidate(); +} + +void ARAPlaybackRegionReader::invalidate() +{ + ScopedWriteLock scopedWrite (lock); + + if (! isValid()) + return; + + for (auto& playbackRegion : playbackRenderer->getPlaybackRegions()) + playbackRegion->removeListener (this); + + playbackRenderer->releaseResources(); + playbackRenderer.reset(); +} + +bool ARAPlaybackRegionReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) +{ + bool success = false; + bool needClearSamples = true; + + const ScopedTryReadLock readLock (lock); + + if (readLock.isLocked()) + { + if (isValid()) + { + success = true; + needClearSamples = false; + positionInfo.setTimeInSamples (startSampleInFile + startInSamples); + + while (numSamples > 0) + { + const int numSliceSamples = jmin (numSamples, maximumBlockSize); + AudioBuffer buffer ((float **) destSamples, numDestChannels, startOffsetInDestBuffer, numSliceSamples); + positionInfo.setTimeInSeconds (static_cast (*positionInfo.getTimeInSamples()) / sampleRate); + success &= playbackRenderer->processBlock (buffer, AudioProcessor::Realtime::no, positionInfo); + numSamples -= numSliceSamples; + startOffsetInDestBuffer += numSliceSamples; + positionInfo.setTimeInSamples (*positionInfo.getTimeInSamples() + numSliceSamples); + } + } + } + + if (needClearSamples) + for (int chan_i = 0; chan_i < numDestChannels; ++chan_i) + FloatVectorOperations::clear ((float *) destSamples[chan_i], numSamples); + + return success; +} + +void ARAPlaybackRegionReader::willUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion, ARAPlaybackRegion::PropertiesPtr newProperties) +{ + jassert (ARA::contains (playbackRenderer->getPlaybackRegions(), playbackRegion)); + + if ((playbackRegion->getStartInAudioModificationTime() != newProperties->startInModificationTime) + || (playbackRegion->getDurationInAudioModificationTime() != newProperties->durationInModificationTime) + || (playbackRegion->getStartInPlaybackTime() != newProperties->startInPlaybackTime) + || (playbackRegion->getDurationInPlaybackTime() != newProperties->durationInPlaybackTime) + || (playbackRegion->isTimestretchEnabled() != ((newProperties->transformationFlags & ARA::kARAPlaybackTransformationTimestretch) != 0)) + || (playbackRegion->isTimeStretchReflectingTempo() != ((newProperties->transformationFlags & ARA::kARAPlaybackTransformationTimestretchReflectingTempo) != 0)) + || (playbackRegion->hasContentBasedFadeAtHead() != ((newProperties->transformationFlags & ARA::kARAPlaybackTransformationContentBasedFadeAtHead) != 0)) + || (playbackRegion->hasContentBasedFadeAtTail() != ((newProperties->transformationFlags & ARA::kARAPlaybackTransformationContentBasedFadeAtTail) != 0))) + { + invalidate(); + } +} + +void ARAPlaybackRegionReader::didUpdatePlaybackRegionContent (ARAPlaybackRegion* playbackRegion, + ARAContentUpdateScopes scopeFlags) +{ + jassertquiet (ARA::contains (playbackRenderer->getPlaybackRegions(), playbackRegion)); + + // Invalidate if the audio signal is changed + if (scopeFlags.affectSamples()) + invalidate(); +} + +void ARAPlaybackRegionReader::willDestroyPlaybackRegion (ARAPlaybackRegion* playbackRegion) +{ + jassertquiet (ARA::contains (playbackRenderer->getPlaybackRegions(), playbackRegion)); + + invalidate(); +} + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_ARAAudioReaders.h juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_ARAAudioReaders.h --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_ARAAudioReaders.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_ARAAudioReaders.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,194 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#pragma once + +namespace juce +{ + +class AudioProcessor; + +/* All these readers follow a common pattern of "invalidation": + + Whenever the samples they are reading are altered, the readers become invalid and will stop + accessing the model graph. These alterations are model edits such as property changes, content + changes (if affecting sample scope), or the deletion of some model object involved in the read + process. Since these edits are performed on the document controller thread, reader validity can + immediately be checked after the edit has been concluded, and any reader that has become invalid + can be recreated. + + Note that encountering a failure in any individual read call does not invalidate the reader, so + that the entity using the reader can decide whether to retry or to back out. This includes trying + to read an audio source for which the host has currently disabled access: the failure will be + immediately visible, but the reader will remain valid. This ensures that for example a realtime + renderer can just keep reading and will be seeing proper samples again once sample access is + re-enabled. + + If desired, the code calling readSamples() can also implement proper signaling of any read error + to the document controller thread to trigger rebuilding the reader as needed. This will typically + be done when implementing audio source analysis: if there is an error upon reading the samples + that cannot be resolved within a reasonable timeout, then the analysis would be aborted. The + document controller code that monitors the analysis tasks can evaluate this and re-launch a new + analysis when appropriate (e.g. when access is re-enabled). + + When reading playback regions (directly or through a region sequence reader), the reader will + represent the regions as a single source object that covers the union of all affected regions. + The first sample produced by the reader thus will be the first sample of the earliest region. + This means that the location of this region has to be taken into account by the calling code if + it wants to relate the samples to the model or any other reader output. +*/ + +//============================================================================== +/** + Subclass of AudioFormatReader that reads samples from a single ARA audio source. + + Plug-Ins typically use this from their rendering code, wrapped in a BufferingAudioReader + to bridge between realtime rendering and non-realtime audio reading. + + The reader becomes invalidated if + - the audio source content is updated in a way that affects its samples, + - the audio source sample access is disabled, or + - the audio source being read is destroyed. + + @tags{ARA} +*/ +class JUCE_API ARAAudioSourceReader : public AudioFormatReader, + private ARAAudioSource::Listener +{ +public: + /** Use an ARAAudioSource to construct an audio source reader for the given \p audioSource. */ + explicit ARAAudioSourceReader (ARAAudioSource* audioSource); + + ~ARAAudioSourceReader() override; + + bool readSamples (int** destSamples, + int numDestChannels, + int startOffsetInDestBuffer, + int64 startSampleInFile, + int numSamples) override; + + /** Returns true as long as the reader's underlying ARAAudioSource remains accessible and its + sample content is not changed. + */ + bool isValid() const { return audioSourceBeingRead != nullptr; } + + /** Invalidate the reader - the reader will call this internally if needed, but can also be + invalidated from the outside (from message thread only!). + */ + void invalidate(); + + void willUpdateAudioSourceProperties (ARAAudioSource* audioSource, + ARAAudioSource::PropertiesPtr newProperties) override; + void doUpdateAudioSourceContent (ARAAudioSource* audioSource, + ARAContentUpdateScopes scopeFlags) override; + void willEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) override; + void didEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) override; + void willDestroyAudioSource (ARAAudioSource* audioSource) override; + +private: + ARAAudioSource* audioSourceBeingRead; + std::unique_ptr hostReader; + ReadWriteLock lock; + std::vector tmpPtrs; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAAudioSourceReader) +}; + +//============================================================================== +/** + Subclass of AudioFormatReader that reads samples from a group of playback regions. + + Plug-Ins typically use this to draw the output of a playback region in their UI. + + In order to read from playback regions, the reader requires an audio processor that acts as ARA + playback renderer. Configuring the audio processor for real-time operation results in the reader + being real-time capable too, unlike most other AudioFormatReaders. The reader instance will take + care of adding all regions being read to the renderer and invoke its processBlock function in + order to read the region samples. + + The reader becomes invalid if + - any region properties are updated in a way that would affect its samples, + - any region content is updated in a way that would affect its samples, or + - any of its regions are destroyed. + + @tags{ARA} +*/ +class JUCE_API ARAPlaybackRegionReader : public AudioFormatReader, + private ARAPlaybackRegion::Listener +{ +public: + /** Create an ARAPlaybackRegionReader instance to read the given \p playbackRegion, using the + sample rate and channel count of the underlying ARAAudioSource. + + @param playbackRegion The playback region that should be read - must not be nullptr! + */ + explicit ARAPlaybackRegionReader (ARAPlaybackRegion* playbackRegion); + + /** Create an ARAPlaybackRegionReader instance to read the given \p playbackRegions + + @param sampleRate The sample rate that should be used for reading. + @param numChannels The channel count that should be used for reading. + @param playbackRegions The vector of playback regions that should be read - must not be empty! + All regions must be part of the same ARADocument. + */ + ARAPlaybackRegionReader (double sampleRate, int numChannels, + const std::vector& playbackRegions); + + ~ARAPlaybackRegionReader() override; + + /** Returns true as long as any of the reader's underlying playback region's haven't changed. */ + bool isValid() const { return (playbackRenderer != nullptr); } + + /** Invalidate the reader - this should be called if the sample content of any of the reader's + ARAPlaybackRegions changes. + */ + void invalidate(); + + bool readSamples (int** destSamples, + int numDestChannels, + int startOffsetInDestBuffer, + int64 startSampleInFile, + int numSamples) override; + + void willUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion, + ARAPlaybackRegion::PropertiesPtr newProperties) override; + void didUpdatePlaybackRegionContent (ARAPlaybackRegion* playbackRegion, + ARAContentUpdateScopes scopeFlags) override; + void willDestroyPlaybackRegion (ARAPlaybackRegion* playbackRegion) override; + + /** The starting point of the reader in playback samples */ + int64 startInSamples = 0; + +private: + std::unique_ptr playbackRenderer; + AudioPlayHead::PositionInfo positionInfo; + ReadWriteLock lock; + + static constexpr int maximumBlockSize = 4 * 1024; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAPlaybackRegionReader) +}; + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormat.cpp juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormat.h juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormat.h --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatManager.h juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatManager.h --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatManager.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatManager.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -122,7 +122,7 @@ return true; } -static void readChannels (AudioFormatReader& reader, int** chans, AudioBuffer* buffer, +static bool readChannels (AudioFormatReader& reader, int** chans, AudioBuffer* buffer, int startSample, int numSamples, int64 readerStartSample, int numTargetChannels, bool convertToFloat) { @@ -130,13 +130,16 @@ chans[j] = reinterpret_cast (buffer->getWritePointer (j, startSample)); chans[numTargetChannels] = nullptr; - reader.read (chans, numTargetChannels, readerStartSample, numSamples, true); + + const bool success = reader.read (chans, numTargetChannels, readerStartSample, numSamples, true); if (convertToFloat) convertFixedToFloat (chans, numTargetChannels, numSamples); + + return success; } -void AudioFormatReader::read (AudioBuffer* buffer, +bool AudioFormatReader::read (AudioBuffer* buffer, int startSample, int numSamples, int64 readerStartSample, @@ -146,58 +149,61 @@ jassert (buffer != nullptr); jassert (startSample >= 0 && startSample + numSamples <= buffer->getNumSamples()); - if (numSamples > 0) - { - auto numTargetChannels = buffer->getNumChannels(); - - if (numTargetChannels <= 2) - { - int* dests[2] = { reinterpret_cast (buffer->getWritePointer (0, startSample)), - reinterpret_cast (numTargetChannels > 1 ? buffer->getWritePointer (1, startSample) : nullptr) }; - int* chans[3] = {}; + if (numSamples <= 0) + return true; - if (useReaderLeftChan == useReaderRightChan) - { - chans[0] = dests[0]; + auto numTargetChannels = buffer->getNumChannels(); - if (numChannels > 1) - chans[1] = dests[1]; - } - else if (useReaderLeftChan || (numChannels == 1)) - { - chans[0] = dests[0]; - } - else if (useReaderRightChan) - { - chans[1] = dests[0]; - } - - read (chans, 2, readerStartSample, numSamples, true); + if (numTargetChannels <= 2) + { + int* dests[2] = { reinterpret_cast (buffer->getWritePointer (0, startSample)), + reinterpret_cast (numTargetChannels > 1 ? buffer->getWritePointer (1, startSample) : nullptr) }; + int* chans[3] = {}; - // if the target's stereo and the source is mono, dupe the first channel.. - if (numTargetChannels > 1 - && (chans[0] == nullptr || chans[1] == nullptr) - && (dests[0] != nullptr && dests[1] != nullptr)) - { - memcpy (dests[1], dests[0], (size_t) numSamples * sizeof (float)); - } + if (useReaderLeftChan == useReaderRightChan) + { + chans[0] = dests[0]; - if (! usesFloatingPointData) - convertFixedToFloat (dests, 2, numSamples); + if (numChannels > 1) + chans[1] = dests[1]; } - else if (numTargetChannels <= 64) + else if (useReaderLeftChan || (numChannels == 1)) { - int* chans[65]; - readChannels (*this, chans, buffer, startSample, numSamples, - readerStartSample, numTargetChannels, ! usesFloatingPointData); + chans[0] = dests[0]; } - else + else if (useReaderRightChan) + { + chans[1] = dests[0]; + } + + if (! read (chans, 2, readerStartSample, numSamples, true)) + return false; + + // if the target's stereo and the source is mono, dupe the first channel.. + if (numTargetChannels > 1 + && (chans[0] == nullptr || chans[1] == nullptr) + && (dests[0] != nullptr && dests[1] != nullptr)) { - HeapBlock chans (numTargetChannels + 1); - readChannels (*this, chans, buffer, startSample, numSamples, - readerStartSample, numTargetChannels, ! usesFloatingPointData); + memcpy (dests[1], dests[0], (size_t) numSamples * sizeof (float)); } + + if (! usesFloatingPointData) + convertFixedToFloat (dests, 2, numSamples); + + return true; } + + if (numTargetChannels <= 64) + { + int* chans[65]; + return readChannels (*this, chans, buffer, startSample, numSamples, + readerStartSample, numTargetChannels, ! usesFloatingPointData); + } + + HeapBlock chans (numTargetChannels + 1); + + return readChannels (*this, chans, buffer, startSample, numSamples, + readerStartSample, numTargetChannels, ! usesFloatingPointData); } void AudioFormatReader::readMaxLevels (int64 startSampleInFile, int64 numSamples, diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatReader.h juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatReader.h --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatReader.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatReader.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -139,8 +139,12 @@ the buffer's floating-point format, and will try to intelligently cope with mismatches between the number of channels in the reader and the buffer. + + @returns true if the operation succeeded, false if there was an error. Note + that reading sections of data beyond the extent of the stream isn't an + error - the reader should just return zeros for these regions */ - void read (AudioBuffer* buffer, + bool read (AudioBuffer* buffer, int startSampleInDestBuffer, int numSamples, int64 readerStartSample, diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatWriter.h juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatWriter.h --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioFormatWriter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioFormatWriter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -63,6 +63,8 @@ const ScopedLock sl (lock); nextReadPosition = startSampleInFile; + bool allSamplesRead = true; + while (numSamples > 0) { if (auto block = getBlockContaining (startSampleInFile)) @@ -86,6 +88,8 @@ startOffsetInDestBuffer += numToDo; startSampleInFile += numToDo; numSamples -= numToDo; + + allSamplesRead = allSamplesRead && block->allSamplesRead; } else { @@ -95,6 +99,7 @@ if (auto* dest = (float*) destSamples[j]) FloatVectorOperations::clear (dest + startOffsetInDestBuffer, numSamples); + allSamplesRead = false; break; } else @@ -105,14 +110,14 @@ } } - return true; + return allSamplesRead; } BufferingAudioReader::BufferedBlock::BufferedBlock (AudioFormatReader& reader, int64 pos, int numSamples) : range (pos, pos + numSamples), - buffer ((int) reader.numChannels, numSamples) + buffer ((int) reader.numChannels, numSamples), + allSamplesRead (reader.read (&buffer, 0, numSamples, pos, true, true)) { - reader.read (&buffer, 0, numSamples, pos, true, true); } BufferingAudioReader::BufferedBlock* BufferingAudioReader::getBlockContaining (int64 pos) const noexcept diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -73,6 +73,7 @@ Range range; AudioBuffer buffer; + bool allSamplesRead = false; }; int useTimeSlice() override; diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h --- juce-6.1.5~ds0/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/juce_audio_formats.cpp juce-7.0.0~ds0/modules/juce_audio_formats/juce_audio_formats.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/juce_audio_formats.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/juce_audio_formats.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -68,6 +68,11 @@ #include "codecs/juce_WavAudioFormat.cpp" #include "codecs/juce_LAMEEncoderAudioFormat.cpp" +#if JucePlugin_Enable_ARA + #include "juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + #include "format/juce_ARAAudioReaders.cpp" +#endif + #if JUCE_WINDOWS && JUCE_USE_WINDOWS_MEDIA_FORMAT #include "codecs/juce_WindowsMediaAudioFormat.cpp" #endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/juce_audio_formats.h juce-7.0.0~ds0/modules/juce_audio_formats/juce_audio_formats.h --- juce-6.1.5~ds0/modules/juce_audio_formats/juce_audio_formats.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/juce_audio_formats.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_audio_formats vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE audio file format codecs description: Classes for reading and writing various audio file formats. website: http://www.juce.com/juce @@ -128,3 +128,9 @@ #include "codecs/juce_WavAudioFormat.h" #include "codecs/juce_WindowsMediaAudioFormat.h" #include "sampler/juce_Sampler.h" + +#if JucePlugin_Enable_ARA + #include + + #include "format/juce_ARAAudioReaders.h" +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/juce_audio_formats.mm juce-7.0.0~ds0/modules/juce_audio_formats/juce_audio_formats.mm --- juce-6.1.5~ds0/modules/juce_audio_formats/juce_audio_formats.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/juce_audio_formats.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/sampler/juce_Sampler.cpp juce-7.0.0~ds0/modules/juce_audio_formats/sampler/juce_Sampler.cpp --- juce-6.1.5~ds0/modules/juce_audio_formats/sampler/juce_Sampler.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/sampler/juce_Sampler.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_formats/sampler/juce_Sampler.h juce-7.0.0~ds0/modules/juce_audio_formats/sampler/juce_Sampler.h --- juce-6.1.5~ds0/modules/juce_audio_formats/sampler/juce_Sampler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_formats/sampler/juce_Sampler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -1035,52 +1035,72 @@ AudioProcessor& getPluginInstance() const noexcept { return *pluginInstance; } - bool getCurrentPosition (juce::AudioPlayHead::CurrentPositionInfo& info) override + Optional getPosition() const override { + PositionInfo info; + const AAX_ITransport& transport = *Transport(); - info.bpm = 0.0; - check (transport.GetCurrentTempo (&info.bpm)); + info.setBpm ([&] + { + double bpm = 0.0; + + return transport.GetCurrentTempo (&bpm) == AAX_SUCCESS ? makeOptional (bpm) : nullopt; + }()); - int32_t num = 4, den = 4; - transport.GetCurrentMeter (&num, &den); - info.timeSigNumerator = (int) num; - info.timeSigDenominator = (int) den; - info.timeInSamples = 0; + info.setTimeSignature ([&] + { + int32_t num = 4, den = 4; - if (transport.IsTransportPlaying (&info.isPlaying) != AAX_SUCCESS) - info.isPlaying = false; + return transport.GetCurrentMeter (&num, &den) == AAX_SUCCESS + ? makeOptional (TimeSignature { (int) num, (int) den }) + : nullopt; + }()); - if (info.isPlaying - || transport.GetTimelineSelectionStartPosition (&info.timeInSamples) != AAX_SUCCESS) - check (transport.GetCurrentNativeSampleLocation (&info.timeInSamples)); + info.setIsPlaying ([&] + { + bool isPlaying = false; - info.timeInSeconds = (float) info.timeInSamples / sampleRate; + return transport.IsTransportPlaying (&isPlaying) == AAX_SUCCESS && isPlaying; + }()); - int64_t ticks = 0; + info.setTimeInSamples ([&] + { + int64_t timeInSamples = 0; - if (info.isPlaying) - check (transport.GetCustomTickPosition (&ticks, info.timeInSamples)); - else - check (transport.GetCurrentTickPosition (&ticks)); + return ((! info.getIsPlaying() && transport.GetTimelineSelectionStartPosition (&timeInSamples) == AAX_SUCCESS) + || transport.GetCurrentNativeSampleLocation (&timeInSamples) == AAX_SUCCESS) + ? makeOptional (timeInSamples) + : nullopt; + }()); - info.ppqPosition = (double) ticks / 960000.0; + info.setTimeInSeconds ((float) info.getTimeInSamples().orFallback (0) / sampleRate); - info.isLooping = false; + info.setPpqPosition ([&] + { + int64_t ticks = 0; + + return ((info.getIsPlaying() && transport.GetCustomTickPosition (&ticks, info.getTimeInSamples().orFallback (0))) == AAX_SUCCESS) + || transport.GetCurrentTickPosition (&ticks) == AAX_SUCCESS + ? makeOptional (ticks / 960000.0) + : nullopt; + }()); + + bool isLooping = false; int64_t loopStartTick = 0, loopEndTick = 0; - check (transport.GetCurrentLoopPosition (&info.isLooping, &loopStartTick, &loopEndTick)); - info.ppqLoopStart = (double) loopStartTick / 960000.0; - info.ppqLoopEnd = (double) loopEndTick / 960000.0; - std::tie (info.frameRate, info.editOriginTime) = [&transport] + if (transport.GetCurrentLoopPosition (&isLooping, &loopStartTick, &loopEndTick) == AAX_SUCCESS) { - AAX_EFrameRate frameRate; - int32_t offset; + info.setIsLooping (isLooping); + info.setLoopPoints (LoopPoints { (double) loopStartTick / 960000.0, (double) loopEndTick / 960000.0 }); + } - if (transport.GetTimeCodeInfo (&frameRate, &offset) != AAX_SUCCESS) - return std::make_tuple (FrameRate(), 0.0); + AAX_EFrameRate frameRate; + int32_t offset; - const auto rate = [&] + if (transport.GetTimeCodeInfo (&frameRate, &offset) == AAX_SUCCESS) + { + info.setFrameRate ([&]() -> Optional { switch ((JUCE_AAX_EFrameRate) frameRate) { @@ -1114,18 +1134,14 @@ case JUCE_AAX_eFrameRate_Undeclared: break; } - return FrameRate(); - }(); - - const auto effectiveRate = rate.getEffectiveRate(); - return std::make_tuple (rate, effectiveRate != 0.0 ? offset / effectiveRate : 0.0); - }(); + return {}; + }()); + } - // No way to get these: (?) - info.isRecording = false; - info.ppqPositionOfLastBarStart = 0; + const auto effectiveRate = info.getFrameRate().hasValue() ? info.getFrameRate()->getEffectiveRate() : 0.0; + info.setEditOriginTime (effectiveRate != 0.0 ? makeOptional (offset / effectiveRate) : nullopt); - return true; + return info; } void audioProcessorParameterChanged (AudioProcessor* /*processor*/, int parameterIndex, float newValue) override @@ -1191,8 +1207,7 @@ if (data != nullptr && size == sizeof (AAX_EProcessingState)) { const auto state = *static_cast (data); - const auto nonRealtime = state == AAX_eProcessingState_Start - || state == AAX_eProcessingState_StartPass + const auto nonRealtime = state == AAX_eProcessingState_StartPass || state == AAX_eProcessingState_BeginPassGroup; pluginInstance->setNonRealtime (nonRealtime); } @@ -1533,7 +1548,7 @@ } } - if (bypass) + if (bypass && pluginInstance->getBypassParameter() == nullptr) pluginInstance->processBlockBypassed (buffer, midiBuffer); else pluginInstance->processBlock (buffer, midiBuffer); @@ -1601,7 +1616,7 @@ if (bypassParameter == nullptr) { - ownedBypassParameter.reset (new AudioParameterBool (cDefaultMasterBypassID, "Master Bypass", false, {}, {}, {})); + ownedBypassParameter.reset (new AudioParameterBool (cDefaultMasterBypassID, "Master Bypass", false)); bypassParameter = ownedBypassParameter.get(); } diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,68 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include +#include "../utility/juce_CheckSettingMacros.h" + +#if JucePlugin_Enable_ARA + +#include "../utility/juce_IncludeSystemHeaders.h" +#include "../utility/juce_IncludeModuleHeaders.h" + +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunused-parameter", "-Wgnu-zero-variadic-macro-arguments", "-Wmissing-prototypes") +JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4100) + +#include +#include +#include + +JUCE_END_IGNORE_WARNINGS_MSVC +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +namespace juce +{ + +#if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS +JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept +{ + #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) + DBG (diagnosis); + #endif + + logAssertion (file, line); + + #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) + if (juce_isRunningUnderDebugger()) + JUCE_BREAK_IN_DEBUGGER; + JUCE_ANALYZER_NORETURN + #endif +} +#endif + +ARA_SETUP_DEBUG_MESSAGE_PREFIX(JucePlugin_Name); + +} // namespace juce + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,55 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#pragma once + +#if JucePlugin_Enable_ARA +// Configure ARA debug support prior to including ARA SDK headers +namespace juce +{ + +#if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS + +#define ARA_ENABLE_INTERNAL_ASSERTS 1 + +extern JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept; + +#if !defined(ARA_HANDLE_ASSERT) +#define ARA_HANDLE_ASSERT(file, line, diagnosis) juce::handleARAAssertion (file, line, diagnosis) +#endif + +#if JUCE_LOG_ASSERTIONS +#define ARA_ENABLE_DEBUG_OUTPUT 1 +#endif + +#else + +#define ARA_ENABLE_INTERNAL_ASSERTS 0 + +#endif // (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS + +} // namespace juce + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/CMakeLists.txt juce-7.0.0~ds0/modules/juce_audio_plugin_client/CMakeLists.txt --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/CMakeLists.txt 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,29 @@ +# ============================================================================== +# +# This file is part of the JUCE library. +# Copyright (c) 2022 - Raw Material Software Limited +# +# 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 7 End-User License +# Agreement and JUCE Privacy Policy. +# +# End User License Agreement: www.juce.com/juce-7-licence +# Privacy Policy: www.juce.com/juce-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. +# +# ============================================================================== + +add_executable(juce_lv2_helper LV2/juce_LV2TurtleDumpProgram.cpp) +add_executable(juce::juce_lv2_helper ALIAS juce_lv2_helper) +target_compile_features(juce_lv2_helper PRIVATE cxx_std_14) +set_target_properties(juce_lv2_helper PROPERTIES BUILD_WITH_INSTALL_RPATH ON) +target_link_libraries(juce_lv2_helper PRIVATE ${CMAKE_DL_LIBS}) +install(TARGETS juce_lv2_helper EXPORT LV2_HELPER DESTINATION "bin/JUCE-${JUCE_VERSION}") diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.mm juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.mm --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_ARA.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_ARA.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_ARA.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_ARA.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,26 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "ARA/juce_ARA_Wrapper.cpp" diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_2.mm juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_2.mm --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_2.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_2.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -62,9 +62,6 @@ #include "AU/CoreAudioUtilityClasses/AUBase.cpp" #include "AU/CoreAudioUtilityClasses/AUBuffer.cpp" -#include "AU/CoreAudioUtilityClasses/AUCarbonViewBase.cpp" -#include "AU/CoreAudioUtilityClasses/AUCarbonViewControl.cpp" -#include "AU/CoreAudioUtilityClasses/AUCarbonViewDispatch.cpp" #include "AU/CoreAudioUtilityClasses/AUDispatch.cpp" #include "AU/CoreAudioUtilityClasses/AUInputElement.cpp" #include "AU/CoreAudioUtilityClasses/AUMIDIBase.cpp" @@ -76,7 +73,6 @@ #include "AU/CoreAudioUtilityClasses/CAMutex.cpp" #include "AU/CoreAudioUtilityClasses/CAStreamBasicDescription.cpp" #include "AU/CoreAudioUtilityClasses/CAVectorUnit.cpp" -#include "AU/CoreAudioUtilityClasses/CarbonEventHandler.cpp" #include "AU/CoreAudioUtilityClasses/ComponentBase.cpp" #include "AU/CoreAudioUtilityClasses/MusicDeviceBase.cpp" diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -48,23 +48,3 @@ #define ENTRY_POINT JucePlugin_AUExportPrefixQuoted "Entry" #include "AUResources.r" - -//============================================================================== -// component resources for Audio Unit Carbon View - -#ifndef BUILD_AU_CARBON_UI - #define BUILD_AU_CARBON_UI 1 -#endif - -#if BUILD_AU_CARBON_UI - #define RES_ID 2000 - #define COMP_TYPE kAudioUnitCarbonViewComponentType - #define COMP_SUBTYPE JucePlugin_AUSubType - #define COMP_MANUF JucePlugin_AUManufacturerCode - #define VERSION JucePlugin_VersionCode - #define NAME JucePlugin_Manufacturer ": " JucePlugin_Name " View" - #define DESCRIPTION NAME - #define ENTRY_POINT JucePlugin_AUExportPrefixQuoted "ViewEntry" - - #include "AUResources.r" -#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,9 +35,9 @@ ID: juce_audio_plugin_client vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE audio plugin wrapper classes - description: Classes for building VST, VST3, AudioUnit, AAX and RTAS plugins. + description: Classes for building VST, VST3, AU, AUv3 and AAX plugins. website: http://www.juce.com/juce license: GPL/Commercial minimumCppStandard: 14 @@ -128,3 +128,7 @@ #endif #include "utility/juce_CreatePluginFilter.h" + +#if JucePlugin_Enable_ARA + #include "ARA/juce_ARA_Wrapper.h" +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,26 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "LV2/juce_LV2_Client.cpp" diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.mm juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.mm --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.mm 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.mm 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,26 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "juce_audio_plugin_client_LV2.cpp" diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_1.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_1.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_1.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_1.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include "RTAS/juce_RTAS_Wrapper.cpp" diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_2.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_2.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_2.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_2.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include "RTAS/juce_RTAS_DigiCode1.cpp" diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_3.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_3.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_3.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_3.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include "RTAS/juce_RTAS_DigiCode2.cpp" diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_4.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_4.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_4.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_4.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include "RTAS/juce_RTAS_DigiCode3.cpp" diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - -/* - This dummy file is added to the resources section of the project to - force Xcode to create some resources for the dpm. If there aren't any - resources, PT will refuse to load the plugin.. -*/ - diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include "RTAS/juce_RTAS_WinUtilities.cpp" diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.mm juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.mm --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.mm 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include "RTAS/juce_RTAS_MacUtilities.mm" diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_Unity.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_Unity.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_Unity.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_Unity.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_utils.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_utils.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_utils.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_utils.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST2.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST2.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST2.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST2.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST_utils.mm juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST_utils.mm --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST_utils.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST_utils.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1778 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#if JucePlugin_Build_LV2 + +#ifndef _SCL_SECURE_NO_WARNINGS + #define _SCL_SECURE_NO_WARNINGS +#endif + +#ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS +#endif + +#define JUCE_CORE_INCLUDE_NATIVE_HEADERS 1 +#define JUCE_CORE_INCLUDE_OBJC_HELPERS 1 +#define JUCE_GUI_BASICS_INCLUDE_XHEADERS 1 + +#include +#include +#include + +#include +#include + +#include "JuceLV2Defines.h" +#include + +#include + +#define JUCE_TURTLE_RECALL_URI "https://lv2-extensions.juce.com/turtle_recall" + +#ifndef JucePlugin_LV2URI + #error "You need to define the JucePlugin_LV2URI value! If you're using the Projucer/CMake, the definition will be written into JuceLV2Defines.h automatically." +#endif + +namespace juce +{ +namespace lv2_client +{ + +constexpr auto uriSeparator = ":"; +const auto JucePluginLV2UriUi = String (JucePlugin_LV2URI) + uriSeparator + "UI"; +const auto JucePluginLV2UriState = String (JucePlugin_LV2URI) + uriSeparator + "StateString"; +const auto JucePluginLV2UriProgram = String (JucePlugin_LV2URI) + uriSeparator + "Program"; + +static const LV2_Feature* findMatchingFeature (const LV2_Feature* const* features, const char* uri) +{ + for (auto feature = features; *feature != nullptr; ++feature) + if (std::strcmp ((*feature)->URI, uri) == 0) + return *feature; + + return nullptr; +} + +static bool hasFeature (const LV2_Feature* const* features, const char* uri) +{ + return findMatchingFeature (features, uri) != nullptr; +} + +template +Data findMatchingFeatureData (const LV2_Feature* const* features, const char* uri) +{ + if (const auto* feature = findMatchingFeature (features, uri)) + return static_cast (feature->data); + + return {}; +} + +static const LV2_Options_Option* findMatchingOption (const LV2_Options_Option* options, LV2_URID urid) +{ + for (auto option = options; option->value != nullptr; ++option) + if (option->key == urid) + return option; + + return nullptr; +} + +class ParameterStorage : private AudioProcessorListener +{ +public: + ParameterStorage (AudioProcessor& proc, LV2_URID_Map map) + : processor (proc), + mapFeature (map), + legacyParameters (proc, false) + { + processor.addListener (this); + } + + ~ParameterStorage() override + { + processor.removeListener (this); + } + + /* This is the string that will be used to uniquely identify the parameter. + + This string will be written into the plugin's manifest as an IRI, so it must be + syntactically valid. + + We escape this string rather than writing the user-defined parameter ID directly to avoid + writing a malformed manifest in the case that user IDs contain spaces or other reserved + characters. This should allow users to keep the same param IDs for all plugin formats. + */ + static String getIri (const AudioProcessorParameter& param) + { + return URL::addEscapeChars (LegacyAudioParameter::getParamID (¶m, false), true); + } + + void setValueFromHost (LV2_URID urid, float value) noexcept + { + const auto it = uridToIndexMap.find (urid); + + if (it == uridToIndexMap.end()) + { + // No such parameter. + jassertfalse; + return; + } + + if (auto* param = legacyParameters.getParamForIndex ((int) it->second)) + { + const auto scaledValue = [&] + { + if (auto* rangedParam = dynamic_cast (param)) + return rangedParam->convertTo0to1 (value); + + return value; + }(); + + if (scaledValue != param->getValue()) + { + ScopedValueSetter scope (ignoreCallbacks, true); + param->setValueNotifyingHost (scaledValue); + } + } + } + + struct Options + { + bool parameterValue, gestureBegin, gestureEnd; + }; + + static constexpr auto newClientValue = 1 << 0, + gestureBegan = 1 << 1, + gestureEnded = 1 << 2; + + template + void forEachChangedParameter (Callback&& callback) + { + stateCache.ifSet ([this, &callback] (size_t parameterIndex, float, uint32_t bits) + { + const Options options { (bits & newClientValue) != 0, + (bits & gestureBegan) != 0, + (bits & gestureEnded) != 0 }; + + callback (*legacyParameters.getParamForIndex ((int) parameterIndex), + indexToUridMap[parameterIndex], + options); + }); + } + +private: + void audioProcessorParameterChanged (AudioProcessor*, int parameterIndex, float value) override + { + if (! ignoreCallbacks) + stateCache.setValueAndBits ((size_t) parameterIndex, value, newClientValue); + } + + void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int parameterIndex) override + { + if (! ignoreCallbacks) + stateCache.setBits ((size_t) parameterIndex, gestureBegan); + } + + void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int parameterIndex) override + { + if (! ignoreCallbacks) + stateCache.setBits ((size_t) parameterIndex, gestureEnded); + } + + void audioProcessorChanged (AudioProcessor*, const ChangeDetails&) override {} + + AudioProcessor& processor; + const LV2_URID_Map mapFeature; + const LegacyAudioParametersWrapper legacyParameters; + const std::vector indexToUridMap = [&] + { + std::vector result; + + for (auto* param : legacyParameters) + { + jassert ((size_t) param->getParameterIndex() == result.size()); + + const auto uri = JucePlugin_LV2URI + String (uriSeparator) + getIri (*param); + const auto urid = mapFeature.map (mapFeature.handle, uri.toRawUTF8()); + result.push_back (urid); + } + + return result; + }(); + const std::map uridToIndexMap = [&] + { + std::map result; + size_t index = 0; + + for (const auto& urid : indexToUridMap) + result.emplace (urid, index++); + + return result; + }(); + FlaggedFloatCache<3> stateCache { (size_t) legacyParameters.getNumParameters() }; + bool ignoreCallbacks = false; + + JUCE_LEAK_DETECTOR (ParameterStorage) +}; + +enum class PortKind { seqInput, seqOutput, latencyOutput, freeWheelingInput, enabledInput }; + +struct PortIndices +{ + PortIndices (int numInputsIn, int numOutputsIn) + : numInputs (numInputsIn), numOutputs (numOutputsIn) {} + + int getPortIndexForAudioInput (int audioIndex) const noexcept + { + return audioIndex; + } + + int getPortIndexForAudioOutput (int audioIndex) const noexcept + { + return audioIndex + numInputs; + } + + int getPortIndexFor (PortKind p) const noexcept { return getMaxAudioPortIndex() + (int) p; } + + // Audio ports are numbered from 0 to numInputs + numOutputs + int getMaxAudioPortIndex() const noexcept { return numInputs + numOutputs; } + + int numInputs, numOutputs; +}; + +//============================================================================== +class PlayHead : public AudioPlayHead +{ +public: + PlayHead (LV2_URID_Map mapFeatureIn, double sampleRateIn) + : parser (mapFeatureIn), sampleRate (sampleRateIn) + { + } + + void invalidate() { info = nullopt; } + + void readNewInfo (const LV2_Atom_Event* event) + { + if (event->body.type != mLV2_ATOM__Object && event->body.type != mLV2_ATOM__Blank) + return; + + const auto* object = reinterpret_cast (&event->body); + + if (object->body.otype != mLV2_TIME__Position) + return; + + const LV2_Atom* atomFrame = nullptr; + const LV2_Atom* atomSpeed = nullptr; + const LV2_Atom* atomBar = nullptr; + const LV2_Atom* atomBeat = nullptr; + const LV2_Atom* atomBeatUnit = nullptr; + const LV2_Atom* atomBeatsPerBar = nullptr; + const LV2_Atom* atomBeatsPerMinute = nullptr; + + LV2_Atom_Object_Query query[] { { mLV2_TIME__frame, &atomFrame }, + { mLV2_TIME__speed, &atomSpeed }, + { mLV2_TIME__bar, &atomBar }, + { mLV2_TIME__beat, &atomBeat }, + { mLV2_TIME__beatUnit, &atomBeatUnit }, + { mLV2_TIME__beatsPerBar, &atomBeatsPerBar }, + { mLV2_TIME__beatsPerMinute, &atomBeatsPerMinute }, + LV2_ATOM_OBJECT_QUERY_END }; + + lv2_atom_object_query (object, query); + + info.emplace(); + + // Carla always seems to give us an integral 'beat' even though I'd expect + // it to be a floating-point value + + const auto numerator = parser.parseNumericAtom (atomBeatsPerBar); + const auto denominator = parser.parseNumericAtom (atomBeatUnit); + + if (numerator.hasValue() && denominator.hasValue()) + info->setTimeSignature (TimeSignature { (int) *numerator, (int) *denominator }); + + info->setBpm (parser.parseNumericAtom (atomBeatsPerMinute)); + info->setPpqPosition (parser.parseNumericAtom (atomBeat)); + info->setIsPlaying (parser.parseNumericAtom (atomSpeed).orFallback (0.0f) != 0.0f); + info->setBarCount (parser.parseNumericAtom (atomBar)); + + if (const auto parsed = parser.parseNumericAtom (atomFrame)) + { + info->setTimeInSamples (*parsed); + info->setTimeInSeconds ((double) *parsed / sampleRate); + } + } + + Optional getPosition() const override + { + return info; + } + +private: + lv2_shared::NumericAtomParser parser; + Optional info; + double sampleRate; + + #define X(str) const LV2_URID m##str = parser.map (str); + X (LV2_ATOM__Blank) + X (LV2_ATOM__Object) + X (LV2_TIME__Position) + X (LV2_TIME__beat) + X (LV2_TIME__beatUnit) + X (LV2_TIME__beatsPerBar) + X (LV2_TIME__beatsPerMinute) + X (LV2_TIME__frame) + X (LV2_TIME__speed) + X (LV2_TIME__bar) + #undef X + + JUCE_LEAK_DETECTOR (PlayHead) +}; + +//============================================================================== +class Ports +{ +public: + Ports (LV2_URID_Map map, int numInputsIn, int numOutputsIn) + : forge (map), + indices (numInputsIn, numOutputsIn), + mLV2_ATOM__Sequence (map.map (map.handle, LV2_ATOM__Sequence)) + { + audioBuffers.resize (static_cast (numInputsIn + numOutputsIn), nullptr); + } + + void connect (int port, void* data) + { + // The following is not UB _if_ data really points to an object with the expected type. + + if (port == indices.getPortIndexFor (PortKind::seqInput)) + { + inputData = static_cast (data); + } + else if (port == indices.getPortIndexFor (PortKind::seqOutput)) + { + outputData = static_cast (data); + } + else if (port == indices.getPortIndexFor (PortKind::latencyOutput)) + { + latency = static_cast (data); + } + else if (port == indices.getPortIndexFor (PortKind::freeWheelingInput)) + { + freeWheeling = static_cast (data); + } + else if (port == indices.getPortIndexFor (PortKind::enabledInput)) + { + enabled = static_cast (data); + } + else if (isPositiveAndBelow (port, indices.getMaxAudioPortIndex())) + { + audioBuffers[(size_t) port] = static_cast (data); + } + else + { + // This port was not declared! + jassertfalse; + } + } + + template + void forEachInputEvent (Callback&& callback) + { + if (inputData != nullptr && inputData->atom.type == mLV2_ATOM__Sequence) + for (const auto* event : lv2_shared::SequenceIterator { lv2_shared::SequenceWithSize { inputData } }) + callback (event); + } + + void prepareToWrite() + { + // Note: Carla seems to have a bug (verified with the eg-fifths plugin) where + // the output buffer size is incorrect on alternate calls. + forge.setBuffer (reinterpret_cast (outputData), outputData->atom.size); + } + + void writeLatency (int value) + { + if (latency != nullptr) + *latency = (float) value; + } + + const float* getBufferForAudioInput (int index) const noexcept + { + return audioBuffers[(size_t) indices.getPortIndexForAudioInput (index)]; + } + + float* getBufferForAudioOutput (int index) const noexcept + { + return audioBuffers[(size_t) indices.getPortIndexForAudioOutput (index)]; + } + + bool isFreeWheeling() const noexcept + { + if (freeWheeling != nullptr) + return *freeWheeling > 0.5f; + + return false; + } + + bool isEnabled() const noexcept + { + if (enabled != nullptr) + return *enabled > 0.5f; + + return true; + } + + lv2_shared::AtomForge forge; + PortIndices indices; + +private: + static constexpr auto numParamPorts = 3; + const LV2_Atom_Sequence* inputData = nullptr; + LV2_Atom_Sequence* outputData = nullptr; + float* latency = nullptr; + float* freeWheeling = nullptr; + float* enabled = nullptr; + std::vector audioBuffers; + const LV2_URID mLV2_ATOM__Sequence; + + JUCE_LEAK_DETECTOR (Ports) +}; + +class LV2PluginInstance : private AudioProcessorListener +{ +public: + LV2PluginInstance (double sampleRate, + int64_t maxBlockSize, + const char*, + LV2_URID_Map mapFeatureIn) + : mapFeature (mapFeatureIn), + playHead (mapFeature, sampleRate) + { + processor->addListener (this); + processor->setPlayHead (&playHead); + prepare (sampleRate, (int) maxBlockSize); + } + + void connect (uint32_t port, void* data) + { + ports.connect ((int) port, data); + } + + void activate() {} + + template + static void iterateAudioBuffer (AudioBuffer& ab, UnaryFunction fn) + { + float** sampleData = ab.getArrayOfWritePointers(); + + for (int c = ab.getNumChannels(); --c >= 0;) + for (int s = ab.getNumSamples(); --s >= 0;) + fn (sampleData[c][s]); + } + + static int countNaNs (AudioBuffer& ab) noexcept + { + int count = 0; + iterateAudioBuffer (ab, [&count] (float s) + { + if (std::isnan (s)) + ++count; + }); + + return count; + } + + void run (uint32_t numSteps) + { + midi.clear(); + playHead.invalidate(); + + ports.forEachInputEvent ([&] (const LV2_Atom_Event* event) + { + struct Callback + { + explicit Callback (LV2PluginInstance& s) : self (s) {} + + void setParameter (LV2_URID property, float value) const noexcept + { + self.parameters.setValueFromHost (property, value); + } + + // The host probably shouldn't send us 'touched' messages. + void gesture (LV2_URID, bool) const noexcept {} + + LV2PluginInstance& self; + }; + + patchSetHelper.processPatchSet (event, Callback { *this }); + + playHead.readNewInfo (event); + + if (event->body.type == mLV2_MIDI__MidiEvent) + midi.addEvent (event + 1, static_cast (event->body.size), static_cast (event->time.frames)); + }); + + processor->setNonRealtime (ports.isFreeWheeling()); + + for (auto i = 0, end = processor->getTotalNumInputChannels(); i < end; ++i) + audio.copyFrom (i, 0, ports.getBufferForAudioInput (i), (int) numSteps); + + jassert (countNaNs (audio) == 0); + + { + const ScopedLock lock { processor->getCallbackLock() }; + + if (processor->isSuspended()) + { + for (auto i = 0, end = processor->getTotalNumOutputChannels(); i < end; ++i) + { + const auto ptr = ports.getBufferForAudioOutput (i); + std::fill (ptr, ptr + numSteps, 0.0f); + } + } + else + { + const auto isEnabled = ports.isEnabled(); + + if (auto* param = processor->getBypassParameter()) + { + param->setValueNotifyingHost (isEnabled ? 0.0f : 1.0f); + processor->processBlock (audio, midi); + } + else if (isEnabled) + { + processor->processBlock (audio, midi); + } + else + { + processor->processBlockBypassed (audio, midi); + } + } + } + + for (auto i = 0, end = processor->getTotalNumOutputChannels(); i < end; ++i) + { + const auto src = audio.getReadPointer (i); + const auto dst = ports.getBufferForAudioOutput (i); + + if (dst != nullptr) + std::copy (src, src + numSteps, dst); + } + + ports.prepareToWrite(); + auto* forge = ports.forge.get(); + lv2_shared::SequenceFrame sequence { forge, (uint32_t) 0 }; + + parameters.forEachChangedParameter ([&] (const AudioProcessorParameter& param, + LV2_URID paramUrid, + const ParameterStorage::Options& options) + { + const auto sendTouched = [&] (bool state) + { + // TODO Implement begin/end change gesture support once it's supported by LV2 + ignoreUnused (state); + }; + + if (options.gestureBegin) + sendTouched (true); + + if (options.parameterValue) + { + lv2_atom_forge_frame_time (forge, 0); + + lv2_shared::ObjectFrame object { forge, (uint32_t) 0, patchSetHelper.mLV2_PATCH__Set }; + + lv2_atom_forge_key (forge, patchSetHelper.mLV2_PATCH__property); + lv2_atom_forge_urid (forge, paramUrid); + + lv2_atom_forge_key (forge, patchSetHelper.mLV2_PATCH__value); + lv2_atom_forge_float (forge, [&] + { + if (auto* rangedParam = dynamic_cast (¶m)) + return rangedParam->convertFrom0to1 (rangedParam->getValue()); + + return param.getValue(); + }()); + } + + if (options.gestureEnd) + sendTouched (false); + }); + + if (shouldSendStateChange.exchange (false)) + { + lv2_atom_forge_frame_time (forge, 0); + lv2_shared::ObjectFrame { forge, (uint32_t) 0, mLV2_STATE__StateChanged }; + } + + for (const auto meta : midi) + { + const auto bytes = static_cast (meta.numBytes); + lv2_atom_forge_frame_time (forge, meta.samplePosition); + lv2_atom_forge_atom (forge, bytes, mLV2_MIDI__MidiEvent); + lv2_atom_forge_write (forge, meta.data, bytes); + } + + ports.writeLatency (processor->getLatencySamples()); + } + + void deactivate() {} + + LV2_State_Status store (LV2_State_Store_Function storeFn, + LV2_State_Handle handle, + uint32_t, + const LV2_Feature* const*) + { + MemoryBlock block; + processor->getStateInformation (block); + const auto text = block.toBase64Encoding(); + storeFn (handle, + mJucePluginLV2UriState, + text.toRawUTF8(), + text.getNumBytesAsUTF8() + 1, + mLV2_ATOM__String, + LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE); + + return LV2_STATE_SUCCESS; + } + + LV2_State_Status retrieve (LV2_State_Retrieve_Function retrieveFn, + LV2_State_Handle handle, + uint32_t, + const LV2_Feature* const*) + { + size_t size = 0; + uint32_t type = 0; + uint32_t dataFlags = 0; + + // Try retrieving a port index (if this is a 'program' preset). + const auto* programData = retrieveFn (handle, mJucePluginLV2UriProgram, &size, &type, &dataFlags); + + if (programData != nullptr && type == mLV2_ATOM__Int && size == sizeof (int32_t)) + { + const auto programIndex = readUnaligned (programData); + processor->setCurrentProgram (programIndex); + return LV2_STATE_SUCCESS; + } + + // This doesn't seem to be a 'program' preset, try setting the full state from a string instead. + const auto* data = retrieveFn (handle, mJucePluginLV2UriState, &size, &type, &dataFlags); + + if (data == nullptr) + return LV2_STATE_ERR_NO_PROPERTY; + + if (type != mLV2_ATOM__String) + return LV2_STATE_ERR_BAD_TYPE; + + String text (static_cast (data), (size_t) size); + MemoryBlock block; + block.fromBase64Encoding (text); + processor->setStateInformation (block.getData(), (int) block.getSize()); + + return LV2_STATE_SUCCESS; + } + + std::unique_ptr createEditor() + { + return std::unique_ptr (processor->createEditorIfNeeded()); + } + + void editorBeingDeleted (AudioProcessorEditor* editor) + { + processor->editorBeingDeleted (editor); + } + + static std::unique_ptr createProcessorInstance() + { + std::unique_ptr result { createPluginFilterOfType (AudioProcessor::wrapperType_LV2) }; + + #if defined (JucePlugin_PreferredChannelConfigurations) + constexpr short channelConfigurations[][2] { JucePlugin_PreferredChannelConfigurations }; + + static_assert (numElementsInArray (channelConfigurations) > 0, + "JucePlugin_PreferredChannelConfigurations must contain at least one entry"); + static_assert (channelConfigurations[0][0] > 0 || channelConfigurations[0][1] > 0, + "JucePlugin_PreferredChannelConfigurations must have at least one input or output channel"); + result->setPlayConfigDetails (channelConfigurations[0][0], channelConfigurations[0][1], 44100.0, 1024); + + const auto desiredChannels = std::make_tuple (channelConfigurations[0][0], channelConfigurations[0][1]); + const auto actualChannels = std::make_tuple (result->getTotalNumInputChannels(), result->getTotalNumOutputChannels()); + + if (desiredChannels != actualChannels) + Logger::outputDebugString ("Failed to apply requested channel configuration!"); + #else + result->enableAllBuses(); + #endif + + return result; + } + +private: + void audioProcessorParameterChanged (AudioProcessor*, int, float) override {} + + void audioProcessorChanged (AudioProcessor*, const ChangeDetails& details) override + { + // Only check for non-parameter state here because: + // - Latency is automatically written every block. + // - There's no way for an LV2 plugin to report an internal program change. + // - Parameter info is hard-coded in the plugin's turtle description. + if (details.nonParameterStateChanged) + shouldSendStateChange = true; + } + + void prepare (double sampleRate, int maxBlockSize) + { + jassert (processor != nullptr); + processor->setRateAndBufferSizeDetails (sampleRate, maxBlockSize); + processor->prepareToPlay (sampleRate, maxBlockSize); + + const auto numChannels = jmax (processor->getTotalNumInputChannels(), + processor->getTotalNumOutputChannels()); + + midi.ensureSize (8192); + audio.setSize (numChannels, maxBlockSize); + audio.clear(); + } + + LV2_URID map (StringRef uri) const { return mapFeature.map (mapFeature.handle, uri); } + + ScopedJuceInitialiser_GUI scopedJuceInitialiser; + + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer messageThread; + #endif + + std::unique_ptr processor = createProcessorInstance(); + const LV2_URID_Map mapFeature; + ParameterStorage parameters { *processor, mapFeature }; + Ports ports { mapFeature, + processor->getTotalNumInputChannels(), + processor->getTotalNumOutputChannels() }; + lv2_shared::PatchSetHelper patchSetHelper { mapFeature, JucePlugin_LV2URI }; + PlayHead playHead; + MidiBuffer midi; + AudioBuffer audio; + std::atomic shouldSendStateChange { false }; + + #define X(str) const LV2_URID m##str = map (str); + X (JucePluginLV2UriProgram) + X (JucePluginLV2UriState) + X (LV2_ATOM__Int) + X (LV2_ATOM__String) + X (LV2_BUF_SIZE__maxBlockLength) + X (LV2_BUF_SIZE__sequenceSize) + X (LV2_MIDI__MidiEvent) + X (LV2_PATCH__Set) + X (LV2_STATE__StateChanged) + #undef X + + JUCE_LEAK_DETECTOR (LV2PluginInstance) +}; + +//============================================================================== +struct RecallFeature +{ + int (*doRecall) (const char*) = [] (const char* libraryPath) -> int + { + const ScopedJuceInitialiser_GUI scope; + const auto processor = LV2PluginInstance::createProcessorInstance(); + const File absolutePath { CharPointer_UTF8 { libraryPath } }; + + processor->enableAllBuses(); + + for (auto* fn : { writeManifestTtl, writeDspTtl, writeUiTtl }) + { + const auto result = fn (*processor, absolutePath); + + if (result.wasOk()) + continue; + + std::cerr << result.getErrorMessage() << '\n'; + return 1; + } + + return 0; + }; + +private: + static String getPresetUri (int index) + { + return JucePlugin_LV2URI + String (uriSeparator) + "preset" + String (index + 1); + } + + static std::ofstream openStream (const File& libraryPath, StringRef name) + { + return std::ofstream { libraryPath.getSiblingFile (name + ".ttl").getFullPathName().toRawUTF8() }; + } + + static Result writeManifestTtl (AudioProcessor& proc, const File& libraryPath) + { + auto os = openStream (libraryPath, "manifest"); + + os << "@prefix lv2: .\n" + "@prefix rdfs: .\n" + "@prefix pset: .\n" + "@prefix state: .\n" + "@prefix ui: .\n" + "@prefix xsd: .\n" + "\n" + "<" JucePlugin_LV2URI ">\n" + "\ta lv2:Plugin ;\n" + "\tlv2:binary <" << URL::addEscapeChars (libraryPath.getFileName(), false) << "> ;\n" + "\trdfs:seeAlso .\n"; + + if (proc.hasEditor()) + { + #if JUCE_MAC + #define JUCE_LV2_UI_KIND "CocoaUI" + #elif JUCE_WINDOWS + #define JUCE_LV2_UI_KIND "WindowsUI" + #elif JUCE_LINUX + #define JUCE_LV2_UI_KIND "X11UI" + #else + #error "LV2 UI is unsupported on this platform" + #endif + + os << "\n" + "<" << JucePluginLV2UriUi << ">\n" + "\ta ui:" JUCE_LV2_UI_KIND " ;\n" + "\tlv2:binary <" << URL::addEscapeChars (libraryPath.getFileName(), false) << "> ;\n" + "\trdfs:seeAlso .\n" + "\n"; + } + + for (auto i = 0, end = proc.getNumPrograms(); i < end; ++i) + { + os << "<" << getPresetUri (i) << ">\n" + "\ta pset:Preset ;\n" + "\tlv2:appliesTo <" JucePlugin_LV2URI "> ;\n" + "\trdfs:label \"" << proc.getProgramName (i) << "\" ;\n" + "\tstate:state [ <" << JucePluginLV2UriProgram << "> \"" << i << "\"^^xsd:int ; ] .\n" + "\n"; + } + + return Result::ok(); + } + + static std::vector findAllSubgroupsDepthFirst (const AudioProcessorParameterGroup& group, + std::vector foundSoFar = {}) + { + foundSoFar.push_back (&group); + + for (auto* node : group) + { + if (auto* subgroup = node->getGroup()) + foundSoFar = findAllSubgroupsDepthFirst (*subgroup, std::move (foundSoFar)); + } + + return foundSoFar; + } + + using GroupSymbolMap = std::map; + + static String getFlattenedGroupSymbol (const AudioProcessorParameterGroup& group, String symbol = "") + { + if (auto* parent = group.getParent()) + return getFlattenedGroupSymbol (*parent, group.getID() + (symbol.isEmpty() ? "" : group.getSeparator() + symbol)); + + return symbol; + } + + static String getSymbolForGroup (const AudioProcessorParameterGroup& group) + { + const String allowedCharacters ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789"); + const auto base = getFlattenedGroupSymbol (group); + + if (base.isEmpty()) + return {}; + + String copy; + + for (const auto character : base) + copy << String::charToString (allowedCharacters.containsChar (character) ? character : (juce_wchar) '_'); + + return "paramgroup_" + copy; + } + + static GroupSymbolMap getGroupsAndSymbols (const std::vector& groups) + { + std::set symbols; + GroupSymbolMap result; + + for (const auto& group : groups) + { + const auto symbol = [&] + { + const auto idealSymbol = getSymbolForGroup (*group); + + if (symbols.find (idealSymbol) == symbols.cend()) + return idealSymbol; + + for (auto i = 2; i < std::numeric_limits::max(); ++i) + { + const auto toTest = idealSymbol + "_" + String (i); + + if (symbols.find (toTest) == symbols.cend()) + return toTest; + } + + jassertfalse; + return String(); + }(); + + symbols.insert (symbol); + result.emplace (group, symbol); + } + + return result; + } + + template + static void visitAllParameters (const GroupSymbolMap& groups, Fn&& fn) + { + for (const auto& group : groups) + for (const auto* node : *group.first) + if (auto* param = node->getParameter()) + fn (group.second, *param); + } + + static Result writeDspTtl (AudioProcessor& proc, const File& libraryPath) + { + auto os = openStream (libraryPath, "dsp"); + + os << "@prefix atom: .\n" + "@prefix bufs: .\n" + "@prefix doap: .\n" + "@prefix foaf: .\n" + "@prefix lv2: .\n" + "@prefix midi: .\n" + "@prefix opts: .\n" + "@prefix param: .\n" + "@prefix patch: .\n" + "@prefix pg: .\n" + "@prefix plug: <" JucePlugin_LV2URI << uriSeparator << "> .\n" + "@prefix pprop: .\n" + "@prefix rdfs: .\n" + "@prefix rdf: .\n" + "@prefix rsz: .\n" + "@prefix state: .\n" + "@prefix time: .\n" + "@prefix ui: .\n" + "@prefix units: .\n" + "@prefix urid: .\n" + "@prefix xsd: .\n" + "\n"; + + LegacyAudioParametersWrapper legacyParameters (proc, false); + + const auto allGroups = findAllSubgroupsDepthFirst (legacyParameters.getGroup()); + const auto groupsAndSymbols = getGroupsAndSymbols (allGroups); + + const auto parameterVisitor = [&] (const String& symbol, + const AudioProcessorParameter& param) + { + os << "plug:" << ParameterStorage::getIri (param) << "\n" + "\ta lv2:Parameter ;\n" + "\trdfs:label \"" << param.getName (1024) << "\" ;\n"; + + if (symbol.isNotEmpty()) + os << "\tpg:group plug:" << symbol << " ;\n"; + + os << "\trdfs:range atom:Float ;\n"; + + if (auto* rangedParam = dynamic_cast (¶m)) + { + os << "\tlv2:default " << rangedParam->convertFrom0to1 (rangedParam->getDefaultValue()) << " ;\n" + "\tlv2:minimum " << rangedParam->getNormalisableRange().start << " ;\n" + "\tlv2:maximum " << rangedParam->getNormalisableRange().end; + } + else + { + os << "\tlv2:default " << param.getDefaultValue() << " ;\n" + "\tlv2:minimum 0.0 ;\n" + "\tlv2:maximum 1.0"; + } + + // Avoid writing out loads of scale points for parameters with lots of steps + constexpr auto stepLimit = 1000; + const auto numSteps = param.getNumSteps(); + + if (param.isDiscrete() && 2 <= numSteps && numSteps < stepLimit) + { + os << "\t ;\n" + "\tlv2:portProperty lv2:enumeration " << (param.isBoolean() ? ", lv2:toggled " : "") << ";\n" + "\tlv2:scalePoint "; + + const auto maxIndex = numSteps - 1; + + for (int i = 0; i < numSteps; ++i) + { + const auto value = (float) i / (float) maxIndex; + const auto text = param.getText (value, 1024); + + os << (i != 0 ? ", " : "") << "[\n" + "\t\trdfs:label \"" << text << "\" ;\n" + "\t\trdf:value " << value << " ;\n" + "\t]"; + } + } + + os << " .\n\n"; + }; + + visitAllParameters (groupsAndSymbols, parameterVisitor); + + for (const auto& groupInfo : groupsAndSymbols) + { + if (groupInfo.second.isEmpty()) + continue; + + os << "plug:" << groupInfo.second << "\n" + "\ta pg:Group ;\n"; + + if (auto* parent = groupInfo.first->getParent()) + { + if (parent->getParent() != nullptr) + { + const auto it = groupsAndSymbols.find (parent); + + if (it != groupsAndSymbols.cend()) + os << "\tpg:subGroupOf plug:" << it->second << " ;\n"; + } + } + + os << "\tlv2:symbol \"" << groupInfo.second << "\" ;\n" + "\tlv2:name \"" << groupInfo.first->getName() << "\" .\n\n"; + } + + const auto getBaseBusName = [] (bool isInput) { return isInput ? "input_group_" : "output_group_"; }; + + for (const auto isInput : { true, false }) + { + const auto baseBusName = getBaseBusName (isInput); + const auto groupKind = isInput ? "InputGroup" : "OutputGroup"; + const auto busCount = proc.getBusCount (isInput); + + for (auto i = 0; i < busCount; ++i) + { + if (const auto* bus = proc.getBus (isInput, i)) + { + os << "plug:" << baseBusName << (i + 1) << "\n" + "\ta pg:" << groupKind << " ;\n" + "\tlv2:name \"" << bus->getName() << "\" ;\n" + "\tlv2:symbol \"" << baseBusName << (i + 1) << "\" .\n\n"; + } + } + } + + os << "<" JucePlugin_LV2URI ">\n"; + + if (proc.hasEditor()) + os << "\tui:ui <" << JucePluginLV2UriUi << "> ;\n"; + + const auto versionParts = StringArray::fromTokens (JucePlugin_VersionString, ".", ""); + + const auto getVersionOrZero = [&] (int indexFromBack) + { + const auto str = versionParts[versionParts.size() - indexFromBack]; + return str.isEmpty() ? 0 : str.getIntValue(); + }; + + const auto minorVersion = getVersionOrZero (2); + const auto microVersion = getVersionOrZero (1); + + os << "\ta " + #if JucePlugin_IsSynth + "lv2:InstrumentPlugin" + #else + "lv2:Plugin" + #endif + " ;\n" + "\tdoap:name \"" JucePlugin_Name "\" ;\n" + "\tdoap:description \"" JucePlugin_Desc "\" ;\n" + "\tlv2:minorVersion " << minorVersion << " ;\n" + "\tlv2:microVersion " << microVersion << " ;\n" + "\tdoap:maintainer [\n" + "\t\ta foaf:Person ;\n" + "\t\tfoaf:name \"" JucePlugin_Manufacturer "\" ;\n" + "\t\tfoaf:homepage <" JucePlugin_ManufacturerWebsite "> ;\n" + "\t\tfoaf:mbox <" JucePlugin_ManufacturerEmail "> ;\n" + "\t] ;\n" + "\tdoap:release [\n" + "\t\ta doap:Version ;\n" + "\t\tdoap:revision \"" JucePlugin_VersionString "\" ;\n" + "\t] ;\n" + "\tlv2:optionalFeature\n" + "\t\tlv2:hardRTCapable ;\n" + "\tlv2:extensionData\n" + "\t\tstate:interface ;\n" + "\tlv2:requiredFeature\n" + "\t\turid:map ,\n" + "\t\topts:options ,\n" + "\t\tbufs:boundedBlockLength ;\n"; + + for (const auto isInput : { true, false }) + { + const auto kind = isInput ? "mainInput" : "mainOutput"; + + if (proc.getBusCount (isInput) > 0) + os << "\tpg:" << kind << " plug:" << getBaseBusName (isInput) << "1 ;\n"; + } + + if (legacyParameters.size() != 0) + { + for (const auto header : { "writable", "readable" }) + { + os << "\tpatch:" << header; + + bool isFirst = true; + + for (const auto* param : legacyParameters) + { + os << (isFirst ? "" : " ,") << "\n\t\tplug:" << ParameterStorage::getIri (*param); + isFirst = false; + } + + os << " ;\n"; + } + } + + os << "\tlv2:port [\n"; + + const PortIndices indices (proc.getTotalNumInputChannels(), + proc.getTotalNumOutputChannels()); + + const auto designationMap = [&] + { + std::map result; + + for (const auto& pair : lv2_shared::channelDesignationMap) + result.emplace (pair.second, pair.first); + + return result; + }(); + + // TODO add support for specific audio group kinds + for (const auto isInput : { true, false }) + { + const auto baseBusName = getBaseBusName (isInput); + const auto portKind = isInput ? "InputPort" : "OutputPort"; + const auto portName = isInput ? "Audio In " : "Audio Out "; + const auto portSymbol = isInput ? "audio_in_" : "audio_out_"; + const auto busCount = proc.getBusCount (isInput); + + auto channelCounter = 0; + + for (auto busIndex = 0; busIndex < busCount; ++busIndex) + { + if (const auto* bus = proc.getBus (isInput, busIndex)) + { + const auto channelCount = bus->getNumberOfChannels(); + const auto optionalBus = ! bus->isEnabledByDefault(); + + for (auto channelIndex = 0; channelIndex < channelCount; ++channelIndex, ++channelCounter) + { + const auto portIndex = isInput ? indices.getPortIndexForAudioInput (channelCounter) + : indices.getPortIndexForAudioOutput (channelCounter); + + os << "\t\ta lv2:" << portKind << " , lv2:AudioPort ;\n" + "\t\tlv2:index " << portIndex << " ;\n" + "\t\tlv2:symbol \"" << portSymbol << (channelCounter + 1) << "\" ;\n" + "\t\tlv2:name \"" << portName << (channelCounter + 1) << "\" ;\n" + "\t\tpg:group plug:" << baseBusName << (busIndex + 1) << " ;\n"; + + if (optionalBus) + os << "\t\tlv2:portProperty lv2:connectionOptional ;\n"; + + const auto designation = bus->getCurrentLayout().getTypeOfChannel (channelIndex); + const auto it = designationMap.find (designation); + + if (it != designationMap.end()) + os << "\t\tlv2:designation <" << it->second << "> ;\n"; + + os << "\t] , [\n"; + } + } + } + } + + // In the event that the plugin decides to send all of its parameters in one go, + // we should ensure that the output buffer is large enough to accommodate, with some + // extra room for the sequence header, MIDI messages etc.. + const auto patchSetSizeBytes = 72; + const auto additionalSize = 8192; + const auto atomPortMinSize = proc.getParameters().size() * patchSetSizeBytes + additionalSize; + + os << "\t\ta lv2:InputPort , atom:AtomPort ;\n" + "\t\trsz:minimumSize " << atomPortMinSize << " ;\n" + "\t\tatom:bufferType atom:Sequence ;\n" + "\t\tatom:supports\n"; + + #if ! JucePlugin_IsSynth && ! JucePlugin_IsMidiEffect + if (proc.acceptsMidi()) + #endif + os << "\t\t\tmidi:MidiEvent ,\n"; + + os << "\t\t\tpatch:Message ,\n" + "\t\t\ttime:Position ;\n" + "\t\tlv2:designation lv2:control ;\n" + "\t\tlv2:index " << indices.getPortIndexFor (PortKind::seqInput) << " ;\n" + "\t\tlv2:symbol \"in\" ;\n" + "\t\tlv2:name \"In\" ;\n" + "\t] , [\n" + "\t\ta lv2:OutputPort , atom:AtomPort ;\n" + "\t\trsz:minimumSize " << atomPortMinSize << " ;\n" + "\t\tatom:bufferType atom:Sequence ;\n" + "\t\tatom:supports\n"; + + #if ! JucePlugin_IsMidiEffect + if (proc.producesMidi()) + #endif + os << "\t\t\tmidi:MidiEvent ,\n"; + + os << "\t\t\tpatch:Message ;\n" + "\t\tlv2:designation lv2:control ;\n" + "\t\tlv2:index " << indices.getPortIndexFor (PortKind::seqOutput) << " ;\n" + "\t\tlv2:symbol \"out\" ;\n" + "\t\tlv2:name \"Out\" ;\n" + "\t] , [\n" + "\t\ta lv2:OutputPort , lv2:ControlPort ;\n" + "\t\tlv2:designation lv2:latency ;\n" + "\t\tlv2:symbol \"latency\" ;\n" + "\t\tlv2:name \"Latency\" ;\n" + "\t\tlv2:index " << indices.getPortIndexFor (PortKind::latencyOutput) << " ;\n" + "\t\tlv2:portProperty lv2:reportsLatency , lv2:integer , lv2:connectionOptional , pprop:notOnGUI ;\n" + "\t\tunits:unit units:frame ;\n" + "\t] , [\n" + "\t\ta lv2:InputPort , lv2:ControlPort ;\n" + "\t\tlv2:designation lv2:freeWheeling ;\n" + "\t\tlv2:symbol \"freeWheeling\" ;\n" + "\t\tlv2:name \"Free Wheeling\" ;\n" + "\t\tlv2:default 0.0 ;\n" + "\t\tlv2:minimum 0.0 ;\n" + "\t\tlv2:maximum 1.0 ;\n" + "\t\tlv2:index " << indices.getPortIndexFor (PortKind::freeWheelingInput) << " ;\n" + "\t\tlv2:portProperty lv2:toggled , lv2:connectionOptional , pprop:notOnGUI ;\n" + "\t] , [\n" + "\t\ta lv2:InputPort , lv2:ControlPort ;\n" + "\t\tlv2:designation lv2:enabled ;\n" + "\t\tlv2:symbol \"enabled\" ;\n" + "\t\tlv2:name \"Enabled\" ;\n" + "\t\tlv2:default 1.0 ;\n" + "\t\tlv2:minimum 0.0 ;\n" + "\t\tlv2:maximum 1.0 ;\n" + "\t\tlv2:index " << indices.getPortIndexFor (PortKind::enabledInput) << " ;\n" + "\t\tlv2:portProperty lv2:toggled , lv2:connectionOptional , pprop:notOnGUI ;\n" + "\t] ;\n" + "\topts:supportedOption\n" + "\t\tbufs:maxBlockLength .\n"; + + return Result::ok(); + } + + static Result writeUiTtl (AudioProcessor& proc, const File& libraryPath) + { + if (! proc.hasEditor()) + return Result::ok(); + + auto os = openStream (libraryPath, "ui"); + + const auto editorInstance = rawToUniquePtr (proc.createEditor()); + const auto resizeFeatureString = editorInstance->isResizable() ? "ui:resize" : "ui:noUserResize"; + + os << "@prefix lv2: .\n" + "@prefix opts: .\n" + "@prefix param: .\n" + "@prefix ui: .\n" + "@prefix urid: .\n" + "\n" + "<" << JucePluginLV2UriUi << ">\n" + "\tlv2:extensionData\n" + #if JUCE_LINUX || JUCE_BSD + "\t\tui:idleInterface ,\n" + #endif + "\t\topts:interface ,\n" + "\t\tui:noUserResize ,\n" // resize and noUserResize are always present in the extension data array + "\t\tui:resize ;\n" + "\n" + "\tlv2:requiredFeature\n" + #if JUCE_LINUX || JUCE_BSD + "\t\tui:idleInterface ,\n" + #endif + "\t\turid:map ,\n" + "\t\tui:parent ,\n" + "\t\t ;\n" + "\n" + "\tlv2:optionalFeature\n" + "\t\t" << resizeFeatureString << " ,\n" + "\t\topts:interface ,\n" + "\t\topts:options ;\n\n" + "\topts:supportedOption\n" + "\t\tui:scaleFactor ,\n" + "\t\tparam:sampleRate .\n"; + + return Result::ok(); + } + + JUCE_LEAK_DETECTOR (RecallFeature) +}; + +//============================================================================== +LV2_SYMBOL_EXPORT const LV2_Descriptor* lv2_descriptor (uint32_t index) +{ + PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_LV2; + + if (index != 0) + return nullptr; + + static const LV2_Descriptor descriptor + { + JucePlugin_LV2URI, // TODO some constexpr check that this is a valid URI in terms of RFC 3986 + [] (const LV2_Descriptor*, + double sampleRate, + const char* pathToBundle, + const LV2_Feature* const* features) -> LV2_Handle + { + const auto* mapFeature = findMatchingFeatureData (features, LV2_URID__map); + + if (mapFeature == nullptr) + { + // The host doesn't provide the 'urid map' feature + jassertfalse; + return nullptr; + } + + const auto boundedBlockLength = hasFeature (features, LV2_BUF_SIZE__boundedBlockLength); + + if (! boundedBlockLength) + { + // The host doesn't provide the 'bounded block length' feature + jassertfalse; + return nullptr; + } + + const auto* options = findMatchingFeatureData (features, LV2_OPTIONS__options); + + if (options == nullptr) + { + // The host doesn't provide the 'options' feature + jassertfalse; + return nullptr; + } + + const lv2_shared::NumericAtomParser parser { *mapFeature }; + const auto blockLengthUrid = mapFeature->map (mapFeature->handle, LV2_BUF_SIZE__maxBlockLength); + const auto blockSize = parser.parseNumericOption (findMatchingOption (options, blockLengthUrid)); + + if (! blockSize.hasValue()) + { + // The host doesn't specify a maximum block size + jassertfalse; + return nullptr; + } + + return new LV2PluginInstance { sampleRate, *blockSize, pathToBundle, *mapFeature }; + }, + [] (LV2_Handle instance, uint32_t port, void* data) + { + static_cast (instance)->connect (port, data); + }, + [] (LV2_Handle instance) { static_cast (instance)->activate(); }, + [] (LV2_Handle instance, uint32_t sampleCount) + { + static_cast (instance)->run (sampleCount); + }, + [] (LV2_Handle instance) { static_cast (instance)->deactivate(); }, + [] (LV2_Handle instance) + { + JUCE_AUTORELEASEPOOL + { + delete static_cast (instance); + } + }, + [] (const char* uri) -> const void* + { + const auto uriMatches = [&] (const LV2_Feature& f) { return std::strcmp (f.URI, uri) == 0; }; + + static RecallFeature recallFeature; + + static LV2_State_Interface stateInterface + { + [] (LV2_Handle instance, + LV2_State_Store_Function store, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature* const* features) -> LV2_State_Status + { + return static_cast (instance)->store (store, handle, flags, features); + }, + [] (LV2_Handle instance, + LV2_State_Retrieve_Function retrieve, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature* const* features) -> LV2_State_Status + { + return static_cast (instance)->retrieve (retrieve, handle, flags, features); + } + }; + + static const LV2_Feature features[] { { JUCE_TURTLE_RECALL_URI, &recallFeature }, + { LV2_STATE__interface, &stateInterface } }; + + const auto it = std::find_if (std::begin (features), std::end (features), uriMatches); + return it != std::end (features) ? it->data : nullptr; + } + }; + + return &descriptor; +} + +static Optional findScaleFactor (const LV2_URID_Map* symap, const LV2_Options_Option* options) +{ + if (options == nullptr || symap == nullptr) + return {}; + + const lv2_shared::NumericAtomParser parser { *symap }; + const auto scaleFactorUrid = symap->map (symap->handle, LV2_UI__scaleFactor); + const auto* scaleFactorOption = findMatchingOption (options, scaleFactorUrid); + return parser.parseNumericOption (scaleFactorOption); +} + +class LV2UIInstance : private Component, + private ComponentListener +{ +public: + LV2UIInstance (const char*, + const char*, + LV2UI_Write_Function writeFunctionIn, + LV2UI_Controller controllerIn, + LV2UI_Widget* widget, + LV2PluginInstance* pluginIn, + LV2UI_Widget parentIn, + const LV2_URID_Map* symapIn, + const LV2UI_Resize* resizeFeatureIn, + Optional scaleFactorIn) + : writeFunction (writeFunctionIn), + controller (controllerIn), + plugin (pluginIn), + parent (parentIn), + symap (symapIn), + resizeFeature (resizeFeatureIn), + scaleFactor (scaleFactorIn), + editor (plugin->createEditor()) + { + jassert (plugin != nullptr); + jassert (parent != nullptr); + jassert (editor != nullptr); + + if (editor == nullptr) + return; + + const auto bounds = getSizeToContainChild(); + setSize (bounds.getWidth(), bounds.getHeight()); + + addAndMakeVisible (*editor); + + setBroughtToFrontOnMouseClick (true); + setOpaque (true); + setVisible (false); + removeFromDesktop(); + addToDesktop (0, parent); + editor->addComponentListener (this); + + *widget = getWindowHandle(); + + setVisible (true); + + editor->setScaleFactor (getScaleFactor()); + requestResize(); + } + + ~LV2UIInstance() override + { + plugin->editorBeingDeleted (editor.get()); + } + + // This is called by the host when a parameter changes. + // We don't care, our UI will listen to the processor directly. + void portEvent (uint32_t, uint32_t, uint32_t, const void*) {} + + // Called when the host requests a resize + int resize (int width, int height) + { + const ScopedValueSetter scope (hostRequestedResize, true); + setSize (width, height); + return 0; + } + + // Called by the host to give us an opportunity to process UI events + void idleCallback() + { + #if JUCE_LINUX || JUCE_BSD + messageThread->processPendingEvents(); + #endif + } + + void resized() override + { + const ScopedValueSetter scope (hostRequestedResize, true); + + if (editor != nullptr) + { + const auto localArea = editor->getLocalArea (this, getLocalBounds()); + editor->setBoundsConstrained ({ localArea.getWidth(), localArea.getHeight() }); + } + } + + void paint (Graphics& g) override { g.fillAll (Colours::black); } + + uint32_t getOptions (LV2_Options_Option* options) + { + const auto scaleFactorUrid = symap->map (symap->handle, LV2_UI__scaleFactor); + const auto floatUrid = symap->map (symap->handle, LV2_ATOM__Float);; + + for (auto* opt = options; opt->key != 0; ++opt) + { + if (opt->context != LV2_OPTIONS_INSTANCE || opt->subject != 0 || opt->key != scaleFactorUrid) + continue; + + if (scaleFactor.hasValue()) + { + opt->type = floatUrid; + opt->size = sizeof (float); + opt->value = &(*scaleFactor); + } + } + + return LV2_OPTIONS_SUCCESS; + } + + uint32_t setOptions (const LV2_Options_Option* options) + { + const auto scaleFactorUrid = symap->map (symap->handle, LV2_UI__scaleFactor); + const auto floatUrid = symap->map (symap->handle, LV2_ATOM__Float);; + + for (auto* opt = options; opt->key != 0; ++opt) + { + if (opt->context != LV2_OPTIONS_INSTANCE + || opt->subject != 0 + || opt->key != scaleFactorUrid + || opt->type != floatUrid + || opt->size != sizeof (float)) + { + continue; + } + + scaleFactor = *static_cast (opt->value); + updateScale(); + } + + return LV2_OPTIONS_SUCCESS; + } + +private: + void updateScale() + { + editor->setScaleFactor (getScaleFactor()); + requestResize(); + } + + Rectangle getSizeToContainChild() const + { + if (editor != nullptr) + return getLocalArea (editor.get(), editor->getLocalBounds()); + + return {}; + } + + float getScaleFactor() const noexcept + { + return scaleFactor.hasValue() ? *scaleFactor : 1.0f; + } + + void componentMovedOrResized (Component&, bool, bool wasResized) override + { + if (! hostRequestedResize && wasResized) + requestResize(); + } + + void write (uint32_t portIndex, uint32_t bufferSize, uint32_t portProtocol, const void* data) + { + writeFunction (controller, portIndex, bufferSize, portProtocol, data); + } + + void requestResize() + { + if (editor == nullptr) + return; + + const auto bounds = getSizeToContainChild(); + + if (resizeFeature == nullptr) + return; + + if (auto* fn = resizeFeature->ui_resize) + fn (resizeFeature->handle, bounds.getWidth(), bounds.getHeight()); + + setSize (bounds.getWidth(), bounds.getHeight()); + repaint(); + } + + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer messageThread; + #endif + + LV2UI_Write_Function writeFunction; + LV2UI_Controller controller; + LV2PluginInstance* plugin; + LV2UI_Widget parent; + const LV2_URID_Map* symap = nullptr; + const LV2UI_Resize* resizeFeature = nullptr; + Optional scaleFactor; + std::unique_ptr editor; + bool hostRequestedResize = false; + + JUCE_LEAK_DETECTOR (LV2UIInstance) +}; + +LV2_SYMBOL_EXPORT const LV2UI_Descriptor* lv2ui_descriptor (uint32_t index) +{ + if (index != 0) + return nullptr; + + static const LV2UI_Descriptor descriptor + { + JucePluginLV2UriUi.toRawUTF8(), // TODO some constexpr check that this is a valid URI in terms of RFC 3986 + [] (const LV2UI_Descriptor*, + const char* pluginUri, + const char* bundlePath, + LV2UI_Write_Function writeFunction, + LV2UI_Controller controller, + LV2UI_Widget* widget, + const LV2_Feature* const* features) -> LV2UI_Handle + { + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer messageThread; + #endif + + auto* plugin = findMatchingFeatureData (features, LV2_INSTANCE_ACCESS_URI); + + if (plugin == nullptr) + { + // No instance access + jassertfalse; + return nullptr; + } + + auto* parent = findMatchingFeatureData (features, LV2_UI__parent); + + if (parent == nullptr) + { + // No parent access + jassertfalse; + return nullptr; + } + + auto* resizeFeature = findMatchingFeatureData (features, LV2_UI__resize); + + const auto* symap = findMatchingFeatureData (features, LV2_URID__map); + const auto scaleFactor = findScaleFactor (symap, findMatchingFeatureData (features, LV2_OPTIONS__options)); + + return new LV2UIInstance { pluginUri, + bundlePath, + writeFunction, + controller, + widget, + plugin, + parent, + symap, + resizeFeature, + scaleFactor }; + }, + [] (LV2UI_Handle ui) + { + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer messageThread; + #endif + + JUCE_AUTORELEASEPOOL + { + delete static_cast (ui); + } + }, + [] (LV2UI_Handle ui, uint32_t portIndex, uint32_t bufferSize, uint32_t format, const void* buffer) + { + JUCE_ASSERT_MESSAGE_THREAD + static_cast (ui)->portEvent (portIndex, bufferSize, format, buffer); + }, + [] (const char* uri) -> const void* + { + const auto uriMatches = [&] (const LV2_Feature& f) { return std::strcmp (f.URI, uri) == 0; }; + + static LV2UI_Resize resize { nullptr, [] (LV2UI_Feature_Handle handle, int width, int height) -> int + { + JUCE_ASSERT_MESSAGE_THREAD + return static_cast (handle)->resize (width, height); + } }; + + static LV2UI_Idle_Interface idle { [] (LV2UI_Handle handle) + { + static_cast (handle)->idleCallback(); + return 0; + } }; + + static LV2_Options_Interface options + { + [] (LV2_Handle handle, LV2_Options_Option* optionsIn) + { + return static_cast (handle)->getOptions (optionsIn); + }, + [] (LV2_Handle handle, const LV2_Options_Option* optionsIn) + { + return static_cast (handle)->setOptions (optionsIn); + } + }; + + // We'll always define noUserResize and idle in the extension data array, but we'll + // only declare them in the ui.ttl if the UI is actually non-resizable, or requires + // idle callbacks. + // Well-behaved hosts should check the ttl before trying to search the + // extension-data array. + static const LV2_Feature features[] { { LV2_UI__resize, &resize }, + { LV2_UI__noUserResize, nullptr }, + { LV2_UI__idleInterface, &idle }, + { LV2_OPTIONS__interface, &options } }; + + const auto it = std::find_if (std::begin (features), std::end (features), uriMatches); + return it != std::end (features) ? it->data : nullptr; + } + }; + + return &descriptor; +} + +} +} + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,78 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#ifdef _WIN32 + #include + HMODULE dlopen (const char* filename, int) { return LoadLibrary (filename); } + FARPROC dlsym (HMODULE handle, const char* name) { return GetProcAddress (handle, name); } + enum { RTLD_LAZY = 0 }; +#else + #include +#endif + +#include + +// Replicating some of the LV2 header here so that we don't have to set up any +// custom include paths for this file. +// Normally this would be a bad idea, but the LV2 API has to keep these definitions +// in order to remain backwards-compatible. + +extern "C" +{ + typedef struct LV2_Descriptor + { + const void* a; + const void* b; + const void* c; + const void* d; + const void* e; + const void* f; + const void* g; + const void* (*extension_data)(const char* uri); + } LV2_Descriptor; +} + +int main (int argc, const char** argv) +{ + if (argc != 2) + return 1; + + const auto* libraryPath = argv[1]; + + struct RecallFeature + { + int (*doRecall) (const char*); + }; + + if (auto* handle = dlopen (libraryPath, RTLD_LAZY)) + if (auto* getDescriptor = reinterpret_cast (dlsym (handle, "lv2_descriptor"))) + if (auto* descriptor = getDescriptor (0)) + if (auto* extensionData = descriptor->extension_data) + if (auto* recallFeature = reinterpret_cast (extensionData ("https://lv2-extensions.juce.com/turtle_recall"))) + if (auto* doRecall = recallFeature->doRecall) + return doRecall (libraryPath); + + return 1; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-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. - - ============================================================================== -*/ - -#pragma once - -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -#include "juce_RTAS_DigiCode_Header.h" - -/* - This file is used to include and build the required digidesign CPP files without your project - needing to reference the files directly. Because these files will be found via your include path, - this means that the project doesn't have to change to cope with people's SDKs being in different - locations. - - Important note on Windows: In your project settings for the three juce_RTAS_DigiCode.cpp files and - the juce_RTAS_Wrapper.cpp file, you need to set the calling convention to "__stdcall". - If you don't do this, you'll get some unresolved externals and will spend a long time wondering what's - going on... All the other files in your project can be set to use the normal __cdecl convention. - - If you get an error building the includes statements below, check your paths - there's a full - list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp -*/ - -#if WINDOWS_VERSION - #undef _UNICODE - #undef UNICODE -#endif - -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnon-virtual-dtor", - "-Wcomment", - "-Wreorder", - "-Wextra-tokens", - "-Wunused-variable", - "-Wdeprecated") - -#include -#include -#include -#include -#include -#include -#include -#include - -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - -#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-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. - - ============================================================================== -*/ - -#pragma once - -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -#include "juce_RTAS_DigiCode_Header.h" - -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wcomment", - "-Wextra-tokens", - "-Wnon-virtual-dtor", - "-Wreorder", - "-Wdeprecated") - -/* - This file is used to include and build the required digidesign CPP files without your project - needing to reference the files directly. Because these files will be found via your include path, - this means that the project doesn't have to change to cope with people's SDKs being in different - locations. - - Important note on Windows: In your project settings for the three juce_RTAS_DigiCode.cpp files and - the juce_RTAS_Wrapper.cpp file, you need to set the calling convention to "__stdcall". - If you don't do this, you'll get some unresolved externals and will spend a long time wondering what's - going on... All the other files in your project can be set to use the normal __cdecl convention. - - If you get an error building the includes statements below, check your paths - there's a full - list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp -*/ - -#include -#include - -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - -#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-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. - - ============================================================================== -*/ - -#pragma once - -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - - #include "../utility/juce_IncludeSystemHeaders.h" - #include "juce_RTAS_DigiCode_Header.h" - - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnon-virtual-dtor", "-Wextra-tokens", "-Wreorder") - - /* - This file is used to include and build the required digidesign CPP files without your project - needing to reference the files directly. Because these files will be found via your include path, - this means that the project doesn't have to change to cope with people's SDKs being in different - locations. - - Important note on Windows: In your project settings for the three juce_RTAS_DigiCode.cpp files and - the juce_RTAS_Wrapper.cpp file, you need to set the calling convention to "__stdcall". - If you don't do this, you'll get some unresolved externals and will spend a long time wondering what's - going on... All the other files in your project can be set to use the normal __cdecl convention. - - If you get an error building the includes statements below, check your paths - there's a full - list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp - */ - - #if WINDOWS_VERSION - #undef _UNICODE - #undef UNICODE - #define DllMain DllMainRTAS - #include - #undef DllMain - #include - #else - #include - #include - #endif - - JUCE_END_IGNORE_WARNINGS_GCC_LIKE - -#else - - #if _MSC_VER - short __stdcall NewPlugIn (void*) { return 0; } - short __stdcall _PI_GetRoutineDescriptor (long, void*) { return 0; } - #endif - -#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-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. - - ============================================================================== -*/ - -#pragma once - -#if JucePlugin_Build_RTAS -#ifdef _MSC_VER - - #define kCompileAsCodeResource 0 - #define kBuildStandAlone 0 - #define kNoDSP 0 - #define kNoDAE 0 - #define kNoSDS 0 - #define kNoViews 0 - #define kUseDSPCodeDecode 0 - - #define WIN32 1 - #define WINDOWS_VERSION 1 - #define PLUGIN_SDK_BUILD 1 - #define PLUGIN_SDK_DIRECTMIDI 1 - #define _STDINT_H 1 - - // the Digidesign projects all use a struct alignment of 2.. - #pragma pack (2) - #pragma warning (disable: 4267 4996 4311 4312 4103 4121 4100 4127 4189 4245 4389 4512 4701 4703) - - #include - -#else - - #define kCompileAsCodeResource 0 - #define kNoDSP 1 - #define kNoDAE 0 - #define kNoSDS 0 - #define kNoViews 0 - #define kUseDSPCodeDecode 0 - - #define MAC_VERSION 1 - #define PLUGIN_SDK_BUILD 1 - #define PLUGIN_SDK_DIRECTMIDI 1 - #define DIGI_PASCAL - - #include - -#endif -#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm 1970-01-01 00:00:00.000000000 +0000 @@ -1,169 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -// Horrible carbon-based fix for a cocoa bug, where an NSWindow that wraps a carbon -// window fails to keep its position updated when the user drags the window around.. -#define WINDOWPOSITION_BODGE 1 -#define JUCE_MAC_WINDOW_VISIBITY_BODGE 1 - -#include "../utility/juce_IncludeSystemHeaders.h" -#include "../utility/juce_IncludeModuleHeaders.h" -#include "../utility/juce_CarbonVisibility.h" - -using namespace juce; - -//============================================================================== -void initialiseMacRTAS(); -void initialiseMacRTAS() -{ - #if ! JUCE_64BIT - NSApplicationLoad(); - #endif -} - -void* attachSubWindow (void*, Component*); -void* attachSubWindow (void* hostWindowRef, Component* comp) -{ - JUCE_AUTORELEASEPOOL - { - #if 0 - // This was suggested as a way to improve passing keypresses to the host, but - // a side-effect seems to be occasional rendering artifacts. - HIWindowChangeClass ((WindowRef) hostWindowRef, kFloatingWindowClass); - #endif - - NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: hostWindowRef]; - [hostWindow retain]; - [hostWindow setCanHide: YES]; - [hostWindow setReleasedWhenClosed: YES]; - NSRect oldWindowFrame = [hostWindow frame]; - - NSView* content = [hostWindow contentView]; - NSRect f = [content frame]; - f.size.width = comp->getWidth(); - f.size.height = comp->getHeight(); - [content setFrame: f]; - - const CGFloat mainScreenHeight = [[[NSScreen screens] objectAtIndex: 0] frame].size.height; - - #if WINDOWPOSITION_BODGE - { - Rect winBounds; - GetWindowBounds ((WindowRef) hostWindowRef, kWindowContentRgn, &winBounds); - NSRect w = [hostWindow frame]; - w.origin.x = winBounds.left; - w.origin.y = mainScreenHeight - winBounds.bottom; - [hostWindow setFrame: w display: NO animate: NO]; - } - #endif - - NSPoint windowPos = [hostWindow convertBaseToScreen: f.origin]; - windowPos.x = windowPos.x + jmax (0.0f, (oldWindowFrame.size.width - f.size.width) / 2.0f); - windowPos.y = mainScreenHeight - (windowPos.y + f.size.height); - - comp->setTopLeftPosition ((int) windowPos.x, (int) windowPos.y); - - #if ! JucePlugin_EditorRequiresKeyboardFocus - comp->addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); - #else - comp->addToDesktop (ComponentPeer::windowIsTemporary); - #endif - - comp->setVisible (true); - - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - - [hostWindow addChildWindow: pluginWindow - ordered: NSWindowAbove]; - [hostWindow orderFront: nil]; - [pluginWindow orderFront: nil]; - - attachWindowHidingHooks (comp, (WindowRef) hostWindowRef, hostWindow); - - return hostWindow; - } -} - -void removeSubWindow (void*, Component*); -void removeSubWindow (void* nsWindow, Component* comp) -{ - JUCE_AUTORELEASEPOOL - { - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* hostWindow = (NSWindow*) nsWindow; - NSWindow* pluginWindow = [pluginView window]; - - removeWindowHidingHooks (comp); - [hostWindow removeChildWindow: pluginWindow]; - comp->removeFromDesktop(); - [hostWindow release]; - } -} - -namespace -{ - bool isJuceWindow (WindowRef w) - { - for (int i = ComponentPeer::getNumPeers(); --i >= 0;) - { - ComponentPeer* peer = ComponentPeer::getPeer(i); - NSView* view = (NSView*) peer->getNativeHandle(); - - if ([[view window] windowRef] == w) - return true; - } - - return false; - } -} - -void forwardCurrentKeyEventToHostWindow(); -void forwardCurrentKeyEventToHostWindow() -{ - WindowRef w = FrontNonFloatingWindow(); - WindowRef original = w; - - while (IsValidWindowPtr (w) && isJuceWindow (w)) - { - w = GetNextWindowOfClass (w, kDocumentWindowClass, true); - - if (w == original) - break; - } - - if (! isJuceWindow (w)) - { - ActivateWindow (w, true); - repostCurrentNSEvent(); - } -} - -#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -EXPORTS - NewPlugIn @1 - _PI_GetRoutineDescriptor @2 - Binary files /tmp/tmp3xyzf76u/FU8JCLV1je/juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinResources.rsr and /tmp/tmp3xyzf76u/WWZuZyRX_p/juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinResources.rsr differ diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,157 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -// (these functions are in their own file because of problems including windows.h -// at the same time as the Digi headers) - -#define _DO_NOT_DECLARE_INTERLOCKED_INTRINSICS_IN_MEMORY // (workaround for a VC build problem) - -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0500 -#undef STRICT -#define STRICT -#include -#include - -#pragma pack (push, 8) -#include "../utility/juce_IncludeModuleHeaders.h" -#pragma pack (pop) - -//============================================================================== -void JUCE_CALLTYPE attachSubWindow (void* hostWindow, - int& titleW, int& titleH, - Component* comp) -{ - using namespace juce; - - RECT clientRect; - GetClientRect ((HWND) hostWindow, &clientRect); - - titleW = clientRect.right - clientRect.left; - titleH = jmax (0, (int) (clientRect.bottom - clientRect.top) - comp->getHeight()); - comp->setTopLeftPosition (0, titleH); - - comp->addToDesktop (0); - - HWND plugWnd = (HWND) comp->getWindowHandle(); - SetParent (plugWnd, (HWND) hostWindow); - - DWORD val = GetWindowLong (plugWnd, GWL_STYLE); - val = (val & ~WS_POPUP) | WS_CHILD; - SetWindowLong (plugWnd, GWL_STYLE, val); - - val = GetWindowLong ((HWND) hostWindow, GWL_STYLE); - SetWindowLong ((HWND) hostWindow, GWL_STYLE, val | WS_CLIPCHILDREN); -} - -void JUCE_CALLTYPE resizeHostWindow (void* hostWindow, - int& titleW, int& titleH, - Component* comp) -{ - using namespace juce; - - RECT clientRect, windowRect; - GetClientRect ((HWND) hostWindow, &clientRect); - GetWindowRect ((HWND) hostWindow, &windowRect); - const int borderW = (windowRect.right - windowRect.left) - (clientRect.right - clientRect.left); - const int borderH = (windowRect.bottom - windowRect.top) - (clientRect.bottom - clientRect.top); - - SetWindowPos ((HWND) hostWindow, 0, 0, 0, - borderW + jmax (titleW, comp->getWidth()), - borderH + comp->getHeight() + titleH, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); -} - -extern "C" BOOL WINAPI DllMainRTAS (HINSTANCE, DWORD, LPVOID); - -extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD reason, LPVOID reserved) -{ - if (reason == DLL_PROCESS_ATTACH) - juce::Process::setCurrentModuleInstanceHandle (instance); - - if (GetModuleHandleA ("DAE.DLL") != 0) - return DllMainRTAS (instance, reason, reserved); - - juce::ignoreUnused (reserved); - return TRUE; -} - -#if ! JucePlugin_EditorRequiresKeyboardFocus - -namespace -{ - HWND findMDIParentOf (HWND w) - { - const int frameThickness = GetSystemMetrics (SM_CYFIXEDFRAME); - - while (w != 0) - { - HWND parent = GetParent (w); - - if (parent == 0) - break; - - TCHAR windowType [32] = { 0 }; - GetClassName (parent, windowType, 31); - - if (juce::String (windowType).equalsIgnoreCase ("MDIClient")) - { - w = parent; - break; - } - - RECT windowPos, parentPos; - GetWindowRect (w, &windowPos); - GetWindowRect (parent, &parentPos); - - int dw = (parentPos.right - parentPos.left) - (windowPos.right - windowPos.left); - int dh = (parentPos.bottom - parentPos.top) - (windowPos.bottom - windowPos.top); - - if (dw > 100 || dh > 100) - break; - - w = parent; - - if (dw == 2 * frameThickness) - break; - } - - return w; - } -} - -void JUCE_CALLTYPE passFocusToHostWindow (void* hostWindow) -{ - SetFocus (findMDIParentOf ((HWND) hostWindow)); -} - -#endif - -#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1057 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -#ifdef _MSC_VER - // (this is a workaround for a build problem in VC9) - #define _DO_NOT_DECLARE_INTERLOCKED_INTRINSICS_IN_MEMORY - #include - - #ifndef JucePlugin_WinBag_path - #error "You need to define the JucePlugin_WinBag_path value!" - #endif -#endif - -#include "juce_RTAS_DigiCode_Header.h" - -#ifdef _MSC_VER - #include -#endif - -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Widiomatic-parentheses", - "-Wnon-virtual-dtor", - "-Wcomment") - -/* Note about include paths - ------------------------ - - To be able to include all the Digidesign headers correctly, you'll need to add this - lot to your include path: - - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\EffectClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Utilities - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\RTASP_Adapt - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\CoreClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Controls - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Meters - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ViewClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\DSPClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\common - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\common\Platform - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\SignalProcessing\Public - C:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugIns\DSPManager\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\SADriver\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\DigiPublic\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\Fic\Interfaces\DAEClient - c:\yourdirectory\PT_80_SDK\AlturaPorts\NewFileLibs\Cmn - c:\yourdirectory\PT_80_SDK\AlturaPorts\NewFileLibs\DOA - c:\yourdirectory\PT_80_SDK\AlturaPorts\AlturaSource\PPC_H - c:\yourdirectory\PT_80_SDK\AlturaPorts\AlturaSource\AppSupport - c:\yourdirectory\PT_80_SDK\AlturaPorts\DigiPublic - c:\yourdirectory\PT_80_SDK\AvidCode\AVX2sdk\AVX\avx2\avx2sdk\inc - c:\yourdirectory\PT_80_SDK\xplat\AVX\avx2\avx2sdk\inc - - NB. If you hit a huge pile of bugs around here, make sure that you've not got the - Apple QuickTime headers before the PT headers in your path, because there are - some filename clashes between them. - -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - -//============================================================================== -JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4263 4264 4250) - -#include "../utility/juce_IncludeModuleHeaders.h" - -#ifdef _MSC_VER - #pragma pack (pop) - - // This JUCE_RTAS_LINK_TO_DEBUG_LIB setting can be used to force linkage - // against only the release build of the RTAS lib, since in older SDKs there - // can be problems with the debug build. - #if JUCE_DEBUG && ! defined (JUCE_RTAS_LINK_TO_DEBUG_LIB) - #define JUCE_RTAS_LINK_TO_DEBUG_LIB 1 - #endif - - #if JUCE_RTAS_LINK_TO_DEBUG_LIB - #define PT_LIB_PATH JucePlugin_WinBag_path "\\Debug\\lib\\" - #else - #define PT_LIB_PATH JucePlugin_WinBag_path "\\Release\\lib\\" - #endif - - #pragma comment(lib, PT_LIB_PATH "DAE.lib") - #pragma comment(lib, PT_LIB_PATH "DigiExt.lib") - #pragma comment(lib, PT_LIB_PATH "DSI.lib") - #pragma comment(lib, PT_LIB_PATH "PluginLib.lib") - #pragma comment(lib, PT_LIB_PATH "DSPManager.lib") - #pragma comment(lib, PT_LIB_PATH "DSPManagerClientLib.lib") - #pragma comment(lib, PT_LIB_PATH "RTASClientLib.lib") -#endif - -#undef MemoryBlock - -//============================================================================== -#if JUCE_WINDOWS - extern void JUCE_CALLTYPE attachSubWindow (void* hostWindow, int& titleW, int& titleH, Component* comp); - extern void JUCE_CALLTYPE resizeHostWindow (void* hostWindow, int& titleW, int& titleH, Component* comp); - #if ! JucePlugin_EditorRequiresKeyboardFocus - extern void JUCE_CALLTYPE passFocusToHostWindow (void* hostWindow); - #endif -#else - extern void* attachSubWindow (void* hostWindowRef, Component* comp); - extern void removeSubWindow (void* nsWindow, Component* comp); - extern void forwardCurrentKeyEventToHostWindow(); -#endif - -#if ! (JUCE_DEBUG || defined (JUCE_RTAS_PLUGINGESTALT_IS_CACHEABLE)) - #define JUCE_RTAS_PLUGINGESTALT_IS_CACHEABLE 1 -#endif - -const int midiBufferSize = 1024; -const OSType juceChunkType = 'juce'; -static const int bypassControlIndex = 1; - -static int numInstances = 0; - -using namespace juce; - -//============================================================================== -class JucePlugInProcess : public CEffectProcessMIDI, - public CEffectProcessRTAS, - public AudioProcessorListener, - public AudioPlayHead -{ -public: - //============================================================================== - [[deprecated ("RTAS builds will be removed from JUCE in the next release.")]] - JucePlugInProcess() - { - juceFilter.reset (createPluginFilterOfType (AudioProcessor::wrapperType_RTAS)); - - AddChunk (juceChunkType, "Juce Audio Plugin Data"); - - ++numInstances; - } - - ~JucePlugInProcess() - { - JUCE_AUTORELEASEPOOL - { - if (mLoggedIn) - MIDILogOut(); - - midiBufferNode.reset(); - midiTransport.reset(); - - if (juceFilter != nullptr) - { - juceFilter->releaseResources(); - juceFilter.reset(); - } - - if (--numInstances == 0) - { - #if JUCE_MAC - // Hack to allow any NSWindows to clear themselves up before returning to PT.. - for (int i = 20; --i >= 0;) - MessageManager::getInstance()->runDispatchLoopUntil (1); - #endif - - shutdownJuce_GUI(); - } - } - } - - //============================================================================== - class JuceCustomUIView : public CCustomView, - public Timer - { - public: - //============================================================================== - JuceCustomUIView (AudioProcessor* ap, JucePlugInProcess* p) - : filter (ap), process (p) - { - // setting the size in here crashes PT for some reason, so keep it simple.. - } - - ~JuceCustomUIView() - { - deleteEditorComp(); - } - - //============================================================================== - void updateSize() - { - if (editorComp == nullptr) - { - editorComp.reset (filter->createEditorIfNeeded()); - jassert (editorComp != nullptr); - } - - if (editorComp->getWidth() != 0 && editorComp->getHeight() != 0) - { - Rect oldRect; - GetRect (&oldRect); - - Rect r; - r.left = 0; - r.top = 0; - r.right = editorComp->getWidth(); - r.bottom = editorComp->getHeight(); - SetRect (&r); - - if (oldRect.right != r.right || oldRect.bottom != r.bottom) - startTimer (50); - } - } - - void timerCallback() override - { - if (! Component::isMouseButtonDownAnywhere()) - { - stopTimer(); - - // Send a token to the host to tell it about the resize - SSetProcessWindowResizeToken token (process->fRootNameId, process->fRootNameId); - FicSDSDispatchToken (&token); - } - } - - void attachToWindow (GrafPtr port) - { - if (port != 0) - { - JUCE_AUTORELEASEPOOL - { - updateSize(); - - #if JUCE_WINDOWS - auto hostWindow = (void*) ASI_GethWnd ((WindowPtr) port); - #else - auto hostWindow = (void*) GetWindowFromPort (port); - #endif - wrapper.reset(); - wrapper.reset (new EditorCompWrapper (hostWindow, editorComp.get(), this)); - } - } - else - { - deleteEditorComp(); - } - } - - void DrawContents (Rect*) override - { - #if JUCE_WINDOWS - if (wrapper != nullptr) - if (auto peer = wrapper->getPeer()) - peer->repaint (wrapper->getLocalBounds()); // (seems to be required in PT6.4, but not in 7.x) - #endif - } - - void DrawBackground (Rect*) override {} - - //============================================================================== - private: - AudioProcessor* const filter; - JucePlugInProcess* const process; - std::unique_ptr wrapper; - std::unique_ptr editorComp; - - void deleteEditorComp() - { - if (editorComp != nullptr || wrapper != nullptr) - { - JUCE_AUTORELEASEPOOL - { - PopupMenu::dismissAllActiveMenus(); - - if (Component* const modalComponent = Component::getCurrentlyModalComponent()) - modalComponent->exitModalState (0); - - filter->editorBeingDeleted (editorComp.get()); - - editorComp.reset(); - wrapper.reset(); - } - } - } - - //============================================================================== - // A component to hold the AudioProcessorEditor, and cope with some housekeeping - // chores when it changes or repaints. - class EditorCompWrapper : public Component - #if ! JUCE_MAC - , public FocusChangeListener - #endif - { - public: - EditorCompWrapper (void* hostWindow_, - Component* editorComp, - JuceCustomUIView* owner_) - : hostWindow (hostWindow_), - owner (owner_), - titleW (0), - titleH (0) - { - #if ! JucePlugin_EditorRequiresKeyboardFocus - setMouseClickGrabsKeyboardFocus (false); - setWantsKeyboardFocus (false); - #endif - setOpaque (true); - setBroughtToFrontOnMouseClick (true); - setBounds (editorComp->getBounds()); - editorComp->setTopLeftPosition (0, 0); - addAndMakeVisible (*editorComp); - - #if JUCE_WINDOWS - attachSubWindow (hostWindow, titleW, titleH, this); - #else - nsWindow = attachSubWindow (hostWindow, this); - #endif - setVisible (true); - - #if JUCE_WINDOWS && ! JucePlugin_EditorRequiresKeyboardFocus - Desktop::getInstance().addFocusChangeListener (this); - #endif - } - - ~EditorCompWrapper() - { - removeChildComponent (getEditor()); - - #if JUCE_WINDOWS && ! JucePlugin_EditorRequiresKeyboardFocus - Desktop::getInstance().removeFocusChangeListener (this); - #endif - - #if JUCE_MAC - removeSubWindow (nsWindow, this); - #endif - } - - void paint (Graphics&) override {} - - void resized() override - { - if (Component* const ed = getEditor()) - ed->setBounds (getLocalBounds()); - - repaint(); - } - - #if JUCE_WINDOWS - void globalFocusChanged (Component*) override - { - #if ! JucePlugin_EditorRequiresKeyboardFocus - if (hasKeyboardFocus (true)) - passFocusToHostWindow (hostWindow); - #endif - } - #endif - - void childBoundsChanged (Component* child) override - { - setSize (child->getWidth(), child->getHeight()); - child->setTopLeftPosition (0, 0); - - #if JUCE_WINDOWS - resizeHostWindow (hostWindow, titleW, titleH, this); - #endif - owner->updateSize(); - } - - void userTriedToCloseWindow() override {} - - #if JUCE_MAC && JucePlugin_EditorRequiresKeyboardFocus - bool keyPressed (const KeyPress& kp) override - { - owner->updateSize(); - forwardCurrentKeyEventToHostWindow(); - return true; - } - #endif - - private: - //============================================================================== - void* const hostWindow; - void* nsWindow; - JuceCustomUIView* const owner; - int titleW, titleH; - - Component* getEditor() const { return getChildComponent (0); } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EditorCompWrapper) - }; - }; - - JuceCustomUIView* getView() const - { - return dynamic_cast (fOurPlugInView); - } - - void GetViewRect (Rect* size) override - { - if (JuceCustomUIView* const v = getView()) - v->updateSize(); - - CEffectProcessRTAS::GetViewRect (size); - } - - CPlugInView* CreateCPlugInView() override - { - return new JuceCustomUIView (juceFilter.get(), this); - } - - void SetViewPort (GrafPtr port) override - { - CEffectProcessRTAS::SetViewPort (port); - - if (JuceCustomUIView* const v = getView()) - v->attachToWindow (port); - } - - //============================================================================== - ComponentResult GetDelaySamplesLong (long* aNumSamples) override - { - if (aNumSamples != nullptr) - *aNumSamples = juceFilter != nullptr ? juceFilter->getLatencySamples() : 0; - - return noErr; - } - - //============================================================================== - void EffectInit() override - { - sampleRate = (double) GetSampleRate(); - jassert (sampleRate > 0); - const int maxBlockSize = (int) CEffectProcessRTAS::GetMaximumRTASQuantum(); - jassert (maxBlockSize > 0); - - SFicPlugInStemFormats stems; - GetProcessType()->GetStemFormats (&stems); - - juceFilter->setPlayConfigDetails (fNumInputs, fNumOutputs, sampleRate, maxBlockSize); - - AddControl (new CPluginControl_OnOff ('bypa', "Master Bypass\nMastrByp\nMByp\nByp", false, true)); - DefineMasterBypassControlIndex (bypassControlIndex); - - const int numParameters = juceFilter->getNumParameters(); - - #if JUCE_FORCE_USE_LEGACY_PARAM_IDS - const bool usingManagedParameters = false; - #else - const bool usingManagedParameters = (juceFilter->getParameters().size() == numParameters); - #endif - - for (int i = 0; i < numParameters; ++i) - { - OSType rtasParamID = static_cast (usingManagedParameters ? juceFilter->getParameterID (i).hashCode() : i); - AddControl (new JucePluginControl (*juceFilter, i, rtasParamID)); - } - - // we need to do this midi log-in to get timecode, regardless of whether - // the plugin actually uses midi... - if (MIDILogIn() == noErr) - { - #if JucePlugin_WantsMidiInput - if (CEffectType* const type = dynamic_cast (this->GetProcessType())) - { - char nodeName[80] = { 0 }; - type->GetProcessTypeName (63, nodeName); - nodeName[nodeName[0] + 1] = 0; - - midiBufferNode.reset (new CEffectMIDIOtherBufferedNode (&mMIDIWorld, - 8192, - eLocalNode, - nodeName + 1, - midiBuffer)); - - midiBufferNode->Initialize (0xffff, true); - } - #endif - } - - midiTransport.reset (new CEffectMIDITransport (&mMIDIWorld)); - midiEvents.ensureSize (2048); - - channels.calloc (jmax (juceFilter->getTotalNumInputChannels(), - juceFilter->getTotalNumOutputChannels())); - - juceFilter->setPlayHead (this); - juceFilter->addListener (this); - - juceFilter->prepareToPlay (sampleRate, maxBlockSize); - } - - void RenderAudio (float** inputs, float** outputs, long numSamples) override - { - #if JucePlugin_WantsMidiInput - midiEvents.clear(); - - const Cmn_UInt32 bufferSize = mRTGlobals->mHWBufferSizeInSamples; - - if (midiBufferNode != nullptr) - { - if (midiBufferNode->GetAdvanceScheduleTime() != bufferSize) - midiBufferNode->SetAdvanceScheduleTime (bufferSize); - - if (midiBufferNode->FillMIDIBuffer (mRTGlobals->mRunningTime, numSamples) == noErr) - { - jassert (midiBufferNode->GetBufferPtr() != nullptr); - const int numMidiEvents = midiBufferNode->GetBufferSize(); - - for (int i = 0; i < numMidiEvents; ++i) - { - const DirectMidiPacket& m = midiBuffer[i]; - - jassert ((int) m.mTimestamp < numSamples); - - midiEvents.addEvent (m.mData, m.mLength, - jlimit (0, (int) numSamples - 1, (int) m.mTimestamp)); - } - } - } - #endif - - #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS - const int numMidiEventsComingIn = midiEvents.getNumEvents(); - ignoreUnused (numMidiEventsComingIn); - #endif - - { - const ScopedLock sl (juceFilter->getCallbackLock()); - - const int numIn = juceFilter->getTotalNumInputChannels(); - const int numOut = juceFilter->getTotalNumOutputChannels(); - const int totalChans = jmax (numIn, numOut); - - if (juceFilter->isSuspended()) - { - for (int i = 0; i < numOut; ++i) - FloatVectorOperations::clear (outputs [i], numSamples); - } - else - { - { - int i; - for (i = 0; i < numOut; ++i) - { - channels[i] = outputs [i]; - - if (i < numIn && inputs != outputs) - FloatVectorOperations::copy (outputs [i], inputs[i], numSamples); - } - - for (; i < numIn; ++i) - channels [i] = inputs [i]; - } - - AudioBuffer chans (channels, totalChans, numSamples); - - if (mBypassed) - juceFilter->processBlockBypassed (chans, midiEvents); - else - juceFilter->processBlock (chans, midiEvents); - } - } - - if (! midiEvents.isEmpty()) - { - #if JucePlugin_ProducesMidiOutput - for (const auto metadata : midiEvents) - { - //jassert (metadata.samplePosition >= 0 && metadata.samplePosition < (int) numSamples); - } - #elif JUCE_DEBUG || JUCE_LOG_ASSERTIONS - // if your plugin creates midi messages, you'll need to set - // the JucePlugin_ProducesMidiOutput macro to 1 in your - // JucePluginCharacteristics.h file - jassert (midiEvents.getNumEvents() <= numMidiEventsComingIn); - #endif - - midiEvents.clear(); - } - } - - //============================================================================== - ComponentResult GetChunkSize (OSType chunkID, long* size) override - { - if (chunkID == juceChunkType) - { - tempFilterData.reset(); - juceFilter->getStateInformation (tempFilterData); - - *size = sizeof (SFicPlugInChunkHeader) + tempFilterData.getSize(); - return noErr; - } - - return CEffectProcessMIDI::GetChunkSize (chunkID, size); - } - - ComponentResult GetChunk (OSType chunkID, SFicPlugInChunk* chunk) override - { - if (chunkID == juceChunkType) - { - if (tempFilterData.getSize() == 0) - juceFilter->getStateInformation (tempFilterData); - - chunk->fSize = sizeof (SFicPlugInChunkHeader) + tempFilterData.getSize(); - tempFilterData.copyTo ((void*) chunk->fData, 0, tempFilterData.getSize()); - - tempFilterData.reset(); - - return noErr; - } - - return CEffectProcessMIDI::GetChunk (chunkID, chunk); - } - - ComponentResult SetChunk (OSType chunkID, SFicPlugInChunk* chunk) override - { - if (chunkID == juceChunkType) - { - tempFilterData.reset(); - - if (chunk->fSize - sizeof (SFicPlugInChunkHeader) > 0) - { - juceFilter->setStateInformation ((void*) chunk->fData, - chunk->fSize - sizeof (SFicPlugInChunkHeader)); - } - - return noErr; - } - - return CEffectProcessMIDI::SetChunk (chunkID, chunk); - } - - //============================================================================== - ComponentResult UpdateControlValue (long controlIndex, long value) override - { - if (controlIndex != bypassControlIndex) - { - auto paramIndex = controlIndex - 2; - auto floatValue = longToFloat (value); - - if (auto* param = juceFilter->getParameters()[paramIndex]) - { - param->setValue (floatValue); - param->sendValueChangedMessageToListeners (floatValue); - } - else - { - juceFilter->setParameter (paramIndex, floatValue); - } - } - else - { - mBypassed = (value > 0); - } - - return CProcess::UpdateControlValue (controlIndex, value); - } - - #if JUCE_WINDOWS - Boolean HandleKeystroke (EventRecord* e) override - { - if (Component* modalComp = Component::getCurrentlyModalComponent()) - { - if (Component* focused = modalComp->getCurrentlyFocusedComponent()) - { - switch (e->message & charCodeMask) - { - case kReturnCharCode: - case kEnterCharCode: focused->keyPressed (KeyPress (KeyPress::returnKey)); break; - case kEscapeCharCode: focused->keyPressed (KeyPress (KeyPress::escapeKey)); break; - default: break; - } - - return true; - } - } - - return false; - } - #endif - - //============================================================================== - bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) override - { - Cmn_Float64 bpm = 120.0; - Cmn_Int32 num = 4, denom = 4; - Cmn_Int64 ticks = 0; - Cmn_Bool isPlaying = false; - - if (midiTransport != nullptr) - { - midiTransport->GetCurrentTempo (&bpm); - midiTransport->IsTransportPlaying (&isPlaying); - midiTransport->GetCurrentMeter (&num, &denom); - - // (The following is a work-around because GetCurrentTickPosition() doesn't work correctly). - Cmn_Int64 sampleLocation; - - if (isPlaying) - midiTransport->GetCurrentRTASSampleLocation (&sampleLocation); - else - midiTransport->GetCurrentTDMSampleLocation (&sampleLocation); - - midiTransport->GetCustomTickPosition (&ticks, sampleLocation); - - info.timeInSamples = (int64) sampleLocation; - info.timeInSeconds = sampleLocation / sampleRate; - } - else - { - info.timeInSamples = 0; - info.timeInSeconds = 0; - } - - info.bpm = bpm; - info.timeSigNumerator = num; - info.timeSigDenominator = denom; - info.isPlaying = isPlaying; - info.isRecording = false; - info.ppqPosition = ticks / 960000.0; - info.ppqPositionOfLastBarStart = 0; //xxx no idea how to get this correctly.. - info.isLooping = false; - info.ppqLoopStart = 0; - info.ppqLoopEnd = 0; - - info.frameRate = [this] - { - switch (fTimeCodeInfo.mFrameRate) - { - case ficFrameRate_24Frame: return FrameRate().withBaseRate (24); - case ficFrameRate_23976: return FrameRate().withBaseRate (24).withPullDown(); - case ficFrameRate_25Frame: return FrameRate().withBaseRate (25); - case ficFrameRate_30NonDrop: return FrameRate().withBaseRate (30); - case ficFrameRate_30DropFrame: return FrameRate().withBaseRate (30).withDrop(); - case ficFrameRate_2997NonDrop: return FrameRate().withBaseRate (30).withPullDown(); - case ficFrameRate_2997DropFrame: return FrameRate().withBaseRate (30).withPullDown().withDrop(); - } - - return FrameRate(); - }(); - - const auto effectiveRate = info.frameRate.getEffectiveRate(); - info.editOriginTime = effectiveRate != 0.0 ? fTimeCodeInfo.mFrameOffset / effectiveRate : 0.0; - - return true; - } - - void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) override - { - SetControlValue (index + 2, floatToLong (newValue)); - } - - void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) override - { - TouchControl (index + 2); - } - - void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) override - { - ReleaseControl (index + 2); - } - - void audioProcessorChanged (AudioProcessor*, const ChangeDetails&) override - { - // xxx is there an RTAS equivalent? - } - -private: - std::unique_ptr juceFilter; - MidiBuffer midiEvents; - std::unique_ptr midiBufferNode; - std::unique_ptr midiTransport; - DirectMidiPacket midiBuffer [midiBufferSize]; - - juce::MemoryBlock tempFilterData; - HeapBlock channels; - double sampleRate = 44100.0; - - static float longToFloat (const long n) noexcept - { - return (float) ((((double) n) + (double) 0x80000000) / (double) 0xffffffff); - } - - static long floatToLong (const float n) noexcept - { - return roundToInt (jlimit (-(double) 0x80000000, (double) 0x7fffffff, - n * (double) 0xffffffff - (double) 0x80000000)); - } - - void bypassBuffers (float** const inputs, float** const outputs, const long numSamples) const - { - for (int i = fNumOutputs; --i >= 0;) - { - if (i < fNumInputs) - FloatVectorOperations::copy (outputs[i], inputs[i], numSamples); - else - FloatVectorOperations::clear (outputs[i], numSamples); - } - } - - //============================================================================== - class JucePluginControl : public CPluginControl - { - public: - //============================================================================== - JucePluginControl (AudioProcessor& p, const int i, OSType rtasParamID) - : processor (p), index (i), paramID (rtasParamID) - { - CPluginControl::SetValue (GetDefaultValue()); - } - - //============================================================================== - OSType GetID() const { return paramID; } - long GetDefaultValue() const { return floatToLong (processor.getParameterDefaultValue (index)); } - void SetDefaultValue (long) {} - long GetNumSteps() const { return processor.getParameterNumSteps (index); } - - long ConvertStringToValue (const char* valueString) const - { - return floatToLong (String (valueString).getFloatValue()); - } - - Cmn_Bool IsKeyValid (long key) const { return true; } - - void GetNameOfLength (char* name, int maxLength, OSType inControllerType) const - { - // Pro-tools expects all your parameters to have valid names! - jassert (processor.getParameterName (index, maxLength).isNotEmpty()); - - processor.getParameterName (index, maxLength).copyToUTF8 (name, (size_t) maxLength + 1); - } - - long GetPriority() const { return kFicCooperativeTaskPriority; } - - long GetOrientation() const - { - return processor.isParameterOrientationInverted (index) - ? kDAE_RightMinLeftMax | kDAE_TopMinBottomMax | kDAE_RotarySingleDotMode | kDAE_RotaryRightMinLeftMax - : kDAE_LeftMinRightMax | kDAE_BottomMinTopMax | kDAE_RotarySingleDotMode | kDAE_RotaryLeftMinRightMax; - } - - long GetControlType() const { return kDAE_ContinuousValues; } - - void GetValueString (char* valueString, int maxLength, long value) const - { - processor.getParameterText (index, maxLength).copyToUTF8 (valueString, (size_t) maxLength + 1); - } - - Cmn_Bool IsAutomatable() const - { - return processor.isParameterAutomatable (index); - } - - private: - //============================================================================== - AudioProcessor& processor; - const int index; - const OSType paramID; - - JUCE_DECLARE_NON_COPYABLE (JucePluginControl) - }; -}; - -//============================================================================== -class JucePlugInGroup : public CEffectGroupMIDI -{ -public: - //============================================================================== - JucePlugInGroup() - { - DefineManufacturerNamesAndID (JucePlugin_Manufacturer, JucePlugin_RTASManufacturerCode); - DefinePlugInNamesAndVersion (createRTASName().toUTF8(), JucePlugin_VersionCode); - - #if JUCE_RTAS_PLUGINGESTALT_IS_CACHEABLE - AddGestalt (pluginGestalt_IsCacheable); - #endif - } - - ~JucePlugInGroup() - { - shutdownJuce_GUI(); - } - - static AudioChannelSet rtasChannelSet (int numChannels) - { - if (numChannels == 0) return AudioChannelSet::disabled(); - if (numChannels == 1) return AudioChannelSet::mono(); - if (numChannels == 2) return AudioChannelSet::stereo(); - if (numChannels == 3) return AudioChannelSet::createLCR(); - if (numChannels == 4) return AudioChannelSet::quadraphonic(); - if (numChannels == 5) return AudioChannelSet::create5point0(); - if (numChannels == 6) return AudioChannelSet::create5point1(); - - #if PT_VERS_MAJOR >= 9 - if (numChannels == 7) return AudioChannelSet::create7point0(); - if (numChannels == 8) return AudioChannelSet::create7point1(); - #else - if (numChannels == 7) return AudioChannelSet::create7point0SDDS(); - if (numChannels == 8) return AudioChannelSet::create7point1SDDS(); - #endif - - jassertfalse; - - return AudioChannelSet::discreteChannels (numChannels); - } - - //============================================================================== - void CreateEffectTypes() - { - std::unique_ptr plugin (createPluginFilterOfType (AudioProcessor::wrapperType_RTAS)); - - #ifndef JucePlugin_PreferredChannelConfigurations - #error You need to set the "Plugin Channel Configurations" field in the Projucer to build RTAS plug-ins - #endif - - const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; - const int numConfigs = numElementsInArray (channelConfigs); - - // You need to actually add some configurations to the JucePlugin_PreferredChannelConfigurations - // value in your JucePluginCharacteristics.h file.. - jassert (numConfigs > 0); - - for (int i = 0; i < numConfigs; ++i) - { - if (channelConfigs[i][0] <= 8 && channelConfigs[i][1] <= 8) - { - const AudioChannelSet inputLayout (rtasChannelSet (channelConfigs[i][0])); - const AudioChannelSet outputLayout (rtasChannelSet (channelConfigs[i][1])); - - const int32 pluginId = plugin->getAAXPluginIDForMainBusConfig (inputLayout, outputLayout, false); - - CEffectType* const type - = new CEffectTypeRTAS (pluginId, - JucePlugin_RTASProductId, - JucePlugin_RTASCategory); - - type->DefineTypeNames (createRTASName().toRawUTF8()); - type->DefineSampleRateSupport (eSupports48kAnd96kAnd192k); - - type->DefineStemFormats (getFormatForChans (channelConfigs [i][0] != 0 ? channelConfigs [i][0] : channelConfigs [i][1]), - getFormatForChans (channelConfigs [i][1] != 0 ? channelConfigs [i][1] : channelConfigs [i][0])); - - #if ! JucePlugin_RTASDisableBypass - type->AddGestalt (pluginGestalt_CanBypass); - #endif - - #if JucePlugin_RTASDisableMultiMono - type->AddGestalt (pluginGestalt_DoesntSupportMultiMono); - #endif - - type->AddGestalt (pluginGestalt_SupportsVariableQuanta); - type->AttachEffectProcessCreator (createNewProcess); - - AddEffectType (type); - } - } - } - - void Initialize() - { - CEffectGroupMIDI::Initialize(); - } - - //============================================================================== -private: - static CEffectProcess* createNewProcess() - { - #if JUCE_WINDOWS - Process::setCurrentModuleInstanceHandle (gThisModule); - #endif - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_RTAS; - initialiseJuce_GUI(); - - return new JucePlugInProcess(); - } - - static String createRTASName() - { - return String (JucePlugin_Name) + "\n" - + String (JucePlugin_Desc); - } - - static EPlugIn_StemFormat getFormatForChans (const int numChans) noexcept - { - switch (numChans) - { - case 0: return ePlugIn_StemFormat_Generic; - case 1: return ePlugIn_StemFormat_Mono; - case 2: return ePlugIn_StemFormat_Stereo; - case 3: return ePlugIn_StemFormat_LCR; - case 4: return ePlugIn_StemFormat_Quad; - case 5: return ePlugIn_StemFormat_5dot0; - case 6: return ePlugIn_StemFormat_5dot1; - - #if PT_VERS_MAJOR >= 9 - case 7: return ePlugIn_StemFormat_7dot0DTS; - case 8: return ePlugIn_StemFormat_7dot1DTS; - #else - case 7: return ePlugIn_StemFormat_7dot0; - case 8: return ePlugIn_StemFormat_7dot1; - #endif - - default: jassertfalse; break; // hmm - not a valid number of chans for RTAS.. - } - - return ePlugIn_StemFormat_Generic; - } -}; - -void initialiseMacRTAS(); - -CProcessGroupInterface* CProcessGroup::CreateProcessGroup() -{ - #if JUCE_MAC - initialiseMacRTAS(); - #endif - - return new JucePlugInGroup(); -} - -JUCE_END_IGNORE_WARNINGS_MSVC - -#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -139,6 +139,8 @@ #if JucePlugin_Build_Standalone && JUCE_IOS +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") + using namespace juce; bool JUCE_CALLTYPE juce_isInterAppAudioConnected() @@ -162,6 +164,9 @@ return Image(); } + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + #endif #endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -448,11 +448,12 @@ inner.audioDeviceAboutToStart (device); } - void audioDeviceIOCallback (const float** inputChannelData, - int numInputChannels, - float** outputChannelData, - int numOutputChannels, - int numSamples) override + void audioDeviceIOCallbackWithContext (const float** inputChannelData, + int numInputChannels, + float** outputChannelData, + int numOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext& context) override { jassertquiet ((int) storedInputChannels.size() == numInputChannels); jassertquiet ((int) storedOutputChannels.size() == numOutputChannels); @@ -466,11 +467,12 @@ initChannelPointers (inputChannelData, storedInputChannels, position); initChannelPointers (outputChannelData, storedOutputChannels, position); - inner.audioDeviceIOCallback (storedInputChannels.data(), - (int) storedInputChannels.size(), - storedOutputChannels.data(), - (int) storedOutputChannels.size(), - blockLength); + inner.audioDeviceIOCallbackWithContext (storedInputChannels.data(), + (int) storedInputChannels.size(), + storedOutputChannels.data(), + (int) storedOutputChannels.size(), + blockLength, + context); position += blockLength; } @@ -598,11 +600,12 @@ }; //============================================================================== - void audioDeviceIOCallback (const float** inputChannelData, - int numInputChannels, - float** outputChannelData, - int numOutputChannels, - int numSamples) override + void audioDeviceIOCallbackWithContext (const float** inputChannelData, + int numInputChannels, + float** outputChannelData, + int numOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext& context) override { if (muteInput) { @@ -610,8 +613,12 @@ inputChannelData = emptyBuffer.getArrayOfReadPointers(); } - player.audioDeviceIOCallback (inputChannelData, numInputChannels, - outputChannelData, numOutputChannels, numSamples); + player.audioDeviceIOCallbackWithContext (inputChannelData, + numInputChannels, + outputChannelData, + numOutputChannels, + numSamples, + context); } void audioDeviceAboutToStart (AudioIODevice* device) override @@ -709,6 +716,8 @@ : DocumentWindow (title, backgroundColour, DocumentWindow::minimiseButton | DocumentWindow::closeButton), optionsButton ("Options") { + setConstrainer (&decoratorConstrainer); + #if JUCE_IOS || JUCE_ANDROID setTitleBarHeight (0); #else @@ -725,9 +734,9 @@ #if JUCE_IOS || JUCE_ANDROID setFullScreen (true); - setContentOwned (new MainContentComponent (*this), false); + updateContent(); #else - setContentOwned (new MainContentComponent (*this), true); + updateContent(); const auto windowScreenBounds = [this]() -> Rectangle { @@ -798,7 +807,7 @@ props->removeValue ("filterState"); pluginHolder->createPlugin(); - setContentOwned (new MainContentComponent (*this), true); + updateContent(); pluginHolder->startPlaying(); } @@ -839,6 +848,20 @@ std::unique_ptr pluginHolder; private: + void updateContent() + { + auto* content = new MainContentComponent (*this); + decoratorConstrainer.setMainContentComponent (content); + + #if JUCE_IOS || JUCE_ANDROID + constexpr auto resizeAutomatically = false; + #else + constexpr auto resizeAutomatically = true; + #endif + + setContentOwned (content, resizeAutomatically); + } + void buttonClicked (Button*) override { PopupMenu m; @@ -914,6 +937,29 @@ } } + ComponentBoundsConstrainer* getEditorConstrainer() const + { + if (auto* e = editor.get()) + return e->getConstrainer(); + + return nullptr; + } + + BorderSize computeBorder() const + { + const auto nativeFrame = [&]() -> BorderSize + { + if (auto* peer = owner.getPeer()) + if (const auto frameSize = peer->getFrameSizeIfPresent()) + return *frameSize; + + return {}; + }(); + + return nativeFrame.addedTo (owner.getContentComponentBorder()) + .addedTo (BorderSize { shouldShowNotification ? NotificationArea::height : 0, 0, 0, 0 }); + } + private: //============================================================================== class NotificationArea : public Component @@ -975,28 +1021,6 @@ { const int extraHeight = shouldShowNotification ? NotificationArea::height : 0; const auto rect = getSizeToContainEditor(); - - if (auto* editorConstrainer = editor->getConstrainer()) - { - const auto borders = owner.getContentComponentBorder(); - - const auto windowBorders = [&]() -> BorderSize - { - if (auto* peer = owner.getPeer()) - return peer->getFrameSize(); - - return {}; - }(); - - const auto extraWindowWidth = borders.getLeftAndRight() + windowBorders.getLeftAndRight(); - const auto extraWindowHeight = extraHeight + borders.getTopAndBottom() + windowBorders.getTopAndBottom(); - - owner.setResizeLimits (jmax (10, editorConstrainer->getMinimumWidth() + extraWindowWidth), - jmax (10, editorConstrainer->getMinimumHeight() + extraWindowHeight), - editorConstrainer->getMaximumWidth() + extraWindowWidth, - editorConstrainer->getMaximumHeight() + extraWindowHeight); - } - setSize (rect.getWidth(), rect.getHeight() + extraHeight); } #endif @@ -1045,8 +1069,80 @@ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent) }; + /* This custom constrainer checks with the AudioProcessorEditor (which might itself be + constrained) to ensure that any size we choose for the standalone window will be suitable + for the editor too. + + Without this constrainer, attempting to resize the standalone window may set bounds on the + peer that are unsupported by the inner editor. In this scenario, the peer will be set to a + 'bad' size, then the inner editor will be resized. The editor will check the new bounds with + its own constrainer, and may set itself to a more suitable size. After that, the resizable + window will see that its content component has changed size, and set the bounds of the peer + accordingly. The end result is that the peer is resized twice in a row to different sizes, + which can appear glitchy/flickery to the user. + */ + struct DecoratorConstrainer : public ComponentBoundsConstrainer + { + void checkBounds (Rectangle& bounds, + const Rectangle& previousBounds, + const Rectangle& limits, + bool isStretchingTop, + bool isStretchingLeft, + bool isStretchingBottom, + bool isStretchingRight) override + { + auto* decorated = contentComponent != nullptr ? contentComponent->getEditorConstrainer() + : nullptr; + + if (decorated != nullptr) + { + const auto border = contentComponent->computeBorder(); + const auto requestedBounds = bounds; + + border.subtractFrom (bounds); + decorated->checkBounds (bounds, + border.subtractedFrom (previousBounds), + limits, + isStretchingTop, + isStretchingLeft, + isStretchingBottom, + isStretchingRight); + border.addTo (bounds); + bounds = bounds.withPosition (requestedBounds.getPosition()); + + if (isStretchingTop && ! isStretchingBottom) + bounds = bounds.withBottomY (previousBounds.getBottom()); + + if (! isStretchingTop && isStretchingBottom) + bounds = bounds.withY (previousBounds.getY()); + + if (isStretchingLeft && ! isStretchingRight) + bounds = bounds.withRightX (previousBounds.getRight()); + + if (! isStretchingLeft && isStretchingRight) + bounds = bounds.withX (previousBounds.getX()); + } + else + { + ComponentBoundsConstrainer::checkBounds (bounds, + previousBounds, + limits, + isStretchingTop, + isStretchingLeft, + isStretchingBottom, + isStretchingRight); + } + } + + void setMainContentComponent (MainContentComponent* in) { contentComponent = in; } + + private: + MainContentComponent* contentComponent = nullptr; + }; + //============================================================================== TextButton optionsButton; + DecoratorConstrainer decoratorConstrainer; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StandaloneFilterWindow) }; diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/Unity/juce_UnityPluginInterface.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/Unity/juce_UnityPluginInterface.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/Unity/juce_UnityPluginInterface.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/Unity/juce_UnityPluginInterface.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -126,8 +126,8 @@ { ModifierKeys::currentModifiers = mods; - handleMouseEvent (juce::MouseInputSource::mouse, position, mods, juce::MouseInputSource::invalidPressure, - juce::MouseInputSource::invalidOrientation, juce::Time::currentTimeMillis()); + handleMouseEvent (juce::MouseInputSource::mouse, position, mods, juce::MouseInputSource::defaultPressure, + juce::MouseInputSource::defaultOrientation, juce::Time::currentTimeMillis()); } void forwardKeyPress (int code, String name, ModifierKeys mods) @@ -162,7 +162,9 @@ { ignoreUnused (mode); - bitmap.data = imageData + x * pixelStride + y * lineStride; + const auto offset = (size_t) x * (size_t) pixelStride + (size_t) y * (size_t) lineStride; + bitmap.data = imageData + offset; + bitmap.size = (size_t) (lineStride * height) - offset; bitmap.pixelFormat = pixelFormat; bitmap.lineStride = lineStride; bitmap.pixelStride = pixelStride; @@ -199,7 +201,7 @@ if (! ms.getCurrentModifiers().isLeftButtonDown()) owner.handleMouseEvent (juce::MouseInputSource::mouse, owner.globalToLocal (pos.toFloat()), {}, - juce::MouseInputSource::invalidPressure, juce::MouseInputSource::invalidOrientation, juce::Time::currentTimeMillis()); + juce::MouseInputSource::defaultPressure, juce::MouseInputSource::defaultOrientation, juce::Time::currentTimeMillis()); lastMousePos = pos; } @@ -270,6 +272,7 @@ bool isFocused() const override { return true; } void grabFocus() override {} void* getNativeHandle() const override { return nullptr; } + OptionalBorderSize getFrameSizeIfPresent() const override { return {}; } BorderSize getFrameSize() const override { return {}; } void setVisible (bool) override {} void setTitle (const String&) override {} @@ -283,7 +286,7 @@ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UnityPeer) }; -ComponentPeer* createUnityPeer (Component& c) { return new UnityPeer (c); } +static ComponentPeer* createUnityPeer (Component& c) { return new UnityPeer (c); } //============================================================================== class AudioProcessorUnityWrapper @@ -349,6 +352,11 @@ void process (float* inBuffer, float* outBuffer, int bufferSize, int numInChannels, int numOutChannels, bool isBypassed) { + // If the plugin has a bypass parameter, set it to the current bypass state + if (auto* param = pluginInstance->getBypassParameter()) + if (isBypassed != (param->getValue() >= 0.5f)) + param->setValueNotifyingHost (isBypassed ? 1.0f : 0.0f); + for (int pos = 0; pos < bufferSize;) { auto max = jmin (bufferSize - pos, samplesPerBlock); @@ -451,7 +459,7 @@ { MidiBuffer mb; - if (isBypassed) + if (isBypassed && pluginInstance->getBypassParameter() == nullptr) pluginInstance->processBlockBypassed (scratchBuffer, mb); else pluginInstance->processBlock (scratchBuffer, mb); @@ -485,7 +493,7 @@ }; //============================================================================== -HashMap& getWrapperMap() +static HashMap& getWrapperMap() { static HashMap wrapperMap; return wrapperMap; @@ -504,7 +512,7 @@ //============================================================================== namespace UnityCallbacks { - int UNITY_INTERFACE_API createCallback (UnityAudioEffectState* state) + static int UNITY_INTERFACE_API createCallback (UnityAudioEffectState* state) { auto* pluginInstance = new AudioProcessorUnityWrapper (false); pluginInstance->create (state); @@ -516,7 +524,7 @@ return 0; } - int UNITY_INTERFACE_API releaseCallback (UnityAudioEffectState* state) + static int UNITY_INTERFACE_API releaseCallback (UnityAudioEffectState* state) { auto* pluginInstance = state->getEffectData(); pluginInstance->release(); @@ -530,7 +538,7 @@ return 0; } - int UNITY_INTERFACE_API resetCallback (UnityAudioEffectState* state) + static int UNITY_INTERFACE_API resetCallback (UnityAudioEffectState* state) { auto* pluginInstance = state->getEffectData(); pluginInstance->reset(); @@ -538,14 +546,14 @@ return 0; } - int UNITY_INTERFACE_API setPositionCallback (UnityAudioEffectState* state, unsigned int pos) + static int UNITY_INTERFACE_API setPositionCallback (UnityAudioEffectState* state, unsigned int pos) { ignoreUnused (state, pos); return 0; } - int UNITY_INTERFACE_API setFloatParameterCallback (UnityAudioEffectState* state, int index, float value) + static int UNITY_INTERFACE_API setFloatParameterCallback (UnityAudioEffectState* state, int index, float value) { auto* pluginInstance = state->getEffectData(); pluginInstance->setParameter (index, value); @@ -553,7 +561,7 @@ return 0; } - int UNITY_INTERFACE_API getFloatParameterCallback (UnityAudioEffectState* state, int index, float* value, char* valueStr) + static int UNITY_INTERFACE_API getFloatParameterCallback (UnityAudioEffectState* state, int index, float* value, char* valueStr) { auto* pluginInstance = state->getEffectData(); *value = pluginInstance->getParameter (index); @@ -563,7 +571,7 @@ return 0; } - int UNITY_INTERFACE_API getFloatBufferCallback (UnityAudioEffectState* state, const char* name, float* buffer, int numSamples) + static int UNITY_INTERFACE_API getFloatBufferCallback (UnityAudioEffectState* state, const char* name, float* buffer, int numSamples) { ignoreUnused (numSamples); @@ -607,8 +615,8 @@ return 0; } - int UNITY_INTERFACE_API processCallback (UnityAudioEffectState* state, float* inBuffer, float* outBuffer, - unsigned int bufferSize, int numInChannels, int numOutChannels) + static int UNITY_INTERFACE_API processCallback (UnityAudioEffectState* state, float* inBuffer, float* outBuffer, + unsigned int bufferSize, int numInChannels, int numOutChannels) { auto* pluginInstance = state->getEffectData(); @@ -618,8 +626,7 @@ auto isMuted = ((state->flags & stateIsMuted) != 0); auto isPaused = ((state->flags & stateIsPaused) != 0); - auto bypassed = ! isPlaying || (isMuted || isPaused); - + const auto bypassed = ! isPlaying || (isMuted || isPaused); pluginInstance->process (inBuffer, outBuffer, static_cast (bufferSize), numInChannels, numOutChannels, bypassed); } else @@ -769,6 +776,8 @@ //============================================================================== #if JUCE_WINDOWS + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") + extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD reason, LPVOID) { if (reason == DLL_PROCESS_ATTACH) @@ -776,6 +785,8 @@ return true; } + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif #endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-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. - - ============================================================================== -*/ - -namespace juce -{ - -//============================================================================== -#if JUCE_SUPPORT_CARBON && JUCE_MAC_WINDOW_VISIBITY_BODGE - -/* When you wrap a WindowRef as an NSWindow, it seems to bugger up the HideWindow - function, so when the host tries (and fails) to hide the window, this stuff catches - the event and forces it to update. -*/ -static pascal OSStatus windowVisibilityBodge (EventHandlerCallRef, EventRef e, void* user) -{ - NSWindow* hostWindow = (NSWindow*) user; - - switch (GetEventKind (e)) - { - case kEventWindowInit: [hostWindow display]; break; - case kEventWindowShown: [hostWindow orderFront: nil]; break; - case kEventWindowHidden: [hostWindow orderOut: nil]; break; - } - - return eventNotHandledErr; -} - -inline void attachWindowHidingHooks (Component* comp, void* hostWindowRef, NSWindow* nsWindow) -{ - const EventTypeSpec eventsToCatch[] = - { - { kEventClassWindow, kEventWindowInit }, - { kEventClassWindow, kEventWindowShown }, - { kEventClassWindow, kEventWindowHidden } - }; - - EventHandlerRef ref; - InstallWindowEventHandler ((WindowRef) hostWindowRef, - NewEventHandlerUPP (windowVisibilityBodge), - GetEventTypeCount (eventsToCatch), eventsToCatch, - (void*) nsWindow, &ref); - - comp->getProperties().set ("carbonEventRef", String::toHexString ((pointer_sized_int) (void*) ref)); -} - -inline void removeWindowHidingHooks (Component* comp) -{ - if (comp != nullptr) - RemoveEventHandler ((EventHandlerRef) (void*) (pointer_sized_int) - comp->getProperties() ["carbonEventRef"].toString().getHexValue64()); -} - -#elif JUCE_MAC - inline void attachWindowHidingHooks (void*, void*, void*) {} - inline void removeWindowHidingHooks (void*) {} -#endif - -} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,10 +27,9 @@ // define all your plugin settings properly.. #if ! (JucePlugin_Build_VST || JucePlugin_Build_VST3 \ - || JucePlugin_Build_AU || JucePlugin_Build_AUv3 \ - ||JucePlugin_Build_RTAS || JucePlugin_Build_AAX \ - || JucePlugin_Build_Standalone || JucePlugin_Build_LV2 \ - || JucePlugin_Build_Unity) + || JucePlugin_Build_AU || JucePlugin_Build_AUv3 \ + || JucePlugin_Build_AAX || JucePlugin_Build_Standalone \ + || JucePlugin_Build_LV2 || JucePlugin_Build_Unity) #error "You need to enable at least one plugin format!" #endif @@ -68,16 +67,6 @@ #endif //============================================================================== -#if _WIN64 || (__LP64__ && (defined (__APPLE_CPP__) || defined (__APPLE_CC__))) - #undef JucePlugin_Build_RTAS - #define JucePlugin_Build_RTAS 0 -#endif - -//============================================================================== -#if JucePlugin_Build_LV2 && ! defined (JucePlugin_LV2URI) - #error "You need to define the JucePlugin_LV2URI value!" -#endif - #if JucePlugin_Build_AAX && ! defined (JucePlugin_AAXIdentifier) #error "You need to define the JucePlugin_AAXIdentifier value!" #endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -25,11 +25,6 @@ #pragma once -/** Somewhere in the codebase of your plugin, you need to implement this function - and make it return a new instance of the filter subclass that you're building. -*/ -juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter(); - namespace juce { @@ -42,6 +37,10 @@ // your createPluginFilter() method must return an object! jassert (pluginInstance != nullptr && pluginInstance->wrapperType == type); + #if JucePlugin_Enable_ARA + jassert (dynamic_cast (pluginInstance) != nullptr); + #endif + return pluginInstance; } diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -41,10 +41,6 @@ #include #include #elif JUCE_MAC || JUCE_IOS - #if ! (defined (JUCE_SUPPORT_CARBON) || defined (__LP64__)) - #define JUCE_SUPPORT_CARBON 1 - #endif - #ifdef __OBJC__ #if JUCE_MAC #include @@ -55,10 +51,6 @@ #endif #endif - #if JUCE_SUPPORT_CARBON && (! JUCE_IOS) - #include - #endif - #include #include #include diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_LinuxMessageThread.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_LinuxMessageThread.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_LinuxMessageThread.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_LinuxMessageThread.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -99,6 +99,35 @@ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MessageThread) }; +//============================================================================== +/** @internal */ +class HostDrivenEventLoop +{ +public: + HostDrivenEventLoop() + { + messageThread->stop(); + MessageManager::getInstance()->setCurrentThreadAsMessageThread(); + } + + void processPendingEvents() + { + MessageManager::getInstance()->setCurrentThreadAsMessageThread(); + + for (;;) + if (! dispatchNextMessageOnSystemQueue (true)) + return; + } + + ~HostDrivenEventLoop() + { + messageThread->start(); + } + +private: + SharedResourcePointer messageThread; +}; + } // namespace juce #endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,6 +35,7 @@ { #if JucePlugin_Build_Unity + bool juce_isRunningInUnity(); bool juce_isRunningInUnity() { return PluginHostType::getPluginLoadedAs() == AudioProcessor::wrapperType_Unity; } #endif @@ -131,6 +132,7 @@ #endif #if JucePlugin_Build_VST + bool JUCE_API handleManufacturerSpecificVST2Opcode (int32 index, pointer_sized_int value, void* ptr, float); bool JUCE_API handleManufacturerSpecificVST2Opcode (int32 index, pointer_sized_int value, void* ptr, float) { #if VST3_REPLACEMENT_AVAILABLE diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -361,7 +361,7 @@ jassert (isProcessing); // (tragically, some hosts actually need this, although it's stupid to have - // to do it here..) + // to do it here.) if (! isProcessing) resume(); @@ -396,6 +396,8 @@ } else { + updateCallbackContextInfo(); + int i; for (i = 0; i < numOut; ++i) { @@ -447,7 +449,7 @@ const int numChannels = jmax (numIn, numOut); AudioBuffer chans (tmpBuffers.channels, isMidiEffect ? 0 : numChannels, numSamples); - if (isBypassed) + if (isBypassed && processor->getBypassParameter() == nullptr) processor->processBlockBypassed (chans, midiEvents); else processor->processBlock (chans, midiEvents); @@ -596,49 +598,41 @@ } } - //============================================================================== - bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) override + void updateCallbackContextInfo() { const Vst2::VstTimeInfo* ti = nullptr; if (hostCallback != nullptr) { int32 flags = Vst2::kVstPpqPosValid | Vst2::kVstTempoValid - | Vst2::kVstBarsValid | Vst2::kVstCyclePosValid - | Vst2::kVstTimeSigValid | Vst2::kVstSmpteValid - | Vst2::kVstClockValid; + | Vst2::kVstBarsValid | Vst2::kVstCyclePosValid + | Vst2::kVstTimeSigValid | Vst2::kVstSmpteValid + | Vst2::kVstClockValid | Vst2::kVstNanosValid; auto result = hostCallback (&vstEffect, Vst2::audioMasterGetTime, 0, flags, nullptr, 0); ti = reinterpret_cast (result); } if (ti == nullptr || ti->sampleRate <= 0) - return false; - - info.bpm = (ti->flags & Vst2::kVstTempoValid) != 0 ? ti->tempo : 0.0; - - if ((ti->flags & Vst2::kVstTimeSigValid) != 0) { - info.timeSigNumerator = ti->timeSigNumerator; - info.timeSigDenominator = ti->timeSigDenominator; - } - else - { - info.timeSigNumerator = 4; - info.timeSigDenominator = 4; + currentPosition.reset(); + return; } - info.timeInSamples = (int64) (ti->samplePos + 0.5); - info.timeInSeconds = ti->samplePos / ti->sampleRate; - info.ppqPosition = (ti->flags & Vst2::kVstPpqPosValid) != 0 ? ti->ppqPos : 0.0; - info.ppqPositionOfLastBarStart = (ti->flags & Vst2::kVstBarsValid) != 0 ? ti->barStartPos : 0.0; + auto& info = currentPosition.emplace(); + info.setBpm ((ti->flags & Vst2::kVstTempoValid) != 0 ? makeOptional (ti->tempo) : nullopt); - std::tie (info.frameRate, info.editOriginTime) = [ti] - { - if ((ti->flags & Vst2::kVstSmpteValid) == 0) - return std::make_tuple (FrameRate(), 0.0); + info.setTimeSignature ((ti->flags & Vst2::kVstTimeSigValid) != 0 ? makeOptional (TimeSignature { ti->timeSigNumerator, ti->timeSigDenominator }) + : nullopt); - const auto rate = [&] + info.setTimeInSamples ((int64) (ti->samplePos + 0.5)); + info.setTimeInSeconds (ti->samplePos / ti->sampleRate); + info.setPpqPosition ((ti->flags & Vst2::kVstPpqPosValid) != 0 ? makeOptional (ti->ppqPos) : nullopt); + info.setPpqPositionOfLastBarStart ((ti->flags & Vst2::kVstBarsValid) != 0 ? makeOptional (ti->barStartPos) : nullopt); + + if ((ti->flags & Vst2::kVstSmpteValid) != 0) + { + info.setFrameRate ([&]() -> Optional { switch (ti->smpteFrameRate) { @@ -660,29 +654,27 @@ case Vst2::kVstSmpteFilm35mm: return FrameRate().withBaseRate (24); } - return FrameRate(); - }(); + return nullopt; + }()); + + const auto effectiveRate = info.getFrameRate().hasValue() ? info.getFrameRate()->getEffectiveRate() : 0.0; + info.setEditOriginTime (effectiveRate != 0.0 ? makeOptional (ti->smpteOffset / (80.0 * effectiveRate)) : nullopt); + } - const auto effectiveRate = rate.getEffectiveRate(); - return std::make_tuple (rate, effectiveRate != 0.0 ? ti->smpteOffset / (80.0 * effectiveRate) : 0.0); - }(); + info.setIsRecording ((ti->flags & Vst2::kVstTransportRecording) != 0); + info.setIsPlaying ((ti->flags & (Vst2::kVstTransportRecording | Vst2::kVstTransportPlaying)) != 0); + info.setIsLooping ((ti->flags & Vst2::kVstTransportCycleActive) != 0); - info.isRecording = (ti->flags & Vst2::kVstTransportRecording) != 0; - info.isPlaying = (ti->flags & (Vst2::kVstTransportRecording | Vst2::kVstTransportPlaying)) != 0; - info.isLooping = (ti->flags & Vst2::kVstTransportCycleActive) != 0; + info.setLoopPoints ((ti->flags & Vst2::kVstCyclePosValid) != 0 ? makeOptional (LoopPoints { ti->cycleStartPos, ti->cycleEndPos }) + : nullopt); - if ((ti->flags & Vst2::kVstCyclePosValid) != 0) - { - info.ppqLoopStart = ti->cycleStartPos; - info.ppqLoopEnd = ti->cycleEndPos; - } - else - { - info.ppqLoopStart = 0; - info.ppqLoopEnd = 0; - } + info.setHostTimeNs ((ti->flags & Vst2::kVstNanosValid) != 0 ? makeOptional ((uint64_t) ti->nanoSeconds) : nullopt); + } - return true; + //============================================================================== + Optional getPosition() const override + { + return currentPosition; } //============================================================================== @@ -737,7 +729,7 @@ void parameterValueChanged (int, float newValue) override { // this can only come from the bypass parameter - isBypassed = (newValue != 0.0f); + isBypassed = (newValue >= 0.5f); } void parameterGestureChanged (int, bool) override {} @@ -940,6 +932,7 @@ case Vst2::effSetProcessPrecision: return handleSetSampleFloatType (args); case Vst2::effGetNumMidiInputChannels: return handleGetNumMidiInputChannels(); case Vst2::effGetNumMidiOutputChannels: return handleGetNumMidiOutputChannels(); + case Vst2::effEditIdle: return handleEditIdle(); default: return 0; } } @@ -1020,6 +1013,10 @@ (Window) getWindowHandle(), (HostWindowType) hostWindow, 0, 0); + // The host is likely to attempt to move/resize the window directly after this call, + // and we need to ensure that the X server knows that our window has been attached + // before that happens. + X11Symbols::getInstance()->xFlush (display); #elif JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE checkHostWindowScaleFactor(); startTimer (500); @@ -1082,6 +1079,7 @@ void parentSizeChanged() override { updateWindowSize(); + repaint(); } void childBoundsChanged (Component*) override @@ -1106,41 +1104,11 @@ return {}; } - void updateWindowSize() - { - if (! resizingParent - && getEditorComp() != nullptr - && hostWindow != HostWindowType{}) - { - auto editorBounds = getSizeToContainChild(); - - resizeHostWindow (editorBounds.getWidth(), editorBounds.getHeight()); - - { - const ScopedValueSetter resizingParentSetter (resizingParent, true); - - #if JUCE_LINUX || JUCE_BSD // setSize() on linux causes renoise and energyxt to fail. - auto rect = convertToHostBounds ({ 0, 0, (int16) editorBounds.getHeight(), (int16) editorBounds.getWidth() }); - - X11Symbols::getInstance()->xResizeWindow (display, (Window) getWindowHandle(), - static_cast (rect.right - rect.left), - static_cast (rect.bottom - rect.top)); - #else - setSize (editorBounds.getWidth(), editorBounds.getHeight()); - #endif - } - - #if JUCE_MAC - resizeHostWindow (editorBounds.getWidth(), editorBounds.getHeight()); // (doing this a second time seems to be necessary in tracktion) - #endif - } - } - - void resizeHostWindow (int newWidth, int newHeight) + void resizeHostWindow (juce::Rectangle bounds) { - auto rect = convertToHostBounds ({ 0, 0, (int16) newHeight, (int16) newWidth }); - newWidth = rect.right - rect.left; - newHeight = rect.bottom - rect.top; + auto rect = convertToHostBounds ({ 0, 0, (int16) bounds.getHeight(), (int16) bounds.getWidth() }); + const auto newWidth = rect.right - rect.left; + const auto newHeight = rect.bottom - rect.top; bool sizeWasSuccessful = false; @@ -1212,6 +1180,12 @@ SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); #endif } + + #if JUCE_LINUX || JUCE_BSD + X11Symbols::getInstance()->xResizeWindow (display, (Window) getWindowHandle(), + static_cast (rect.right - rect.left), + static_cast (rect.bottom - rect.top)); + #endif } void setContentScaleFactor (float scale) @@ -1273,6 +1247,34 @@ #endif private: + void updateWindowSize() + { + if (! resizingParent + && getEditorComp() != nullptr + && hostWindow != HostWindowType{}) + { + const auto editorBounds = getSizeToContainChild(); + resizeHostWindow (editorBounds); + + { + const ScopedValueSetter resizingParentSetter (resizingParent, true); + + // setSize() on linux causes renoise and energyxt to fail. + // We'll resize our peer during resizeHostWindow() instead. + #if ! (JUCE_LINUX || JUCE_BSD) + setSize (editorBounds.getWidth(), editorBounds.getHeight()); + #endif + + if (auto* p = getPeer()) + p->updateBounds(); + } + + #if JUCE_MAC + resizeHostWindow (editorBounds); // (doing this a second time seems to be necessary in tracktion) + #endif + } + } + //============================================================================== static Vst2::ERect convertToHostBounds (const Vst2::ERect& rect) { @@ -1288,6 +1290,11 @@ } //============================================================================== + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer hostEventLoop; + #endif + + //============================================================================== JuceVSTWrapper& wrapper; bool resizingChild = false, resizingParent = false; @@ -1595,7 +1602,11 @@ pointer_sized_int handleGetEditorBounds (VstOpCodeArguments args) { checkWhetherMessageThreadIsCorrect(); + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer hostDrivenEventLoop; + #else const MessageManagerLock mmLock; + #endif createEditorComp(); if (editorComp != nullptr) @@ -1611,7 +1622,11 @@ pointer_sized_int handleOpenEditor (VstOpCodeArguments args) { checkWhetherMessageThreadIsCorrect(); + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer hostDrivenEventLoop; + #else const MessageManagerLock mmLock; + #endif jassert (! recursionCheck); startTimerHz (4); // performs misc housekeeping chores @@ -1631,8 +1646,15 @@ pointer_sized_int handleCloseEditor (VstOpCodeArguments) { checkWhetherMessageThreadIsCorrect(); + + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer hostDrivenEventLoop; + #else const MessageManagerLock mmLock; + #endif + deleteEditor (true); + return 0; } @@ -1644,14 +1666,17 @@ auto data = (void**) args.ptr; bool onlyStoreCurrentProgramData = (args.index != 0); - ScopedLock lock (stateInformationLock); - chunkMemory.reset(); + MemoryBlock block; if (onlyStoreCurrentProgramData) - processor->getCurrentProgramStateInformation (chunkMemory); + processor->getCurrentProgramStateInformation (block); else - processor->getStateInformation (chunkMemory); + processor->getStateInformation (block); + + // IMPORTANT! Don't call getStateInfo while holding this lock! + const ScopedLock lock (stateInformationLock); + chunkMemory = std::move (block); *data = (void*) chunkMemory.getData(); // because the chunk is only needed temporarily by the host (or at least you'd @@ -1670,18 +1695,18 @@ bool onlyRestoreCurrentProgramData = (args.index != 0); { - ScopedLock lock (stateInformationLock); + const ScopedLock lock (stateInformationLock); chunkMemory.reset(); chunkMemoryTime = 0; + } - if (byteSize > 0 && data != nullptr) - { - if (onlyRestoreCurrentProgramData) - processor->setCurrentProgramStateInformation (data, byteSize); - else - processor->setStateInformation (data, byteSize); - } + if (byteSize > 0 && data != nullptr) + { + if (onlyRestoreCurrentProgramData) + processor->setCurrentProgramStateInformation (data, byteSize); + else + processor->setStateInformation (data, byteSize); } } @@ -1800,10 +1825,10 @@ pointer_sized_int handleSetBypass (VstOpCodeArguments args) { - isBypassed = (args.value != 0); + isBypassed = args.value != 0; - if (auto* bypass = processor->getBypassParameter()) - bypass->setValueNotifyingHost (isBypassed ? 1.0f : 0.0f); + if (auto* param = processor->getBypassParameter()) + param->setValueNotifyingHost (isBypassed ? 1.0f : 0.0f); return 1; } @@ -1990,7 +2015,11 @@ pointer_sized_int handleSetContentScaleFactor (float scale) { checkWhetherMessageThreadIsCorrect(); + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer hostDrivenEventLoop; + #else const MessageManagerLock mmLock; + #endif #if ! JUCE_MAC if (! approximatelyEqual (scale, editorScaleFactor)) @@ -2055,6 +2084,16 @@ #endif } + pointer_sized_int handleEditIdle() + { + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer hostDrivenEventLoop; + hostDrivenEventLoop->processPendingEvents(); + #endif + + return 0; + } + //============================================================================== ScopedJuceInitialiser_GUI libraryInitialiser; @@ -2075,6 +2114,7 @@ Vst2::ERect editorRect; MidiBuffer midiEvents; VSTMidiEventList outgoingEvents; + Optional currentPosition; LegacyAudioParametersWrapper juceParameters; @@ -2114,17 +2154,13 @@ ScopedJuceInitialiser_GUI libraryInitialiser; #if JUCE_LINUX || JUCE_BSD - SharedResourcePointer messageThread; + SharedResourcePointer hostDrivenEventLoop; #endif try { if (audioMaster (nullptr, Vst2::audioMasterVersion, 0, 0, nullptr, 0) != 0) { - #if JUCE_LINUX || JUCE_BSD - MessageManagerLock mmLock; - #endif - std::unique_ptr processor { createPluginFilterOfType (AudioProcessor::wrapperType_VST) }; auto* processorPtr = processor.get(); auto* wrapper = new JuceVSTWrapper (audioMaster, std::move (processor)); @@ -2153,6 +2189,8 @@ #define JUCE_EXPORTED_FUNCTION extern "C" __attribute__ ((visibility("default"))) #endif +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") + //============================================================================== // Mac startup code.. #if JUCE_MAC @@ -2228,6 +2266,8 @@ } #endif +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + JUCE_END_IGNORE_WARNINGS_MSVC #endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm juce-7.0.0~ds0/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -31,11 +31,8 @@ #if JucePlugin_Build_VST || JucePlugin_Build_VST3 -#define JUCE_MAC_WINDOW_VISIBITY_BODGE 1 - #include "../utility/juce_IncludeSystemHeaders.h" #include "../utility/juce_IncludeModuleHeaders.h" -#include "../utility/juce_CarbonVisibility.h" //============================================================================== namespace juce @@ -160,8 +157,6 @@ [hostWindow orderFront: nil]; [pluginWindow orderFront: nil]; - attachWindowHidingHooks (comp, (WindowRef) parentWindowOrView, hostWindow); - return hostWindow; } #endif @@ -199,8 +194,6 @@ comp->getProperties() ["boundsEventRef"].toString().getHexValue64(); RemoveEventHandler (ref); - removeWindowHidingHooks (comp); - CFUniquePtr dummyView ((HIViewRef) (void*) (pointer_sized_int) comp->getProperties() ["dummyViewRef"].toString().getHexValue64()); diff -Nru juce-6.1.5~ds0/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp juce-7.0.0~ds0/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp --- juce-6.1.5~ds0/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -50,6 +50,7 @@ #include "../utility/juce_WindowsHooks.h" #include "../utility/juce_LinuxMessageThread.h" #include +#include #include #ifndef JUCE_VST3_CAN_REPLACE_VST2 @@ -77,15 +78,29 @@ #endif #if JUCE_LINUX || JUCE_BSD + #include "juce_events/native/juce_linux_EventLoopInternal.h" #include - - std::vector>> getFdReadCallbacks(); #endif #if JUCE_MAC #include #endif +//============================================================================== +#if JucePlugin_Enable_ARA + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE("-Wpragma-pack") + #include + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + #if ARA_SUPPORT_VERSION_1 + #error "Unsupported ARA version - only ARA version 2 and onward are supported by the current implementation" + #endif + + DEF_CLASS_IID(ARA::IPlugInEntryPoint) + DEF_CLASS_IID(ARA::IPlugInEntryPoint2) + DEF_CLASS_IID(ARA::IMainFactory) +#endif + namespace juce { @@ -104,20 +119,26 @@ #endif #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE - extern JUCE_API double getScaleFactorForWindow (HWND); + double getScaleFactorForWindow (HWND); #endif //============================================================================== #if JUCE_LINUX || JUCE_BSD -class EventHandler final : public Steinberg::Linux::IEventHandler +class EventHandler final : public Steinberg::Linux::IEventHandler, + private LinuxEventLoopInternal::Listener { public: - EventHandler() = default; + EventHandler() + { + LinuxEventLoopInternal::registerLinuxEventLoopListener (*this); + } - ~EventHandler() + ~EventHandler() override { - jassert (hostRunLoops.size() == 0); + jassert (hostRunLoops.empty()); + + LinuxEventLoopInternal::deregisterLinuxEventLoopListener (*this); if (! messageThread->isRunning()) messageThread->start(); @@ -133,11 +154,7 @@ void PLUGIN_API onFDIsSet (Steinberg::Linux::FileDescriptor fd) override { updateCurrentMessageThread(); - - auto it = fdCallbackMap.find (fd); - - if (it != fdCallbackMap.end()) - it->second (fd); + LinuxEventLoopInternal::invokeEventLoopCallbackForFd (fd); } //============================================================================== @@ -145,19 +162,7 @@ { if (auto* runLoop = getRunLoopFromFrame (plugFrame)) { - if (hostRunLoops.contains (runLoop)) - runLoop->unregisterEventHandler (this); - - hostRunLoops.add (runLoop); - - fdCallbackMap.clear(); - - for (auto& cb : getFdReadCallbacks()) - { - fdCallbackMap[cb.first] = cb.second; - runLoop->registerEventHandler (this, cb.first); - } - + refreshAttachedEventLoop ([this, runLoop] { hostRunLoops.insert (runLoop); }); updateCurrentMessageThread(); } } @@ -165,67 +170,58 @@ void unregisterHandlerForFrame (IPlugFrame* plugFrame) { if (auto* runLoop = getRunLoopFromFrame (plugFrame)) - { - hostRunLoops.remove (runLoop); - - if (! hostRunLoops.contains (runLoop)) - runLoop->unregisterEventHandler (this); - } + refreshAttachedEventLoop ([this, runLoop] { hostRunLoops.erase (runLoop); }); } private: - //============================================================================= - class HostRunLoopInterfaces + //============================================================================== + /* Connects all known FDs to a single host event loop instance. */ + class AttachedEventLoop { public: - HostRunLoopInterfaces() = default; + AttachedEventLoop() = default; - void add (Steinberg::Linux::IRunLoop* runLoop) + AttachedEventLoop (Steinberg::Linux::IRunLoop* loopIn, Steinberg::Linux::IEventHandler* handlerIn) + : loop (loopIn), handler (handlerIn) { - if (auto* refCountedRunLoop = find (runLoop)) - { - ++(refCountedRunLoop->refCount); - return; - } - - runLoops.push_back ({ runLoop, 1 }); + for (auto& fd : LinuxEventLoopInternal::getRegisteredFds()) + loop->registerEventHandler (handler, fd); } - void remove (Steinberg::Linux::IRunLoop* runLoop) + AttachedEventLoop (AttachedEventLoop&& other) noexcept { - if (auto* refCountedRunLoop = find (runLoop)) - if (--(refCountedRunLoop->refCount) == 0) - runLoops.erase (std::find (runLoops.begin(), runLoops.end(), runLoop)); + swap (other); } - size_t size() const noexcept { return runLoops.size(); } - bool contains (Steinberg::Linux::IRunLoop* runLoop) { return find (runLoop) != nullptr; } - - private: - struct RefCountedRunLoop + AttachedEventLoop& operator= (AttachedEventLoop&& other) noexcept { - Steinberg::Linux::IRunLoop* runLoop = nullptr; - int refCount = 0; + swap (other); + return *this; + } - bool operator== (const Steinberg::Linux::IRunLoop* other) const noexcept { return runLoop == other; } - }; + AttachedEventLoop (const AttachedEventLoop&) = delete; + AttachedEventLoop& operator= (const AttachedEventLoop&) = delete; - RefCountedRunLoop* find (const Steinberg::Linux::IRunLoop* runLoop) + ~AttachedEventLoop() { - auto iter = std::find (runLoops.begin(), runLoops.end(), runLoop); - - if (iter != runLoops.end()) - return &(*iter); + if (loop == nullptr) + return; - return nullptr; + loop->unregisterEventHandler (handler); } - std::vector runLoops; + private: + void swap (AttachedEventLoop& other) + { + std::swap (other.loop, loop); + std::swap (other.handler, handler); + } - JUCE_DECLARE_NON_MOVEABLE (HostRunLoopInterfaces) - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HostRunLoopInterfaces) + Steinberg::Linux::IRunLoop* loop = nullptr; + Steinberg::Linux::IEventHandler* handler = nullptr; }; + //============================================================================== static Steinberg::Linux::IRunLoop* getRunLoopFromFrame (IPlugFrame* plugFrame) { Steinberg::Linux::IRunLoop* runLoop = nullptr; @@ -248,12 +244,44 @@ } } + void fdCallbacksChanged() override + { + // The set of active FDs has changed, so deregister from the current event loop and then + // re-register the current set of FDs. + refreshAttachedEventLoop ([]{}); + } + + /* Deregisters from any attached event loop, updates the set of known event loops, and then + attaches all FDs to the first known event loop. + + The same event loop instance is shared between all plugin instances. Every time an event + loop is added or removed, this function should be called to register all FDs with a + suitable event loop. + + Note that there's no API to deregister a single FD for a given event loop. Instead, we must + deregister all FDs, and then register all known FDs again. + */ + template + void refreshAttachedEventLoop (Callback&& modifyKnownRunLoops) + { + // Deregister the old event loop. + // It's important to call the destructor from the old attached loop before calling the + // constructor of the new attached loop. + attachedEventLoop = AttachedEventLoop(); + + modifyKnownRunLoops(); + + // If we still know about an extant event loop, attach to it. + if (hostRunLoops.begin() != hostRunLoops.end()) + attachedEventLoop = AttachedEventLoop (*hostRunLoops.begin(), this); + } + SharedResourcePointer messageThread; std::atomic refCount { 1 }; - HostRunLoopInterfaces hostRunLoops; - std::unordered_map> fdCallbackMap; + std::multiset hostRunLoops; + AttachedEventLoop attachedEventLoop; //============================================================================== JUCE_DECLARE_NON_MOVEABLE (EventHandler) @@ -292,9 +320,9 @@ return {}; } -tresult extractResult (const QueryInterfaceResult& userInterface, - const InterfaceResultWithDeferredAddRef& juceInterface, - void** obj) +static tresult extractResult (const QueryInterfaceResult& userInterface, + const InterfaceResultWithDeferredAddRef& juceInterface, + void** obj) { if (userInterface.isOk() && juceInterface.isOk()) { @@ -526,7 +554,7 @@ if (bypassParameter == nullptr) { vst3WrapperProvidedBypassParam = true; - ownedBypassParameter.reset (new AudioParameterBool ("byps", "Bypass", false, {}, {}, {})); + ownedBypassParameter.reset (new AudioParameterBool ("byps", "Bypass", false)); bypassParameter = ownedBypassParameter.get(); } @@ -582,7 +610,7 @@ cachedParamValues = CachedParamValues { { vstParamIDs.begin(), vstParamIDs.end() } }; } - Vst::ParamID generateVSTParamIDForParam (AudioProcessorParameter* param) + Vst::ParamID generateVSTParamIDForParam (const AudioProcessorParameter* param) { auto juceParamID = LegacyAudioParameter::getParamID (param, false); @@ -638,14 +666,19 @@ public Vst::IMidiMapping, public Vst::IUnitInfo, public Vst::ChannelContext::IInfoListener, + #if JucePlugin_Enable_ARA + public Presonus::IPlugInViewEmbedding, + #endif public AudioProcessorListener, private ComponentRestarter::Listener { public: - JuceVST3EditController (Vst::IHostApplication* host) + explicit JuceVST3EditController (Vst::IHostApplication* host) { if (host != nullptr) host->queryInterface (FUnknown::iid, (void**) &hostContext); + + blueCatPatchwork |= isBlueCatHost (host); } //============================================================================== @@ -675,6 +708,8 @@ if (hostContext != context) hostContext = context; + blueCatPatchwork |= isBlueCatHost (context); + return kResultTrue; } @@ -916,6 +951,21 @@ } //============================================================================== + #if JucePlugin_Enable_ARA + Steinberg::TBool PLUGIN_API isViewEmbeddingSupported() override + { + if (auto* pluginInstance = getPluginInstance()) + return (Steinberg::TBool) dynamic_cast (pluginInstance)->isEditorView(); + return (Steinberg::TBool) false; + } + + Steinberg::tresult PLUGIN_API setViewIsEmbedded (Steinberg::IPlugView* /*view*/, Steinberg::TBool /*embedded*/) override + { + return kResultOk; + } + #endif + + //============================================================================== tresult PLUGIN_API setComponentState (IBStream* stream) override { if (! MessageManager::existsAndIsCurrentThread()) @@ -1174,19 +1224,19 @@ //============================================================================== void beginGesture (Vst::ParamID vstParamId) { - if (MessageManager::getInstance()->isThisTheMessageThread()) + if (! inSetState && MessageManager::getInstance()->isThisTheMessageThread()) beginEdit (vstParamId); } void endGesture (Vst::ParamID vstParamId) { - if (MessageManager::getInstance()->isThisTheMessageThread()) + if (! inSetState && MessageManager::getInstance()->isThisTheMessageThread()) endEdit (vstParamId); } void paramChanged (Steinberg::int32 parameterIndex, Vst::ParamID vstParamId, double newValue) { - if (inParameterChangedCallback) + if (inParameterChangedCallback || inSetState) return; if (MessageManager::getInstance()->isThisTheMessageThread()) @@ -1256,6 +1306,10 @@ auto latencySamples = pluginInstance->getLatencySamples(); + #if JucePlugin_Enable_ARA + jassert (latencySamples == 0 || ! dynamic_cast (pluginInstance)->isBoundToARA()); + #endif + if (details.latencyChanged && latencySamples != lastLatencySamples) { flags |= Vst::kLatencyChanged; @@ -1284,6 +1338,27 @@ static constexpr auto pluginShouldBeMarkedDirtyFlag = 1 << 16; private: + bool isBlueCatHost (FUnknown* context) const + { + // We can't use the normal PluginHostType mechanism here because that will give us the name + // of the host process. However, this plugin instance might be loaded in an instance of + // the BlueCat PatchWork host, which might itself be a plugin. + + VSTComSmartPtr host; + host.loadFrom (context); + + if (host == nullptr) + return false; + + Vst::String128 name; + + if (host->getName (name) != kResultOk) + return false; + + const auto hostName = toString (name); + return hostName.contains ("Blue Cat's VST3 Host"); + } + friend class JuceVST3Component; friend struct Param; @@ -1354,10 +1429,12 @@ std::vector> ownedParameterListeners; //============================================================================== + bool inSetState = false; std::atomic vst3IsPlaying { false }, inSetupProcessing { false }; int lastLatencySamples = 0; + bool blueCatPatchwork = isBlueCatHost (hostContext.get()); #if ! JUCE_MAC float lastScaleFactorReceived = 1.0f; @@ -1377,6 +1454,9 @@ UniqueBase{}, SharedBase{}, UniqueBase{}, + #if JucePlugin_Enable_ARA + UniqueBase{}, + #endif SharedBase{}); if (result.isOk()) @@ -1579,7 +1659,7 @@ Steinberg::IPlugView* viewIn) : processor (processorIn), editor (editorIn), componentHandler (handler), view (viewIn) {} - std::unique_ptr getContextMenuForParameterIndex (const AudioProcessorParameter* parameter) const override + std::unique_ptr getContextMenuForParameter (const AudioProcessorParameter* parameter) const override { if (componentHandler == nullptr || view == nullptr) return {}; @@ -1779,7 +1859,20 @@ { if (auto* editor = component->pluginEditor.get()) { - if (auto* constrainer = editor->getConstrainer()) + if (canResize() == kResultFalse) + { + // Ableton Live will call checkSizeConstraint even if the view returns false + // from canResize. Set the out param to an appropriate size for the editor + // and return. + auto constrainedRect = component->getLocalArea (editor, editor->getLocalBounds()) + .getSmallestIntegerContainer(); + + *rectToCheck = convertFromHostBounds (*rectToCheck); + rectToCheck->right = rectToCheck->left + roundToInt (constrainedRect.getWidth()); + rectToCheck->bottom = rectToCheck->top + roundToInt (constrainedRect.getHeight()); + *rectToCheck = convertToHostBounds (*rectToCheck); + } + else if (auto* constrainer = editor->getConstrainer()) { *rectToCheck = convertFromHostBounds (*rectToCheck); @@ -1943,6 +2036,12 @@ { pluginEditor.reset (plugin.createEditorIfNeeded()); + #if JucePlugin_Enable_ARA + jassert (dynamic_cast (pluginEditor.get()) != nullptr); + // for proper view embedding, ARA plug-ins must be resizable + jassert (pluginEditor->isResizable()); + #endif + if (pluginEditor != nullptr) { editorHostContext = std::make_unique (*owner.owner->audioProcessor, @@ -2051,9 +2150,9 @@ auto host = getHostType(); #if JUCE_MAC - if (host.isWavelab() || host.isReaper()) + if (host.isWavelab() || host.isReaper() || owner.owner->blueCatPatchwork) #else - if (host.isWavelab() || host.isAbletonLive() || host.isBitwigStudio()) + if (host.isWavelab() || host.isAbletonLive() || host.isBitwigStudio() || owner.owner->blueCatPatchwork) #endif setBounds (editorBounds.withPosition (0, 0)); } @@ -2185,17 +2284,50 @@ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3EditController) }; -namespace -{ - template struct AudioBusPointerHelper {}; - template <> struct AudioBusPointerHelper { static float** impl (Vst::AudioBusBuffers& data) noexcept { return data.channelBuffers32; } }; - template <> struct AudioBusPointerHelper { static double** impl (Vst::AudioBusBuffers& data) noexcept { return data.channelBuffers64; } }; - - template struct ChooseBufferHelper {}; - template <> struct ChooseBufferHelper { static AudioBuffer& impl (AudioBuffer& f, AudioBuffer& ) noexcept { return f; } }; - template <> struct ChooseBufferHelper { static AudioBuffer& impl (AudioBuffer& , AudioBuffer& d) noexcept { return d; } }; -} +//============================================================================== +#if JucePlugin_Enable_ARA + class JuceARAFactory : public ARA::IMainFactory + { + public: + JuceARAFactory() = default; + virtual ~JuceARAFactory() = default; + + JUCE_DECLARE_VST3_COM_REF_METHODS + + tresult PLUGIN_API queryInterface (const ::Steinberg::TUID targetIID, void** obj) override + { + const auto result = testForMultiple (*this, + targetIID, + UniqueBase{}, + UniqueBase{}); + + if (result.isOk()) + return result.extract (obj); + + if (doUIDsMatch (targetIID, JuceARAFactory::iid)) + { + addRef(); + *obj = this; + return kResultOk; + } + + *obj = nullptr; + return kNoInterface; + } + + //---from ARA::IMainFactory------- + const ARA::ARAFactory* PLUGIN_API getFactory() SMTG_OVERRIDE + { + return createARAFactory(); + } + static const FUID iid; + + private: + //============================================================================== + std::atomic refCount { 1 }; + }; +#endif //============================================================================== class JuceVST3Component : public Vst::IComponent, @@ -2203,18 +2335,22 @@ public Vst::IUnitInfo, public Vst::IConnectionPoint, public Vst::IProcessContextRequirements, + #if JucePlugin_Enable_ARA + public ARA::IPlugInEntryPoint, + public ARA::IPlugInEntryPoint2, + #endif public AudioPlayHead { public: JuceVST3Component (Vst::IHostApplication* h) - : pluginInstance (createPluginFilterOfType (AudioProcessor::wrapperType_VST3)), - host (h) + : pluginInstance (createPluginFilterOfType (AudioProcessor::wrapperType_VST3)), + host (h) { inParameterChangedCallback = false; #ifdef JucePlugin_PreferredChannelConfigurations short configs[][2] = { JucePlugin_PreferredChannelConfigurations }; - const int numConfigs = sizeof (configs) / sizeof (short[2]); + const int numConfigs = numElementsInArray (configs); ignoreUnused (numConfigs); jassert (numConfigs > 0 && (configs[0][0] > 0 || configs[0][1] > 0)); @@ -2272,6 +2408,8 @@ return extractResult (userProvidedInterface, juceProvidedInterface, obj); } + enum class CallPrepareToPlay { no, yes }; + //============================================================================== tresult PLUGIN_API initialize (FUnknown* hostContext) override { @@ -2279,7 +2417,7 @@ host.loadFrom (hostContext); processContext.sampleRate = processSetup.sampleRate; - preparePlugin (processSetup.sampleRate, (int) processSetup.maxSamplesPerBlock); + preparePlugin (processSetup.sampleRate, (int) processSetup.maxSamplesPerBlock, CallPrepareToPlay::no); return kResultTrue; } @@ -2337,12 +2475,11 @@ //============================================================================== tresult PLUGIN_API setActive (TBool state) override { + active = (state != 0); + if (! state) { getPluginInstance().releaseResources(); - - deallocateChannelListAndBuffers (channelListFloat, emptyBufferFloat); - deallocateChannelListAndBuffers (channelListDouble, emptyBufferDouble); } else { @@ -2357,10 +2494,7 @@ ? (int) processSetup.maxSamplesPerBlock : bufferSize; - allocateChannelListAndBuffers (channelListFloat, emptyBufferFloat); - allocateChannelListAndBuffers (channelListDouble, emptyBufferDouble); - - preparePlugin (sampleRate, bufferSize); + preparePlugin (sampleRate, bufferSize, CallPrepareToPlay::yes); } return kResultOk; @@ -2370,10 +2504,10 @@ tresult PLUGIN_API getRoutingInfo (Vst::RoutingInfo&, Vst::RoutingInfo&) override { return kNotImplemented; } //============================================================================== - bool isBypassed() + bool isBypassed() const { if (auto* bypassParam = comPluginInstance->getBypassParameter()) - return (bypassParam->getValue() != 0.0f); + return bypassParam->getValue() >= 0.5f; return false; } @@ -2433,6 +2567,10 @@ void setStateInformation (const void* data, int sizeAsInt) { + bool unusedState = false; + auto& flagToSet = juceVST3EditController != nullptr ? juceVST3EditController->inSetState : unusedState; + const ScopedValueSetter scope (flagToSet, true); + auto size = (uint64) sizeAsInt; // Check if this data was written with a newer JUCE version @@ -2636,6 +2774,10 @@ tresult PLUGIN_API setState (IBStream* state) override { + // The VST3 spec requires that this function is called from the UI thread. + // If this assertion fires, your host is misbehaving! + JUCE_ASSERT_MESSAGE_THREAD + if (state == nullptr) return kInvalidArgument; @@ -2726,34 +2868,50 @@ Steinberg::int32 channel, Vst::UnitID& unitId) override { return comPluginInstance->getUnitByBus (type, dir, busIndex, channel, unitId); } //============================================================================== - bool getCurrentPosition (CurrentPositionInfo& info) override + Optional getPosition() const override { - info.timeInSamples = jmax ((juce::int64) 0, processContext.projectTimeSamples); - info.timeInSeconds = static_cast (info.timeInSamples) / processContext.sampleRate; - info.bpm = jmax (1.0, processContext.tempo); - info.timeSigNumerator = jmax (1, (int) processContext.timeSigNumerator); - info.timeSigDenominator = jmax (1, (int) processContext.timeSigDenominator); - info.ppqPositionOfLastBarStart = processContext.barPositionMusic; - info.ppqPosition = processContext.projectTimeMusic; - info.ppqLoopStart = processContext.cycleStartMusic; - info.ppqLoopEnd = processContext.cycleEndMusic; - info.isRecording = (processContext.state & Vst::ProcessContext::kRecording) != 0; - info.isPlaying = (processContext.state & Vst::ProcessContext::kPlaying) != 0; - info.isLooping = (processContext.state & Vst::ProcessContext::kCycleActive) != 0; - - info.frameRate = [&] - { - if ((processContext.state & Vst::ProcessContext::kSmpteValid) == 0) - return FrameRate(); - - return FrameRate().withBaseRate ((int) processContext.frameRate.framesPerSecond) - .withDrop ((processContext.frameRate.flags & Vst::FrameRate::kDropRate) != 0) - .withPullDown ((processContext.frameRate.flags & Vst::FrameRate::kPullDownRate) != 0); - }(); + PositionInfo info; + info.setTimeInSamples (jmax ((juce::int64) 0, processContext.projectTimeSamples)); + info.setTimeInSeconds (static_cast (*info.getTimeInSamples()) / processContext.sampleRate); + info.setIsRecording ((processContext.state & Vst::ProcessContext::kRecording) != 0); + info.setIsPlaying ((processContext.state & Vst::ProcessContext::kPlaying) != 0); + info.setIsLooping ((processContext.state & Vst::ProcessContext::kCycleActive) != 0); + + info.setBpm ((processContext.state & Vst::ProcessContext::kTempoValid) != 0 + ? makeOptional (processContext.tempo) + : nullopt); + + info.setTimeSignature ((processContext.state & Vst::ProcessContext::kTimeSigValid) != 0 + ? makeOptional (TimeSignature { processContext.timeSigNumerator, processContext.timeSigDenominator }) + : nullopt); + + info.setLoopPoints ((processContext.state & Vst::ProcessContext::kCycleValid) != 0 + ? makeOptional (LoopPoints { processContext.cycleStartMusic, processContext.cycleEndMusic }) + : nullopt); + + info.setPpqPosition ((processContext.state & Vst::ProcessContext::kProjectTimeMusicValid) != 0 + ? makeOptional (processContext.projectTimeMusic) + : nullopt); + + info.setPpqPositionOfLastBarStart ((processContext.state & Vst::ProcessContext::kBarPositionValid) != 0 + ? makeOptional (processContext.barPositionMusic) + : nullopt); + + info.setFrameRate ((processContext.state & Vst::ProcessContext::kSmpteValid) != 0 + ? makeOptional (FrameRate().withBaseRate ((int) processContext.frameRate.framesPerSecond) + .withDrop ((processContext.frameRate.flags & Vst::FrameRate::kDropRate) != 0) + .withPullDown ((processContext.frameRate.flags & Vst::FrameRate::kPullDownRate) != 0)) + : nullopt); + + info.setEditOriginTime (info.getFrameRate().hasValue() + ? makeOptional ((double) processContext.smpteOffsetSubframes / (80.0 * info.getFrameRate()->getEffectiveRate())) + : nullopt); + + info.setHostTimeNs ((processContext.state & Vst::ProcessContext::kSystemTimeValid) != 0 + ? makeOptional ((uint64_t) processContext.systemTime) + : nullopt); - info.editOriginTime = (double) processContext.smpteOffsetSubframes / (80.0 * info.frameRate.getEffectiveRate()); - - return true; + return info; } //============================================================================== @@ -2763,7 +2921,7 @@ #ifdef JucePlugin_PreferredChannelConfigurations short configs[][2] = {JucePlugin_PreferredChannelConfigurations}; - const int numConfigs = sizeof (configs) / sizeof (short[2]); + const int numConfigs = numElementsInArray (configs); bool hasOnlyZeroChannels = true; @@ -2812,6 +2970,7 @@ info.mediaType = Vst::kAudio; info.direction = dir; info.channelCount = bus->getLastEnabledLayout().size(); + jassert (info.channelCount == Steinberg::Vst::SpeakerArr::getChannelCount (getVst3SpeakerArrangement (bus->getLastEnabledLayout()))); toString128 (info.name, bus->getName()); info.busType = [&] @@ -2893,8 +3052,14 @@ return kResultFalse; } - tresult PLUGIN_API activateBus (Vst::MediaType type, Vst::BusDirection dir, Steinberg::int32 index, TBool state) override + tresult PLUGIN_API activateBus (Vst::MediaType type, + Vst::BusDirection dir, + Steinberg::int32 index, + TBool state) override { + // The host is misbehaving! The plugin must be deactivated before setting new arrangements. + jassert (! active); + if (type == Vst::kEvent) { #if JucePlugin_WantsMidiInput @@ -2918,26 +3083,76 @@ if (type == Vst::kAudio) { - if (index < 0 || index >= getNumAudioBuses (dir == Vst::kInput)) + const auto numInputBuses = getNumAudioBuses (true); + const auto numOutputBuses = getNumAudioBuses (false); + + if (! isPositiveAndBelow (index, dir == Vst::kInput ? numInputBuses : numOutputBuses)) return kResultFalse; - if (auto* bus = pluginInstance->getBus (dir == Vst::kInput, index)) + // The host is allowed to enable/disable buses as it sees fit, so the plugin needs to be + // able to handle any set of enabled/disabled buses, including layouts for which + // AudioProcessor::isBusesLayoutSupported would return false. + // Our strategy is to keep track of the layout that the host last requested, and to + // attempt to apply that layout directly. + // If the layout isn't supported by the processor, we'll try enabling all the buses + // instead. + // If the host enables a bus that the processor refused to enable, then we'll ignore + // that bus (and return silence for output buses). If the host disables a bus that the + // processor refuses to disable, the wrapper will provide the processor with silence for + // input buses, and ignore the contents of output buses. + // Note that some hosts (old bitwig and cakewalk) may incorrectly call this function + // when the plugin is in an activated state. + if (dir == Vst::kInput) + bufferMapper.setInputBusHostActive ((size_t) index, state != 0); + else + bufferMapper.setOutputBusHostActive ((size_t) index, state != 0); + + AudioProcessor::BusesLayout desiredLayout; + + for (auto i = 0; i < numInputBuses; ++i) + desiredLayout.inputBuses.add (bufferMapper.getRequestedLayoutForInputBus ((size_t) i)); + + for (auto i = 0; i < numOutputBuses; ++i) + desiredLayout.outputBuses.add (bufferMapper.getRequestedLayoutForOutputBus ((size_t) i)); + + const auto prev = pluginInstance->getBusesLayout(); + + const auto busesLayoutSupported = [&] { #ifdef JucePlugin_PreferredChannelConfigurations - auto newLayout = pluginInstance->getBusesLayout(); - auto targetLayout = (state != 0 ? bus->getLastEnabledLayout() : AudioChannelSet::disabled()); - - (dir == Vst::kInput ? newLayout.inputBuses : newLayout.outputBuses).getReference (index) = targetLayout; + struct ChannelPair + { + short ins, outs; - short configs[][2] = { JucePlugin_PreferredChannelConfigurations }; - auto compLayout = pluginInstance->getNextBestLayoutInLayoutList (newLayout, configs); + auto tie() const { return std::tie (ins, outs); } + bool operator== (ChannelPair x) const { return tie() == x.tie(); } + }; - if ((dir == Vst::kInput ? compLayout.inputBuses : compLayout.outputBuses).getReference (index) != targetLayout) - return kResultFalse; + const auto countChannels = [] (auto& range) + { + return std::accumulate (range.begin(), range.end(), (short) 0, [] (auto acc, auto set) + { + return acc + set.size(); + }); + }; + + const ChannelPair requested { countChannels (desiredLayout.inputBuses), + countChannels (desiredLayout.outputBuses) }; + const ChannelPair configs[] = { JucePlugin_PreferredChannelConfigurations }; + return std::find (std::begin (configs), std::end (configs), requested) != std::end (configs); + #else + return pluginInstance->checkBusesLayoutSupported (desiredLayout); #endif + }(); - return bus->enable (state != 0) ? kResultTrue : kResultFalse; - } + if (busesLayoutSupported) + pluginInstance->setBusesLayout (desiredLayout); + else + pluginInstance->enableAllBuses(); + + bufferMapper.updateActiveClientBuses (pluginInstance->getBusesLayout()); + + return kResultTrue; } return kResultFalse; @@ -2970,6 +3185,13 @@ tresult PLUGIN_API setBusArrangements (Vst::SpeakerArrangement* inputs, Steinberg::int32 numIns, Vst::SpeakerArrangement* outputs, Steinberg::int32 numOuts) override { + if (active) + { + // The host is misbehaving! The plugin must be deactivated before setting new arrangements. + jassertfalse; + return kResultFalse; + } + auto numInputBuses = pluginInstance->getBusCount (true); auto numOutputBuses = pluginInstance->getBusCount (false); @@ -2990,7 +3212,11 @@ return kResultFalse; #endif - return pluginInstance->setBusesLayoutWithoutEnabling (requested) ? kResultTrue : kResultFalse; + if (! pluginInstance->setBusesLayoutWithoutEnabling (requested)) + return kResultFalse; + + bufferMapper.updateFromProcessor (*pluginInstance); + return kResultTrue; } tresult PLUGIN_API getBusArrangement (Vst::BusDirection dir, Steinberg::int32 index, Vst::SpeakerArrangement& arr) override @@ -3032,7 +3258,7 @@ : AudioProcessor::singlePrecision); getPluginInstance().setNonRealtime (newSetup.processMode == Vst::kOffline); - preparePlugin (processSetup.sampleRate, processSetup.maxSamplesPerBlock); + preparePlugin (processSetup.sampleRate, processSetup.maxSamplesPerBlock, CallPrepareToPlay::no); return kResultTrue; } @@ -3158,8 +3384,8 @@ // If all of these are zero, the host is attempting to flush parameters without processing audio. if (data.numSamples != 0 || data.numInputs != 0 || data.numOutputs != 0) { - if (processSetup.symbolicSampleSize == Vst::kSample32) processAudio (data, channelListFloat); - else if (processSetup.symbolicSampleSize == Vst::kSample64) processAudio (data, channelListDouble); + if (processSetup.symbolicSampleSize == Vst::kSample32) processAudio (data); + else if (processSetup.symbolicSampleSize == Vst::kSample64) processAudio (data); else jassertfalse; } @@ -3197,6 +3423,10 @@ UniqueBase{}, UniqueBase{}, UniqueBase{}, + #if JucePlugin_Enable_ARA + UniqueBase{}, + UniqueBase{}, + #endif SharedBase{}); if (result.isOk()) @@ -3230,131 +3460,13 @@ //============================================================================== template - void processAudio (Vst::ProcessData& data, Array& channelList) + void processAudio (Vst::ProcessData& data) { - int totalInputChans = 0, totalOutputChans = 0; - bool tmpBufferNeedsClearing = false; - - auto plugInInputChannels = pluginInstance->getTotalNumInputChannels(); - auto plugInOutputChannels = pluginInstance->getTotalNumOutputChannels(); - - // Wavelab workaround: wave-lab lies on the number of inputs/outputs so re-count here - const auto countValidChannels = [] (Vst::AudioBusBuffers* buffers, int32 num) - { - return int (std::distance (buffers, std::find_if (buffers, buffers + num, [] (Vst::AudioBusBuffers& buf) - { - return getPointerForAudioBus (buf) == nullptr && buf.numChannels > 0; - }))); - }; - - const auto vstInputs = countValidChannels (data.inputs, data.numInputs); - const auto vstOutputs = countValidChannels (data.outputs, data.numOutputs); - - { - auto n = jmax (vstOutputs, getNumAudioBuses (false)); - - for (int bus = 0; bus < n && totalOutputChans < plugInOutputChannels; ++bus) - { - if (auto* busObject = pluginInstance->getBus (false, bus)) - if (! busObject->isEnabled()) - continue; - - if (bus < vstOutputs) - { - if (auto** const busChannels = getPointerForAudioBus (data.outputs[bus])) - { - auto numChans = jmin ((int) data.outputs[bus].numChannels, plugInOutputChannels - totalOutputChans); - - for (int i = 0; i < numChans; ++i) - { - if (auto dst = busChannels[i]) - { - if (totalOutputChans >= plugInInputChannels) - FloatVectorOperations::clear (dst, (int) data.numSamples); - - channelList.set (totalOutputChans++, busChannels[i]); - } - } - } - } - else - { - const int numChans = jmin (pluginInstance->getChannelCountOfBus (false, bus), plugInOutputChannels - totalOutputChans); - - for (int i = 0; i < numChans; ++i) - { - if (auto* tmpBuffer = getTmpBufferForChannel (totalOutputChans, data.numSamples))\ - { - tmpBufferNeedsClearing = true; - channelList.set (totalOutputChans++, tmpBuffer); - } - else - return; - } - } - } - } - - { - auto n = jmax (vstInputs, getNumAudioBuses (true)); - - for (int bus = 0; bus < n && totalInputChans < plugInInputChannels; ++bus) - { - if (auto* busObject = pluginInstance->getBus (true, bus)) - if (! busObject->isEnabled()) - continue; - - if (bus < vstInputs) - { - if (auto** const busChannels = getPointerForAudioBus (data.inputs[bus])) - { - const int numChans = jmin ((int) data.inputs[bus].numChannels, plugInInputChannels - totalInputChans); - - for (int i = 0; i < numChans; ++i) - { - if (busChannels[i] != nullptr) - { - if (totalInputChans >= totalOutputChans) - channelList.set (totalInputChans, busChannels[i]); - else - { - auto* dst = channelList.getReference (totalInputChans); - auto* src = busChannels[i]; - - if (dst != src) - FloatVectorOperations::copy (dst, src, (int) data.numSamples); - } - } - - ++totalInputChans; - } - } - } - else - { - auto numChans = jmin (pluginInstance->getChannelCountOfBus (true, bus), plugInInputChannels - totalInputChans); - - for (int i = 0; i < numChans; ++i) - { - if (auto* tmpBuffer = getTmpBufferForChannel (totalInputChans, data.numSamples)) - { - tmpBufferNeedsClearing = true; - channelList.set (totalInputChans++, tmpBuffer); - } - else - return; - } - } - } - } - - if (tmpBufferNeedsClearing) - ChooseBufferHelper::impl (emptyBufferFloat, emptyBufferDouble).clear(); + ClientRemappedBuffer remappedBuffer { bufferMapper, data }; + auto& buffer = remappedBuffer.buffer; - AudioBuffer buffer; - - if (int totalChans = jmax (totalOutputChans, totalInputChans)) - buffer.setDataToReferTo (channelList.getRawDataPointer(), totalChans, (int) data.numSamples); + jassert ((int) buffer.getNumChannels() == jmax (pluginInstance->getTotalNumInputChannels(), + pluginInstance->getTotalNumOutputChannels())); { const ScopedLock sl (pluginInstance->getCallbackLock()); @@ -3371,14 +3483,12 @@ } else { - if (totalInputChans == pluginInstance->getTotalNumInputChannels() - && totalOutputChans == pluginInstance->getTotalNumOutputChannels()) - { - if (isBypassed()) - pluginInstance->processBlockBypassed (buffer, midiBuffer); - else - pluginInstance->processBlock (buffer, midiBuffer); - } + // processBlockBypassed should only ever be called if the AudioProcessor doesn't + // return a valid parameter from getBypassParameter + if (pluginInstance->getBypassParameter() == nullptr && comPluginInstance->getBypassParameter()->getValue() >= 0.5f) + pluginInstance->processBlockBypassed (buffer, midiBuffer); + else + pluginInstance->processBlock (buffer, midiBuffer); } #if JUCE_DEBUG && (! JucePlugin_ProducesMidiOutput) @@ -3402,44 +3512,6 @@ } //============================================================================== - template - void allocateChannelListAndBuffers (Array& channelList, AudioBuffer& buffer) - { - channelList.clearQuick(); - channelList.insertMultiple (0, nullptr, 128); - - auto& p = getPluginInstance(); - buffer.setSize (jmax (p.getTotalNumInputChannels(), p.getTotalNumOutputChannels()), p.getBlockSize() * 4); - buffer.clear(); - } - - template - void deallocateChannelListAndBuffers (Array& channelList, AudioBuffer& buffer) - { - channelList.clearQuick(); - channelList.resize (0); - buffer.setSize (0, 0); - } - - template - static FloatType** getPointerForAudioBus (Vst::AudioBusBuffers& data) noexcept - { - return AudioBusPointerHelper::impl (data); - } - - template - FloatType* getTmpBufferForChannel (int channel, int numSamples) noexcept - { - auto& buffer = ChooseBufferHelper::impl (emptyBufferFloat, emptyBufferDouble); - - // we can't do anything if the host requests to render many more samples than the - // block size, we need to bail out - if (numSamples > buffer.getNumSamples() || channel >= buffer.getNumChannels()) - return nullptr; - - return buffer.getWritePointer (channel); - } - Steinberg::uint32 PLUGIN_API getProcessContextRequirements() override { return kNeedSystemTime @@ -3455,18 +3527,44 @@ | kNeedTransportState; } - void preparePlugin (double sampleRate, int bufferSize) + void preparePlugin (double sampleRate, int bufferSize, CallPrepareToPlay callPrepareToPlay) { auto& p = getPluginInstance(); p.setRateAndBufferSizeDetails (sampleRate, bufferSize); - p.prepareToPlay (sampleRate, bufferSize); + + if (callPrepareToPlay == CallPrepareToPlay::yes) + p.prepareToPlay (sampleRate, bufferSize); midiBuffer.ensureSize (2048); midiBuffer.clear(); + + bufferMapper.updateFromProcessor (p); + bufferMapper.prepare (bufferSize); } //============================================================================== + #if JucePlugin_Enable_ARA + const ARA::ARAFactory* PLUGIN_API getFactory() SMTG_OVERRIDE + { + return createARAFactory(); + } + + const ARA::ARAPlugInExtensionInstance* PLUGIN_API bindToDocumentController (ARA::ARADocumentControllerRef /*controllerRef*/) SMTG_OVERRIDE + { + ARA_VALIDATE_API_STATE (false && "call is deprecated in ARA 2, host must not call this"); + return nullptr; + } + + const ARA::ARAPlugInExtensionInstance* PLUGIN_API bindToDocumentControllerWithRoles (ARA::ARADocumentControllerRef documentControllerRef, + ARA::ARAPlugInInstanceRoleFlags knownRoles, ARA::ARAPlugInInstanceRoleFlags assignedRoles) SMTG_OVERRIDE + { + AudioProcessorARAExtension* araAudioProcessorExtension = dynamic_cast (pluginInstance); + return araAudioProcessorExtension->bindToARA (documentControllerRef, knownRoles, assignedRoles); + } + #endif + + //============================================================================== ScopedJuceInitialiser_GUI libraryInitialiser; #if JUCE_LINUX || JUCE_BSD @@ -3481,7 +3579,9 @@ struct LockedVSTComSmartPtr { LockedVSTComSmartPtr() = default; - LockedVSTComSmartPtr (const VSTComSmartPtr& ptrIn) : ptr (ptrIn) {} + LockedVSTComSmartPtr (const VSTComSmartPtr& ptrIn) : ptr (ptrIn) {} + LockedVSTComSmartPtr (const LockedVSTComSmartPtr&) = default; + LockedVSTComSmartPtr& operator= (const LockedVSTComSmartPtr&) = default; ~LockedVSTComSmartPtr() { @@ -3489,7 +3589,7 @@ ptr = {}; } - T* operator->() { return ptr.operator->(); } + T* operator->() const { return ptr.operator->(); } T* get() const noexcept { return ptr.get(); } operator T*() const noexcept { return ptr.get(); } @@ -3517,11 +3617,9 @@ Vst::ProcessSetup processSetup; MidiBuffer midiBuffer; - Array channelListFloat; - Array channelListDouble; + ClientBufferMapper bufferMapper; - AudioBuffer emptyBufferFloat; - AudioBuffer emptyBufferDouble; + bool active = false; #if JucePlugin_WantsMidiInput std::atomic isMidiInputBusEnabled { true }; @@ -3564,6 +3662,11 @@ DEF_CLASS_IID (JuceVST3Component) #endif +#if JucePlugin_Enable_ARA + DECLARE_CLASS_IID (JuceARAFactory, 0xABCDEF01, 0xA1B2C3D4, JucePlugin_ManufacturerCode, JucePlugin_PluginCode) + DEF_CLASS_IID (JuceARAFactory) +#endif + JUCE_END_IGNORE_WARNINGS_MSVC JUCE_END_IGNORE_WARNINGS_GCC_LIKE @@ -3593,8 +3696,12 @@ #endif #if JUCE_WINDOWS + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") + extern "C" __declspec (dllexport) bool InitDll() { return initModule(); } extern "C" __declspec (dllexport) bool ExitDll() { return shutdownModule(); } + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE #elif JUCE_LINUX || JUCE_BSD void* moduleHandle = nullptr; int moduleEntryCounter = 0; @@ -3688,6 +3795,13 @@ return static_cast (new JuceVST3EditController (host)); } +#if JucePlugin_Enable_ARA + static FUnknown* createARAFactoryInstance (Vst::IHostApplication* /*host*/) + { + return static_cast (new JuceARAFactory()); + } +#endif + //============================================================================== struct JucePluginFactory; static JucePluginFactory* globalFactory = nullptr; @@ -3960,6 +4074,20 @@ kVstVersionString); globalFactory->registerClass (controllerClass, createControllerInstance); + + #if JucePlugin_Enable_ARA + static const PClassInfo2 araFactoryClass (JuceARAFactory::iid, + PClassInfo::kManyInstances, + kARAMainFactoryClass, + JucePlugin_Name, + JucePlugin_Vst3ComponentFlags, + JucePlugin_Vst3Category, + JucePlugin_Manufacturer, + JucePlugin_VersionString, + kVstVersionString); + + globalFactory->registerClass (araFactoryClass, createARAFactoryInstance); + #endif } else { @@ -3971,7 +4099,11 @@ //============================================================================== #if JUCE_WINDOWS +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") + extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD reason, LPVOID) { if (reason == DLL_PROCESS_ATTACH) Process::setCurrentModuleInstanceHandle (instance); return true; } + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif JUCE_END_NO_SANITIZE diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormat.h juce-7.0.0~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormat.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -137,6 +137,21 @@ */ virtual FileSearchPath getDefaultLocationsToSearch() = 0; + /** Returns true if instantiation of this plugin type must be done from a non-message thread. */ + virtual bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const = 0; + + /** A callback lambda that is passed to getARAFactory() */ + using ARAFactoryCreationCallback = std::function; + + /** Tries to create an ::ARAFactoryWrapper for this description. + + The result of the operation will be wrapped into an ARAFactoryResult, + which will be passed to a callback object supplied by the caller. + + @see AudioPluginFormatManager::createARAFactoryAsync + */ + virtual void createARAFactoryAsync (const PluginDescription&, ARAFactoryCreationCallback callback) { callback ({}); } + protected: //============================================================================== friend class AudioPluginFormatManager; @@ -149,9 +164,6 @@ virtual void createPluginInstance (const PluginDescription&, double initialSampleRate, int initialBufferSize, PluginCreationCallback) = 0; - /** Returns true if instantiation of this plugin type must be done from a non-message thread. */ - virtual bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const = 0; - private: struct AsyncCreateMessage; void handleMessage (const Message&) override; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -32,45 +32,83 @@ //============================================================================== void AudioPluginFormatManager::addDefaultFormats() { + #if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD || JUCE_IOS) + #define HAS_VST 1 + #else + #define HAS_VST 0 + #endif + + #if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD) + #define HAS_VST3 1 + #else + #define HAS_VST3 0 + #endif + + #if JUCE_PLUGINHOST_AU && (JUCE_MAC || JUCE_IOS) + #define HAS_AU 1 + #else + #define HAS_AU 0 + #endif + + #if JUCE_PLUGINHOST_LADSPA && (JUCE_LINUX || JUCE_BSD) + #define HAS_LADSPA 1 + #else + #define HAS_LADSPA 0 + #endif + + #if JUCE_PLUGINHOST_LV2 && (JUCE_MAC || JUCE_LINUX || JUCE_BSD || JUCE_WINDOWS) + #define HAS_LV2 1 + #else + #define HAS_LV2 0 + #endif + #if JUCE_DEBUG // you should only call this method once! for (auto* format : formats) { ignoreUnused (format); - #if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD || JUCE_IOS) + #if HAS_VST jassert (dynamic_cast (format) == nullptr); #endif - #if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD) + #if HAS_VST3 jassert (dynamic_cast (format) == nullptr); #endif - #if JUCE_PLUGINHOST_AU && (JUCE_MAC || JUCE_IOS) + #if HAS_AU jassert (dynamic_cast (format) == nullptr); #endif - #if JUCE_PLUGINHOST_LADSPA && (JUCE_LINUX || JUCE_BSD) + #if HAS_LADSPA jassert (dynamic_cast (format) == nullptr); #endif + + #if HAS_LV2 + jassert (dynamic_cast (format) == nullptr); + #endif } #endif - #if JUCE_PLUGINHOST_AU && (JUCE_MAC || JUCE_IOS) + #if HAS_AU formats.add (new AudioUnitPluginFormat()); #endif - #if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD || JUCE_IOS) + #if HAS_VST formats.add (new VSTPluginFormat()); #endif - #if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD) + #if HAS_VST3 formats.add (new VST3PluginFormat()); #endif - #if JUCE_PLUGINHOST_LADSPA && (JUCE_LINUX || JUCE_BSD) + #if HAS_LADSPA formats.add (new LADSPAPluginFormat()); #endif + + #if HAS_LV2 + formats.add (new LV2PluginFormat()); + #endif } int AudioPluginFormatManager::getNumFormats() const { return formats.size(); } @@ -98,6 +136,22 @@ return {}; } +void AudioPluginFormatManager::createARAFactoryAsync (const PluginDescription& description, + AudioPluginFormat::ARAFactoryCreationCallback callback) const +{ + String errorMessage; + + if (auto* format = findFormatForDescription (description, errorMessage)) + { + format->createARAFactoryAsync (description, callback); + } + else + { + errorMessage = NEEDS_TRANS ("Couldn't find format for the provided description"); + callback ({ {}, std::move (errorMessage) }); + } +} + void AudioPluginFormatManager::createPluginInstanceAsync (const PluginDescription& description, double initialSampleRate, int initialBufferSize, AudioPluginFormat::PluginCreationCallback callback) diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h juce-7.0.0~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -109,6 +109,22 @@ double initialSampleRate, int initialBufferSize, AudioPluginFormat::PluginCreationCallback callback); + /** Tries to create an ::ARAFactoryWrapper for this description. + + The result of the operation will be wrapped into an ARAFactoryResult, + which will be passed to a callback object supplied by the caller. + + The operation may fail, in which case the callback will be called with + with a result object where ARAFactoryResult::araFactory.get() will return + a nullptr. + + In case of success the returned ::ARAFactoryWrapper will ensure that + modules required for the correct functioning of the ARAFactory will remain + loaded for the lifetime of the object. + */ + void createARAFactoryAsync (const PluginDescription& description, + AudioPluginFormat::ARAFactoryCreationCallback callback) const; + /** Checks that the file or component for this plugin actually still exists. (This won't try to load the plugin) */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_ARACommon.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_ARACommon.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_ARACommon.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_ARACommon.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,76 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS)) + +#include + +namespace juce +{ + +static void dummyARAInterfaceAssert (ARA::ARAAssertCategory, const void*, const char*) +{} + +static ARA::ARAInterfaceConfiguration createInterfaceConfig (const ARA::ARAFactory* araFactory) +{ + static auto* assertFunction = &dummyARAInterfaceAssert; + + #if ARA_VALIDATE_API_CALLS + assertFunction = &::ARA::ARAInterfaceAssert; + static std::once_flag flag; + std::call_once (flag, [] { ARA::ARASetExternalAssertReference (&assertFunction); }); + #endif + + return makeARASizedStruct (&ARA::ARAInterfaceConfiguration::assertFunctionAddress, + jmin (araFactory->highestSupportedApiGeneration, (ARA::ARAAPIGeneration) ARA::kARAAPIGeneration_2_X_Draft), + &assertFunction); +} + +static std::shared_ptr getOrCreateARAFactory (const ARA::ARAFactory* ptr, + std::function onDelete) +{ + JUCE_ASSERT_MESSAGE_THREAD + + static std::unordered_map> cache; + + auto& cachePtr = cache[ptr]; + + if (const auto obj = cachePtr.lock()) + return obj; + + const auto interfaceConfig = createInterfaceConfig (ptr); + ptr->initializeARAWithConfiguration (&interfaceConfig); + const auto obj = std::shared_ptr (ptr, [deleter = std::move (onDelete)] (const ARA::ARAFactory* factory) + { + factory->uninitializeARA(); + deleter (factory); + }); + cachePtr = obj; + return obj; +} + +} + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_ARACommon.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_ARACommon.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_ARACommon.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_ARACommon.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,85 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#pragma once + +namespace ARA +{ + struct ARAFactory; +} + +namespace juce +{ + +/** Encapsulates an ARAFactory pointer and makes sure that it remains in a valid state + for the lifetime of the ARAFactoryWrapper object. + + @tags{ARA} +*/ +class ARAFactoryWrapper +{ +public: + ARAFactoryWrapper() = default; + + /** @internal + + Used by the framework to encapsulate ARAFactory pointers loaded from plugins. + */ + explicit ARAFactoryWrapper (std::shared_ptr factoryIn) : factory (std::move (factoryIn)) {} + + /** Returns the contained ARAFactory pointer, which can be a nullptr. + + The validity of the returned pointer is only guaranteed for the lifetime of this wrapper. + */ + const ARA::ARAFactory* get() const noexcept { return factory.get(); } + +private: + std::shared_ptr factory; +}; + +/** Represents the result of AudioPluginFormatManager::createARAFactoryAsync(). + + If the operation fails then #araFactory will contain `nullptr`, and #errorMessage may + contain a reason for the failure. + + The araFactory member ensures that the module necessary for the correct functioning + of the factory will remain loaded. + + @tags{ARA} +*/ +struct ARAFactoryResult +{ + ARAFactoryWrapper araFactory; + String errorMessage; +}; + +template +constexpr Obj makeARASizedStruct (Member Obj::* member, Ts&&... ts) +{ + return { reinterpret_cast (&(static_cast (nullptr)->*member)) + sizeof (Member), + std::forward (ts)... }; +} + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_ARAHosting.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_ARAHosting.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_ARAHosting.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_ARAHosting.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,458 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS)) + +#include "juce_ARAHosting.h" +#include + +#include + +namespace juce +{ +struct ARAEditGuardState +{ +public: + /* Returns true if this controller wasn't previously present. */ + bool add (ARA::Host::DocumentController& dc) + { + const std::lock_guard lock (mutex); + return ++counts[&dc] == 1; + } + + /* Returns true if this controller is no longer present. */ + bool remove (ARA::Host::DocumentController& dc) + { + const std::lock_guard lock (mutex); + return --counts[&dc] == 0; + } + +private: + std::map counts; + std::mutex mutex; +}; + +static ARAEditGuardState editGuardState; + +ARAEditGuard::ARAEditGuard (ARA::Host::DocumentController& dcIn) : dc (dcIn) +{ + if (editGuardState.add (dc)) + dc.beginEditing(); +} + +ARAEditGuard::~ARAEditGuard() +{ + if (editGuardState.remove (dc)) + dc.endEditing(); +} + +//============================================================================== +namespace ARAHostModel +{ + +//============================================================================== +AudioSource::AudioSource (ARA::ARAAudioSourceHostRef hostRef, + ARA::Host::DocumentController& dc, + const ARA::ARAAudioSourceProperties& props) + : ManagedARAHandle (dc, [&] + { + const ARAEditGuard guard (dc); + return dc.createAudioSource (hostRef, &props); + }()) +{ +} + +void AudioSource::update (const ARA::ARAAudioSourceProperties& props) +{ + const ARAEditGuard guard (getDocumentController()); + getDocumentController().updateAudioSourceProperties (getPluginRef(), &props); +} + +void AudioSource::enableAudioSourceSamplesAccess (bool x) +{ + const ARAEditGuard guard (getDocumentController()); + getDocumentController().enableAudioSourceSamplesAccess (getPluginRef(), x); +} + +void AudioSource::destroy (ARA::Host::DocumentController& dc, Ptr ptr) +{ + dc.destroyAudioSource (ptr); +} + +//============================================================================== +AudioModification::AudioModification (ARA::ARAAudioModificationHostRef hostRef, + ARA::Host::DocumentController& dc, + AudioSource& s, + const ARA::ARAAudioModificationProperties& props) + : ManagedARAHandle (dc, [&] + { + const ARAEditGuard guard (dc); + return dc.createAudioModification (s.getPluginRef(), hostRef, &props); + }()), + source (s) +{ +} + +void AudioModification::update (const ARA::ARAAudioModificationProperties& props) +{ + const ARAEditGuard guard (getDocumentController()); + getDocumentController().updateAudioModificationProperties (getPluginRef(), &props); +} + +void AudioModification::destroy (ARA::Host::DocumentController& dc, Ptr ptr) +{ + dc.destroyAudioModification (ptr); +} + +//============================================================================== +class PlaybackRegion::Impl : public ManagedARAHandle, + public DeletionListener +{ +public: + Impl (ARA::ARAPlaybackRegionHostRef hostRef, + ARA::Host::DocumentController& dc, + AudioModification& m, + const ARA::ARAPlaybackRegionProperties& props); + + ~Impl() override + { + for (const auto& l : listeners) + l->removeListener (*this); + } + + /* Updates the state of the corresponding %ARA model object. + + Places the DocumentController in editable state. + + You can use getEmptyProperties() to acquire a properties struct where the `structSize` + field has already been correctly set. + */ + void update (const ARA::ARAPlaybackRegionProperties& props); + + auto& getAudioModification() const { return modification; } + + static void destroy (ARA::Host::DocumentController&, Ptr); + + void addListener (DeletionListener& l) { listeners.insert (&l); } + void removeListener (DeletionListener& l) noexcept override { listeners.erase (&l); } + +private: + AudioModification* modification = nullptr; + std::unordered_set listeners; +}; + +PlaybackRegion::Impl::Impl (ARA::ARAPlaybackRegionHostRef hostRef, + ARA::Host::DocumentController& dc, + AudioModification& m, + const ARA::ARAPlaybackRegionProperties& props) + : ManagedARAHandle (dc, [&] + { + const ARAEditGuard guard (dc); + return dc.createPlaybackRegion (m.getPluginRef(), hostRef, &props); + }()), + modification (&m) +{ +} + +PlaybackRegion::~PlaybackRegion() = default; + +void PlaybackRegion::Impl::update (const ARA::ARAPlaybackRegionProperties& props) +{ + const ARAEditGuard guard (getDocumentController()); + getDocumentController().updatePlaybackRegionProperties (getPluginRef(), &props); +} + +void PlaybackRegion::Impl::destroy (ARA::Host::DocumentController& dc, Ptr ptr) +{ + dc.destroyPlaybackRegion (ptr); +} + +PlaybackRegion::PlaybackRegion (ARA::ARAPlaybackRegionHostRef hostRef, + ARA::Host::DocumentController& dc, + AudioModification& m, + const ARA::ARAPlaybackRegionProperties& props) + : impl (std::make_unique (hostRef, dc, m, props)) +{ +} + +void PlaybackRegion::update (const ARA::ARAPlaybackRegionProperties& props) { impl->update (props); } + +void PlaybackRegion::addListener (DeletionListener& x) { impl->addListener (x); } + +auto& PlaybackRegion::getAudioModification() const { return impl->getAudioModification(); } + +ARA::ARAPlaybackRegionRef PlaybackRegion::getPluginRef() const noexcept { return impl->getPluginRef(); } + +DeletionListener& PlaybackRegion::getDeletionListener() const noexcept { return *impl.get(); } + +//============================================================================== +MusicalContext::MusicalContext (ARA::ARAMusicalContextHostRef hostRef, + ARA::Host::DocumentController& dc, + const ARA::ARAMusicalContextProperties& props) + : ManagedARAHandle (dc, [&] + { + const ARAEditGuard guard (dc); + return dc.createMusicalContext (hostRef, &props); + }()) +{ +} + +void MusicalContext::update (const ARA::ARAMusicalContextProperties& props) +{ + const ARAEditGuard guard (getDocumentController()); + return getDocumentController().updateMusicalContextProperties (getPluginRef(), &props); +} + +void MusicalContext::destroy (ARA::Host::DocumentController& dc, Ptr ptr) +{ + dc.destroyMusicalContext (ptr); +} + +//============================================================================== +RegionSequence::RegionSequence (ARA::ARARegionSequenceHostRef hostRef, + ARA::Host::DocumentController& dc, + const ARA::ARARegionSequenceProperties& props) + : ManagedARAHandle (dc, [&] + { + const ARAEditGuard guard (dc); + return dc.createRegionSequence (hostRef, &props); + }()) +{ +} + +void RegionSequence::update (const ARA::ARARegionSequenceProperties& props) +{ + const ARAEditGuard guard (getDocumentController()); + return getDocumentController().updateRegionSequenceProperties (getPluginRef(), &props); +} + +void RegionSequence::destroy (ARA::Host::DocumentController& dc, Ptr ptr) +{ + dc.destroyRegionSequence (ptr); +} + +//============================================================================== +PlaybackRendererInterface PlugInExtensionInstance::getPlaybackRendererInterface() const +{ + if (instance != nullptr) + return PlaybackRendererInterface (instance->playbackRendererRef, instance->playbackRendererInterface); + + return {}; +} + +EditorRendererInterface PlugInExtensionInstance::getEditorRendererInterface() const +{ + if (instance != nullptr) + return EditorRendererInterface (instance->editorRendererRef, instance->editorRendererInterface); + + return {}; +} + +} // namespace ARAHostModel + +//============================================================================== +class ARAHostDocumentController::Impl +{ +public: + Impl (ARAFactoryWrapper araFactoryIn, + std::unique_ptr&& dcHostInstanceIn, + const ARA::ARADocumentControllerInstance* documentControllerInstance) + : araFactory (std::move (araFactoryIn)), + dcHostInstance (std::move (dcHostInstanceIn)), + documentController (documentControllerInstance) + { + } + + ~Impl() + { + documentController.destroyDocumentController(); + } + + static std::unique_ptr + createImpl (ARAFactoryWrapper araFactory, + const String& documentName, + std::unique_ptr&& audioAccessController, + std::unique_ptr&& archivingController, + std::unique_ptr&& contentAccessController, + std::unique_ptr&& modelUpdateController, + std::unique_ptr&& playbackController) + { + std::unique_ptr dcHostInstance = + std::make_unique (audioAccessController.release(), + archivingController.release(), + contentAccessController.release(), + modelUpdateController.release(), + playbackController.release()); + + const auto documentProperties = makeARASizedStruct (&ARA::ARADocumentProperties::name, documentName.toRawUTF8()); + + if (auto* dci = araFactory.get()->createDocumentControllerWithDocument (dcHostInstance.get(), &documentProperties)) + return std::make_unique (std::move (araFactory), std::move (dcHostInstance), dci); + + return {}; + } + + ARAHostModel::PlugInExtensionInstance bindDocumentToPluginInstance (AudioPluginInstance& instance, + ARA::ARAPlugInInstanceRoleFlags knownRoles, + ARA::ARAPlugInInstanceRoleFlags assignedRoles) + { + + const auto makeVisitor = [] (auto vst3Fn, auto auFn) + { + using Vst3Fn = decltype (vst3Fn); + using AuFn = decltype (auFn); + + struct Visitor : ExtensionsVisitor, Vst3Fn, AuFn + { + explicit Visitor (Vst3Fn vst3Fn, AuFn auFn) : Vst3Fn (std::move (vst3Fn)), AuFn (std::move (auFn)) {} + void visitVST3Client (const VST3Client& x) override { Vst3Fn::operator() (x); } + void visitAudioUnitClient (const AudioUnitClient& x) override { AuFn::operator() (x); } + }; + + return Visitor { std::move (vst3Fn), std::move (auFn) }; + }; + + const ARA::ARAPlugInExtensionInstance* pei = nullptr; + auto visitor = makeVisitor ([this, &pei, knownRoles, assignedRoles] (const ExtensionsVisitor::VST3Client& vst3Client) + { + auto* iComponentPtr = vst3Client.getIComponentPtr(); + VSTComSmartPtr araEntryPoint; + + if (araEntryPoint.loadFrom (iComponentPtr)) + pei = araEntryPoint->bindToDocumentControllerWithRoles (documentController.getRef(), knownRoles, assignedRoles); + }, + #if JUCE_PLUGINHOST_AU && JUCE_MAC + [this, &pei, knownRoles, assignedRoles] (const ExtensionsVisitor::AudioUnitClient& auClient) + { + auto audioUnit = auClient.getAudioUnitHandle(); + auto propertySize = (UInt32) sizeof (ARA::ARAAudioUnitPlugInExtensionBinding); + const auto expectedPropertySize = propertySize; + ARA::ARAAudioUnitPlugInExtensionBinding audioUnitBinding { ARA::kARAAudioUnitMagic, + documentController.getRef(), + nullptr, + knownRoles, + assignedRoles }; + + auto status = AudioUnitGetProperty (audioUnit, + ARA::kAudioUnitProperty_ARAPlugInExtensionBindingWithRoles, + kAudioUnitScope_Global, + 0, + &audioUnitBinding, + &propertySize); + + if (status == noErr + && propertySize == expectedPropertySize + && audioUnitBinding.inOutMagicNumber == ARA::kARAAudioUnitMagic + && audioUnitBinding.inDocumentControllerRef == documentController.getRef() + && audioUnitBinding.outPlugInExtension != nullptr) + { + pei = audioUnitBinding.outPlugInExtension; + } + else + jassertfalse; + } + #else + [] (const auto&) {} + #endif + ); + + instance.getExtensions (visitor); + return ARAHostModel::PlugInExtensionInstance { pei }; + } + + auto& getDocumentController() { return documentController; } + +private: + ARAFactoryWrapper araFactory; + std::unique_ptr dcHostInstance; + ARA::Host::DocumentController documentController; +}; + +ARAHostDocumentController::ARAHostDocumentController (std::unique_ptr&& implIn) + : impl { std::move (implIn) } +{} + +std::unique_ptr ARAHostDocumentController::create (ARAFactoryWrapper factory, + const String& documentName, + std::unique_ptr audioAccessController, + std::unique_ptr archivingController, + std::unique_ptr contentAccessController, + std::unique_ptr modelUpdateController, + std::unique_ptr playbackController) +{ + if (auto impl = Impl::createImpl (std::move (factory), + documentName, + std::move (audioAccessController), + std::move (archivingController), + std::move (contentAccessController), + std::move (modelUpdateController), + std::move (playbackController))) + { + return rawToUniquePtr (new ARAHostDocumentController (std::move (impl))); + } + + return {}; +} + +ARAHostDocumentController::~ARAHostDocumentController() = default; + +ARA::Host::DocumentController& ARAHostDocumentController::getDocumentController() const +{ + return impl->getDocumentController(); +} + +ARAHostModel::PlugInExtensionInstance ARAHostDocumentController::bindDocumentToPluginInstance (AudioPluginInstance& instance, + ARA::ARAPlugInInstanceRoleFlags knownRoles, + ARA::ARAPlugInInstanceRoleFlags assignedRoles) +{ + return impl->bindDocumentToPluginInstance (instance, knownRoles, assignedRoles); +} + +void createARAFactoryAsync (AudioPluginInstance& instance, std::function cb) +{ + if (! instance.getPluginDescription().hasARAExtension) + cb (ARAFactoryWrapper{}); + + struct Extensions : public ExtensionsVisitor + { + Extensions (std::function callbackIn) + : callback (std::move (callbackIn)) + {} + + void visitARAClient (const ARAClient& araClient) override + { + araClient.createARAFactoryAsync (std::move (callback)); + } + + std::function callback; + }; + + Extensions extensions { std::move(cb) }; + instance.getExtensions (extensions); +} + +} // namespace juce + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_ARAHosting.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_ARAHosting.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_ARAHosting.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_ARAHosting.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,771 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#pragma once + +#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS)) || DOXYGEN + +// Include ARA SDK headers +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments") + +#include +#include + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +//============================================================================== +namespace juce +{ +/** Reference counting helper class to ensure that the DocumentController is in editable state. + + When adding, removing or modifying %ARA model objects the enclosing DocumentController must be + in editable state. + + You can achieve this by using the %ARA Library calls + ARA::Host::DocumentController::beginEditing() and ARA::Host::DocumentController::endEditing(). + + However, putting the DocumentController in and out of editable state is a potentially costly + operation, thus it makes sense to group multiple modifications together and change the editable + state only once. + + ARAEditGuard keeps track of all scopes that want to edit a particular DocumentController and + will trigger beginEditing() and endEditing() only for the outermost scope. This allows you to + merge multiple editing operations into one by putting ARAEditGuard in their enclosing scope. + + @tags{ARA} +*/ +class ARAEditGuard +{ +public: + explicit ARAEditGuard (ARA::Host::DocumentController& dcIn); + ~ARAEditGuard(); + +private: + ARA::Host::DocumentController& dc; +}; + +namespace ARAHostModel +{ + +//============================================================================== +/** Allows converting, without warnings, between pointers of two unrelated types. + + This is a bit like ARA_MAP_HOST_REF, but not macro-based. + + To use it, add a line like this to a type that needs to deal in host references: + @code + using Converter = ConversionFunctions; + @endcode + + Now, you can convert back and forth with host references by calling + Converter::toHostRef() and Converter::fromHostRef(). + + @tags{ARA} +*/ +template +struct ConversionFunctions +{ + static_assert (sizeof (A) <= sizeof (B), + "It is only possible to convert between types of the same size"); + + static B toHostRef (A value) + { + return readUnaligned (&value); + } + + static A fromHostRef (B value) + { + return readUnaligned (&value); + } +}; + +//============================================================================== +/** This class is used by the various ARA model object helper classes, such as MusicalContext, + AudioSource etc. It helps with deregistering the model objects from the DocumentController + when the lifetime of the helper class object ends. + + You shouldn't use this class directly but instead inherit from the helper classes. +*/ +template +class ManagedARAHandle +{ +public: + using Ptr = PtrIn; + + /** Constructor. */ + ManagedARAHandle (ARA::Host::DocumentController& dc, Ptr ptr) noexcept + : handle (ptr, Deleter { dc }) {} + + /** Returns the host side DocumentController reference. */ + auto& getDocumentController() const { return handle.get_deleter().documentController; } + + /** Returns the plugin side reference to the model object. */ + Ptr getPluginRef() const { return handle.get(); } + +private: + struct Deleter + { + void operator() (Ptr ptr) const noexcept + { + const ARAEditGuard guard (documentController); + Base::destroy (documentController, ptr); + } + + ARA::Host::DocumentController& documentController; + }; + + std::unique_ptr, Deleter> handle; +}; + +//============================================================================== +/** Helper class for the host side implementation of the %ARA %AudioSource model object. + + Its intended use is to add a member variable of this type to your host side %AudioSource + implementation. Then it provides a RAII approach to managing the lifetime of the corresponding + objects created inside the DocumentController. When the host side object is instantiated an ARA + model object is also created in the DocumentController. When the host side object is deleted it + will be removed from the DocumentController as well. + + The class will automatically put the DocumentController into editable state for operations that + mandate this e.g. creation, deletion or updating. + + You can encapsulate multiple such operations into a scope with an ARAEditGuard in order to invoke + the editable state of the DocumentController only once. + + @tags{ARA} +*/ +class AudioSource : public ManagedARAHandle +{ +public: + /** Returns an %ARA versioned struct with the `structSize` correctly set for the currently + used SDK version. + + You should leave `structSize` unchanged, and fill out the rest of the fields appropriately + for the host implementation of the %ARA model object. + */ + static constexpr auto getEmptyProperties() { return makeARASizedStruct (&ARA::ARAAudioSourceProperties::merits64BitSamples); } + + /** Creates an AudioSource object. During construction it registers an %ARA %AudioSource model + object with the DocumentController that refers to the provided hostRef. When this object + is deleted the corresponding DocumentController model object will also be deregistered. + + You can acquire a correctly versioned `ARA::ARAAudioSourceProperties` struct by calling + getEmptyProperties(). + + Places the DocumentController in editable state. + + @see ARAEditGuard + */ + AudioSource (ARA::ARAAudioSourceHostRef hostRef, + ARA::Host::DocumentController& dc, + const ARA::ARAAudioSourceProperties& props); + + /** Destructor. Temporarily places the DocumentController in an editable state. */ + ~AudioSource() = default; + + /** Updates the state of the corresponding %ARA model object. + + Places the DocumentController in editable state. + + You can use getEmptyProperties() to acquire a properties struct where the `structSize` + field has already been correctly set. + */ + void update (const ARA::ARAAudioSourceProperties& props); + + /** Changes the plugin's access to the %AudioSource samples through the DocumentController. + + Places the DocumentController in editable state. + */ + void enableAudioSourceSamplesAccess (bool); + + /** Called by ManagedARAHandle to deregister the model object during the destruction of + AudioSource. + + You shouldn't call this function manually. + */ + static void destroy (ARA::Host::DocumentController&, Ptr); +}; + +/** Helper class for the host side implementation of the %ARA %AudioModification model object. + + Its intended use is to add a member variable of this type to your host side %AudioModification + implementation. Then it provides a RAII approach to managing the lifetime of the corresponding + objects created inside the DocumentController. When the host side object is instantiated an ARA + model object is also created in the DocumentController. When the host side object is deleted it + will be removed from the DocumentController as well. + + The class will automatically put the DocumentController into editable state for operations that + mandate this e.g. creation, deletion or updating. + + You can encapsulate multiple such operations into a scope with an ARAEditGuard in order to invoke + the editable state of the DocumentController only once. + + @tags{ARA} +*/ +class AudioModification : public ManagedARAHandle +{ +public: + /** Returns an %ARA versioned struct with the `structSize` correctly set for the currently + used SDK version. + + You should leave `structSize` unchanged, and fill out the rest of the fields appropriately + for the host implementation of the %ARA model object. + */ + static constexpr auto getEmptyProperties() + { + return makeARASizedStruct (&ARA::ARAAudioModificationProperties::persistentID); + } + + /** Creates an AudioModification object. During construction it registers an %ARA %AudioModification model + object with the DocumentController that refers to the provided hostRef. When this object + is deleted the corresponding DocumentController model object will also be deregistered. + + You can acquire a correctly versioned `ARA::ARAAudioModificationProperties` struct by calling + getEmptyProperties(). + + Places the DocumentController in editable state. + + @see ARAEditGuard + */ + AudioModification (ARA::ARAAudioModificationHostRef hostRef, + ARA::Host::DocumentController& dc, + AudioSource& s, + const ARA::ARAAudioModificationProperties& props); + + /** Updates the state of the corresponding %ARA model object. + + Places the DocumentController in editable state. + + You can use getEmptyProperties() to acquire a properties struct where the `structSize` + field has already been correctly set. + */ + void update (const ARA::ARAAudioModificationProperties& props); + + /** Returns the AudioSource containing this AudioModification. */ + auto& getAudioSource() const { return source; } + + /** Called by ManagedARAHandle to deregister the model object during the destruction of + AudioModification. + + You shouldn't call this function manually. + */ + static void destroy (ARA::Host::DocumentController&, Ptr); + +private: + AudioSource& source; +}; + +/** This class is used internally by PlaybackRegionRegistry to be notified when a PlaybackRegion + object is deleted. +*/ +struct DeletionListener +{ + /** Destructor. */ + virtual ~DeletionListener() = default; + + /** Removes another DeletionListener object from this DeletionListener. */ + virtual void removeListener (DeletionListener& other) noexcept = 0; +}; + +/** Helper class for the host side implementation of the %ARA %PlaybackRegion model object. + + Its intended use is to add a member variable of this type to your host side %PlaybackRegion + implementation. Then it provides a RAII approach to managing the lifetime of the corresponding + objects created inside the DocumentController. When the host side object is instantiated an ARA + model object is also created in the DocumentController. When the host side object is deleted it + will be removed from the DocumentController as well. + + The class will automatically put the DocumentController into editable state for operations that + mandate this e.g. creation, deletion or updating. + + You can encapsulate multiple such operations into a scope with an ARAEditGuard in order to invoke + the editable state of the DocumentController only once. + + @tags{ARA} +*/ +struct PlaybackRegion +{ +public: + /** Returns an %ARA versioned struct with the `structSize` correctly set for the currently + used SDK version. + + You should leave `structSize` unchanged, and fill out the rest of the fields appropriately + for the host implementation of the %ARA model object. + */ + static constexpr auto getEmptyProperties() + { + return makeARASizedStruct (&ARA::ARAPlaybackRegionProperties::color); + } + + PlaybackRegion (ARA::ARAPlaybackRegionHostRef hostRef, + ARA::Host::DocumentController& dc, + AudioModification& m, + const ARA::ARAPlaybackRegionProperties& props); + + ~PlaybackRegion(); + + /** Updates the state of the corresponding %ARA model object. + + Places the DocumentController in editable state. + + You can use getEmptyProperties() to acquire a properties struct where the `structSize` + field has already been correctly set. + */ + void update (const ARA::ARAPlaybackRegionProperties& props); + + /** Adds a DeletionListener object that will be notified when the PlaybackRegion object + is deleted. + + Used by the PlaybackRegionRegistry. + + @see PlaybackRendererInterface, EditorRendererInterface + */ + void addListener (DeletionListener& x); + + /** Returns the AudioModification containing this PlaybackRegion. */ + auto& getAudioModification() const; + + /** Returns the plugin side reference to the PlaybackRegion */ + ARA::ARAPlaybackRegionRef getPluginRef() const noexcept; + DeletionListener& getDeletionListener() const noexcept; + +private: + class Impl; + + std::unique_ptr impl; +}; + +/** Helper class for the host side implementation of the %ARA %MusicalContext model object. + + Its intended use is to add a member variable of this type to your host side %MusicalContext + implementation. Then it provides a RAII approach to managing the lifetime of the corresponding + objects created inside the DocumentController. When the host side object is instantiated an ARA + model object is also created in the DocumentController. When the host side object is deleted it + will be removed from the DocumentController as well. + + The class will automatically put the DocumentController into editable state for operations that + mandate this e.g. creation, deletion or updating. + + You can encapsulate multiple such operations into a scope with an ARAEditGuard in order to invoke + the editable state of the DocumentController only once. + + @tags{ARA} +*/ +class MusicalContext : public ManagedARAHandle +{ +public: + /** Returns an %ARA versioned struct with the `structSize` correctly set for the currently + used SDK version. + + You should leave `structSize` unchanged, and fill out the rest of the fields appropriately + for the host implementation of the %ARA model object. + */ + static constexpr auto getEmptyProperties() + { + return makeARASizedStruct (&ARA::ARAMusicalContextProperties::color); + } + + /** Creates a MusicalContext object. During construction it registers an %ARA %MusicalContext model + object with the DocumentController that refers to the provided hostRef. When this object + is deleted the corresponding DocumentController model object will also be deregistered. + + You can acquire a correctly versioned `ARA::ARAMusicalContextProperties` struct by calling + getEmptyProperties(). + + Places the DocumentController in editable state. + + @see ARAEditGuard + */ + MusicalContext (ARA::ARAMusicalContextHostRef hostRef, + ARA::Host::DocumentController& dc, + const ARA::ARAMusicalContextProperties& props); + + /** Updates the state of the corresponding %ARA model object. + + Places the DocumentController in editable state. + + You can use getEmptyProperties() to acquire a properties struct where the `structSize` + field has already been correctly set. + */ + void update (const ARA::ARAMusicalContextProperties& props); + + /** Called by ManagedARAHandle to deregister the model object during the destruction of + AudioModification. + + You shouldn't call this function manually. + */ + static void destroy (ARA::Host::DocumentController&, Ptr); +}; + +/** Helper class for the host side implementation of the %ARA %RegionSequence model object. + + Its intended use is to add a member variable of this type to your host side %RegionSequence + implementation. Then it provides a RAII approach to managing the lifetime of the corresponding + objects created inside the DocumentController. When the host side object is instantiated an ARA + model object is also created in the DocumentController. When the host side object is deleted it + will be removed from the DocumentController as well. + + The class will automatically put the DocumentController into editable state for operations that + mandate this e.g. creation, deletion or updating. + + You can encapsulate multiple such operations into a scope with an ARAEditGuard in order to invoke + the editable state of the DocumentController only once. + + @tags{ARA} +*/ +class RegionSequence : public ManagedARAHandle +{ +public: + /** Returns an %ARA versioned struct with the `structSize` correctly set for the currently + used SDK version. + + You should leave `structSize` unchanged, and fill out the rest of the fields appropriately + for the host implementation of the %ARA model object. + */ + static constexpr auto getEmptyProperties() + { + return makeARASizedStruct (&ARA::ARARegionSequenceProperties::color); + } + + /** Creates a RegionSequence object. During construction it registers an %ARA %RegionSequence model + object with the DocumentController that refers to the provided hostRef. When this object + is deleted the corresponding DocumentController model object will also be deregistered. + + You can acquire a correctly versioned `ARA::ARARegionSequenceProperties` struct by calling + getEmptyProperties(). + + Places the DocumentController in editable state. + + @see ARAEditGuard + */ + RegionSequence (ARA::ARARegionSequenceHostRef hostRef, + ARA::Host::DocumentController& dc, + const ARA::ARARegionSequenceProperties& props); + + /** Updates the state of the corresponding %ARA model object. + + Places the DocumentController in editable state. + + You can use getEmptyProperties() to acquire a properties struct where the `structSize` + field has already been correctly set. + */ + void update (const ARA::ARARegionSequenceProperties& props); + + /** Called by ManagedARAHandle to deregister the model object during the destruction of + AudioModification. + + You shouldn't call this function manually. + */ + static void destroy (ARA::Host::DocumentController&, Ptr); +}; + +//============================================================================== +/** Base class used by the ::PlaybackRendererInterface and ::EditorRendererInterface + plugin extension interfaces. + + Hosts will want to create one or typically more %ARA plugin extension instances per plugin for + the purpose of playback and editor rendering. The PlaybackRegions created by the host then have + to be assigned to these instances through the appropriate interfaces. + + Whether a PlaybackRegion or an assigned RendererInterface is deleted first depends on the host + implementation and exact use case. + + By using these helper classes you can ensure that the %ARA DocumentController remains in a + valid state in both situations. In order to use them acquire an object from + PlugInExtensionInstance::getPlaybackRendererInterface() or + PlugInExtensionInstance::getEditorRendererInterface(). + + Then call add() to register a PlaybackRegion with that particular PlugInExtensionInstance's + interface. + + Now when you delete that PlaybackRegion it will be deregistered from that extension instance. + If however you want to delete the plugin extension instance before the PlaybackRegion, you can + delete the PlaybackRegionRegistry instance before deleting the plugin extension instance, which + takes care of deregistering all PlaybackRegions. + + When adding or removing PlaybackRegions the plugin instance must be in an unprepared state i.e. + before AudioProcessor::prepareToPlay() or after AudioProcessor::releaseResources(). + + @code + auto playbackRenderer = std::make_unique (plugInExtensionInstance.getPlaybackRendererInterface()); + auto playbackRegion = std::make_unique (documentController, regionSequence, audioModification, audioSource); + + // Either of the following three code variations are valid + // (1) =================================================== + playbackRenderer.add (playbackRegion); + playbackRenderer.remove (playbackRegion); + + // (2) =================================================== + playbackRenderer.add (playbackRegion); + playbackRegion.reset(); + + // (3) =================================================== + playbackRenderer.add (playbackRegion); + playbackRenderer.reset(); + @endcode + + @see PluginExtensionInstance + + @tags{ARA} +*/ +template +class PlaybackRegionRegistry +{ +public: + PlaybackRegionRegistry() = default; + + PlaybackRegionRegistry (RendererRef rendererRefIn, const Interface* interfaceIn) + : registry (std::make_unique (rendererRefIn, interfaceIn)) + { + } + + /** Adds a PlaybackRegion to the corresponding ::PlaybackRendererInterface or ::EditorRendererInterface. + + The plugin instance must be in an unprepared state i.e. before AudioProcessor::prepareToPlay() or + after AudioProcessor::releaseResources(). + */ + void add (PlaybackRegion& region) { registry->add (region); } + + /** Removes a PlaybackRegion from the corresponding ::PlaybackRendererInterface or ::EditorRendererInterface. + + The plugin instance must be in an unprepared state i.e. before AudioProcessor::prepareToPlay() or + after AudioProcessor::releaseResources(). + */ + void remove (PlaybackRegion& region) { registry->remove (region); } + + /** Returns true if the underlying %ARA plugin extension instance fulfills the corresponding role. */ + bool isValid() { return registry->isValid(); } + +private: + class Registry : private DeletionListener + { + public: + Registry (RendererRef rendererRefIn, const Interface* interfaceIn) + : rendererRef (rendererRefIn), rendererInterface (interfaceIn) + { + } + + Registry (const Registry&) = delete; + Registry (Registry&&) noexcept = delete; + + Registry& operator= (const Registry&) = delete; + Registry& operator= (Registry&&) noexcept = delete; + + ~Registry() override + { + for (const auto& region : regions) + doRemoveListener (*region.first); + } + + bool isValid() { return rendererRef != nullptr && rendererInterface != nullptr; } + + void add (PlaybackRegion& region) + { + if (isValid()) + rendererInterface->addPlaybackRegion (rendererRef, region.getPluginRef()); + + regions.emplace (®ion.getDeletionListener(), region.getPluginRef()); + region.addListener (*this); + } + + void remove (PlaybackRegion& region) + { + doRemoveListener (region.getDeletionListener()); + } + + private: + void doRemoveListener (DeletionListener& listener) noexcept + { + listener.removeListener (*this); + removeListener (listener); + } + + void removeListener (DeletionListener& listener) noexcept override + { + const auto it = regions.find (&listener); + + if (it == regions.end()) + { + jassertfalse; + return; + } + + if (isValid()) + rendererInterface->removePlaybackRegion (rendererRef, it->second); + + regions.erase (it); + } + + RendererRef rendererRef = nullptr; + const Interface* rendererInterface = nullptr; + std::map regions; + }; + + std::unique_ptr registry; +}; + +//============================================================================== +/** Helper class for managing the lifetimes of %ARA plugin extension instances and PlaybackRegions. + + You can read more about its usage at PlaybackRegionRegistry. + + @see PlaybackRegion, PlaybackRegionRegistry + + @tags{ARA} +*/ +using PlaybackRendererInterface = PlaybackRegionRegistry; + +//============================================================================== +/** Helper class for managing the lifetimes of %ARA plugin extension instances and PlaybackRegions. + + You can read more about its usage at PlaybackRegionRegistry. + + @see PlaybackRegion, PlaybackRegionRegistry + + @tags{ARA} +*/ +using EditorRendererInterface = PlaybackRegionRegistry; + +//============================================================================== +/** Wrapper class for `ARA::ARAPlugInExtensionInstance*`. + + Returned by ARAHostDocumentController::bindDocumentToPluginInstance(). The corresponding + ARAHostDocumentController must remain valid as long as the plugin extension is in use. +*/ +class PlugInExtensionInstance final +{ +public: + /** Creates an empty PlugInExtensionInstance object. + + Calling isValid() on such an object will return false. + */ + PlugInExtensionInstance() = default; + + /** Creates a PlugInExtensionInstance object that wraps a `const ARA::ARAPlugInExtensionInstance*`. + + The intended way to obtain a PlugInExtensionInstance object is to call + ARAHostDocumentController::bindDocumentToPluginInstance(), which is using this constructor. + */ + explicit PlugInExtensionInstance (const ARA::ARAPlugInExtensionInstance* instanceIn) + : instance (instanceIn) + { + } + + /** Returns the PlaybackRendererInterface for the extension instance. + + Depending on what roles were passed into + ARAHostDocumentController::bindDocumentToPluginInstance() one particular instance may not + fulfill a given role. You can use PlaybackRendererInterface::isValid() to see if this + interface was provided by the instance. + */ + PlaybackRendererInterface getPlaybackRendererInterface() const; + + /** Returns the EditorRendererInterface for the extension instance. + + Depending on what roles were passed into + ARAHostDocumentController::bindDocumentToPluginInstance() one particular instance may not + fulfill a given role. You can use EditorRendererInterface::isValid() to see if this + interface was provided by the instance. + */ + EditorRendererInterface getEditorRendererInterface() const; + + /** Returns false if the PlugInExtensionInstance was default constructed and represents + no binding to an ARAHostDocumentController. + */ + bool isValid() const noexcept { return instance != nullptr; } + +private: + const ARA::ARAPlugInExtensionInstance* instance = nullptr; +}; + +} // namespace ARAHostModel + +//============================================================================== +/** Wrapper class for `ARA::Host::DocumentController`. + + In order to create an ARAHostDocumentController from an ARAFactoryWrapper you must + provide at least two mandatory host side interfaces. You can create these implementations + by inheriting from the base classes in the `ARA::Host` namespace. + + @tags{ARA} +*/ +class ARAHostDocumentController final +{ +public: + /** Factory function. + + You must check if the returned pointer is valid. + */ + static std::unique_ptr + create (ARAFactoryWrapper factory, + const String& documentName, + std::unique_ptr audioAccessController, + std::unique_ptr archivingController, + std::unique_ptr contentAccessController = nullptr, + std::unique_ptr modelUpdateController = nullptr, + std::unique_ptr playbackController = nullptr); + + ~ARAHostDocumentController(); + + /** Returns the underlying ARA::Host::DocumentController reference. */ + ARA::Host::DocumentController& getDocumentController() const; + + /** Binds the ARAHostDocumentController and its enclosed document to a plugin instance. + + The resulting ARAHostModel::PlugInExtensionInstance is responsible for fulfilling the + ARA specific roles of the plugin. + + A single DocumentController can be bound to multiple plugin instances, which is a typical + practice among hosts. + */ + ARAHostModel::PlugInExtensionInstance bindDocumentToPluginInstance (AudioPluginInstance& instance, + ARA::ARAPlugInInstanceRoleFlags knownRoles, + ARA::ARAPlugInInstanceRoleFlags assignedRoles); + +private: + class Impl; + std::unique_ptr impl; + + explicit ARAHostDocumentController (std::unique_ptr&& implIn); +}; + +/** Calls the provided callback with an ARAFactoryWrapper object obtained from the provided + AudioPluginInstance. + + If the provided AudioPluginInstance has no ARA extensions, the callback will be called with an + ARAFactoryWrapper that wraps a nullptr. + + The object passed to the callback must be checked even if the plugin instance reports having + ARA extensions. +*/ +void createARAFactoryAsync (AudioPluginInstance& instance, std::function cb); + +} // namespace juce + +//============================================================================== +#undef ARA_REF +#undef ARA_HOST_REF + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -54,6 +54,7 @@ StringArray searchPathsForPlugins (const FileSearchPath&, bool recursive, bool) override; bool doesPluginStillExist (const PluginDescription&) override; FileSearchPath getDefaultLocationsToSearch() override; + void createARAFactoryAsync (const PluginDescription&, ARAFactoryCreationCallback callback) override; private: //============================================================================== diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -31,16 +31,18 @@ #include #include #include -#endif -#include +#if JUCE_PLUGINHOST_ARA + #include +#endif -#if JUCE_SUPPORT_CARBON - #include #endif +#include + #include +#include #include #include #include "juce_AU_Shared.h" @@ -216,13 +218,40 @@ if (manuString != nullptr && CFGetTypeID (manuString) == CFStringGetTypeID()) manufacturer = String::fromCFString ((CFStringRef) manuString); - const ResFileRefNum resFileId = CFBundleOpenBundleResourceMap (bundleRef.get()); - UseResFile (resFileId); + class ScopedBundleResourceMap final + { + public: + explicit ScopedBundleResourceMap (CFBundleRef refIn) : ref (refIn), + resFileId (CFBundleOpenBundleResourceMap (ref)), + valid (resFileId != -1) + { + if (valid) + UseResFile (resFileId); + } + + ~ScopedBundleResourceMap() + { + if (valid) + CFBundleCloseBundleResourceMap (ref, resFileId); + } + + bool isValid() const noexcept + { + return valid; + } + + private: + const CFBundleRef ref; + const ResFileRefNum resFileId; + const bool valid; + }; + + const ScopedBundleResourceMap resourceMap { bundleRef.get() }; const OSType thngType = stringToOSType ("thng"); auto numResources = Count1Resources (thngType); - if (numResources > 0) + if (resourceMap.isValid() && numResources > 0) { for (ResourceIndex i = 1; i <= numResources; ++i) { @@ -260,7 +289,7 @@ NSBundle* bundle = [[NSBundle alloc] initWithPath: (NSString*) fileOrIdentifier.toCFString()]; NSArray* audioComponents = [bundle objectForInfoDictionaryKey: @"AudioComponents"]; - NSDictionary* dict = audioComponents[0]; + NSDictionary* dict = [audioComponents objectAtIndex: 0]; desc.componentManufacturer = stringToOSType (nsStringToJuce ((NSString*) [dict valueForKey: @"manufacturer"])); desc.componentType = stringToOSType (nsStringToJuce ((NSString*) [dict valueForKey: @"type"])); @@ -268,8 +297,6 @@ [bundle release]; } - - CFBundleCloseBundleResourceMap (bundleRef.get(), resFileId); } } @@ -312,10 +339,293 @@ void handleAsyncUpdate() override { resizeToFitView(); } }; #endif + + template + static Optional tryGetProperty (AudioUnit inUnit, + AudioUnitPropertyID inID, + AudioUnitScope inScope, + AudioUnitElement inElement) + { + Value data; + auto size = (UInt32) sizeof (Value); + + if (AudioUnitGetProperty (inUnit, inID, inScope, inElement, &data, &size) == noErr) + return data; + + return {}; + } + + static UInt32 getElementCount (AudioUnit comp, AudioUnitScope scope) noexcept + { + const auto count = tryGetProperty (comp, kAudioUnitProperty_ElementCount, scope, 0); + jassert (count); + return *count; + } + + /* The plugin may expect its channels in a particular order, reported to the host + using kAudioUnitProperty_AudioChannelLayout. + This remapper allows us to respect the channel order requested by the plugin, + while still using the JUCE channel ordering for the AudioBuffer argument + of AudioProcessor::processBlock. + */ + class SingleDirectionChannelMapping + { + public: + void setUpMapping (AudioUnit comp, bool isInput) + { + channels.clear(); + busOffset.clear(); + + const auto scope = isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output; + const auto n = getElementCount (comp, scope); + + for (UInt32 busIndex = 0; busIndex < n; ++busIndex) + { + std::vector busMap; + + if (const auto layout = tryGetProperty (comp, kAudioUnitProperty_AudioChannelLayout, scope, busIndex)) + { + const auto juceChannelOrder = CoreAudioLayouts::fromCoreAudio (*layout); + const auto auChannelOrder = CoreAudioLayouts::getCoreAudioLayoutChannels (*layout); + + for (auto juceChannelIndex = 0; juceChannelIndex < juceChannelOrder.size(); ++juceChannelIndex) + busMap.push_back ((size_t) auChannelOrder.indexOf (juceChannelOrder.getTypeOfChannel (juceChannelIndex))); + } + + busOffset.push_back (busMap.empty() ? unknownChannelCount : channels.size()); + channels.insert (channels.end(), busMap.begin(), busMap.end()); + } + } + + size_t getAuIndexForJuceChannel (size_t bus, size_t channel) const noexcept + { + const auto baseOffset = busOffset[bus]; + return baseOffset != unknownChannelCount ? channels[baseOffset + channel] + : channel; + } + + private: + static constexpr size_t unknownChannelCount = std::numeric_limits::max(); + + /* The index (in the channels vector) of the first channel in each bus. + e.g the index of the first channel in the second bus can be found at busOffset[1]. + It's possible for a bus not to report its channel layout, and in this case a value + of unknownChannelCount will be stored for that bus. + */ + std::vector busOffset; + + /* The index in a collection of JUCE channels of the AU channel with a matching channel + type. The mappings for all buses are stored in bus order. To find the start offset for a + particular bus, use the busOffset vector. + e.g. the index of the AU channel with the same type as the fifth channel of the third bus + in JUCE layout is found at channels[busOffset[2] + 4]. + If the busOffset for the bus is unknownChannelCount, then assume there is no mapping + between JUCE/AU channel layouts. + */ + std::vector channels; + }; + + static bool isPluginAUv3 (const AudioComponentDescription& desc) + { + if (@available (macOS 10.11, *)) + return (desc.componentFlags & kAudioComponentFlag_IsV3AudioUnit) != 0; + + return false; + } +} + +static bool hasARAExtension (AudioUnit audioUnit) +{ + #if JUCE_PLUGINHOST_ARA + UInt32 propertySize = sizeof (ARA::ARAAudioUnitFactory); + Boolean isWriteable = FALSE; + + OSStatus status = AudioUnitGetPropertyInfo (audioUnit, + ARA::kAudioUnitProperty_ARAFactory, + kAudioUnitScope_Global, + 0, + &propertySize, + &isWriteable); + + if ((status == noErr) && (propertySize == sizeof (ARA::ARAAudioUnitFactory)) && ! isWriteable) + return true; + #else + ignoreUnused (audioUnit); + #endif + + return false; +} + +struct AudioUnitDeleter +{ + void operator() (AudioUnit au) const { AudioComponentInstanceDispose (au); } +}; + +using AudioUnitUniquePtr = std::unique_ptr, AudioUnitDeleter>; +using AudioUnitSharedPtr = std::shared_ptr>; +using AudioUnitWeakPtr = std::weak_ptr>; + +static std::shared_ptr getARAFactory (AudioUnitSharedPtr audioUnit) +{ + #if JUCE_PLUGINHOST_ARA + jassert (audioUnit != nullptr); + + UInt32 propertySize = sizeof (ARA::ARAAudioUnitFactory); + ARA::ARAAudioUnitFactory audioUnitFactory { ARA::kARAAudioUnitMagic, nullptr }; + + if (hasARAExtension (audioUnit.get())) + { + OSStatus status = AudioUnitGetProperty (audioUnit.get(), + ARA::kAudioUnitProperty_ARAFactory, + kAudioUnitScope_Global, + 0, + &audioUnitFactory, + &propertySize); + + if ((status == noErr) + && (propertySize == sizeof (ARA::ARAAudioUnitFactory)) + && (audioUnitFactory.inOutMagicNumber == ARA::kARAAudioUnitMagic)) + { + jassert (audioUnitFactory.outFactory != nullptr); + return getOrCreateARAFactory (audioUnitFactory.outFactory, + [owningAuPtr = std::move (audioUnit)] (const ARA::ARAFactory*) {}); + } + } + #else + ignoreUnused (audioUnit); + #endif + + return {}; +} + +struct VersionedAudioComponent +{ + AudioComponent audioComponent = nullptr; + bool isAUv3 = false; + + bool operator< (const VersionedAudioComponent& other) const { return audioComponent < other.audioComponent; } +}; + +using AudioUnitCreationCallback = std::function; + +static void createAudioUnit (VersionedAudioComponent versionedComponent, AudioUnitCreationCallback callback) +{ + struct AUAsyncInitializationCallback + { + typedef void (^AUCompletionCallbackBlock)(AudioComponentInstance, OSStatus); + + explicit AUAsyncInitializationCallback (AudioUnitCreationCallback inOriginalCallback) + : originalCallback (std::move (inOriginalCallback)) + { + block = CreateObjCBlock (this, &AUAsyncInitializationCallback::completion); + } + + AUCompletionCallbackBlock getBlock() noexcept { return block; } + + void completion (AudioComponentInstance audioUnit, OSStatus err) + { + originalCallback (audioUnit, err); + + delete this; + } + + double sampleRate; + int framesPerBuffer; + AudioUnitCreationCallback originalCallback; + + ObjCBlock block; + }; + + auto callbackBlock = new AUAsyncInitializationCallback (std::move (callback)); + + if (versionedComponent.isAUv3) + { + if (@available (macOS 10.11, *)) + { + AudioComponentInstantiate (versionedComponent.audioComponent, kAudioComponentInstantiation_LoadOutOfProcess, + callbackBlock->getBlock()); + + return; + } + } + + AudioComponentInstance audioUnit; + auto err = AudioComponentInstanceNew (versionedComponent.audioComponent, &audioUnit); + callbackBlock->completion (err != noErr ? nullptr : audioUnit, err); +} + +struct AudioComponentResult +{ + explicit AudioComponentResult (String error) : errorMessage (std::move (error)) {} + + explicit AudioComponentResult (VersionedAudioComponent auComponent) : component (std::move (auComponent)) {} + + bool isValid() const { return component.audioComponent != nullptr; } + + VersionedAudioComponent component; + String errorMessage; +}; + +static AudioComponentResult getAudioComponent (AudioUnitPluginFormat& format, const PluginDescription& desc) +{ + using namespace AudioUnitFormatHelpers; + + AudioUnitPluginFormat audioUnitPluginFormat; + + if (! format.fileMightContainThisPluginType (desc.fileOrIdentifier)) + return AudioComponentResult { NEEDS_TRANS ("Plug-in description is not an AudioUnit plug-in") }; + + String pluginName, version, manufacturer; + AudioComponentDescription componentDesc; + AudioComponent auComponent; + String errMessage = NEEDS_TRANS ("Cannot find AudioUnit from description"); + + if (! getComponentDescFromIdentifier (desc.fileOrIdentifier, componentDesc, pluginName, version, manufacturer) + && ! getComponentDescFromFile (desc.fileOrIdentifier, componentDesc, pluginName, version, manufacturer)) + { + return AudioComponentResult { errMessage }; + } + + if ((auComponent = AudioComponentFindNext (nullptr, &componentDesc)) == nullptr) + { + return AudioComponentResult { errMessage }; + } + + if (AudioComponentGetDescription (auComponent, &componentDesc) != noErr) + { + return AudioComponentResult { errMessage }; + } + + const bool isAUv3 = AudioUnitFormatHelpers::isPluginAUv3 (componentDesc); + + return AudioComponentResult { { auComponent, isAUv3 } }; +} + +static void getOrCreateARAAudioUnit (VersionedAudioComponent auComponent, std::function callback) +{ + static std::map audioUnitARACache; + + if (auto audioUnit = audioUnitARACache[auComponent].lock()) + { + callback (std::move (audioUnit)); + return; + } + + createAudioUnit (auComponent, [auComponent, cb = std::move (callback)] (AudioUnit audioUnit, OSStatus err) + { + cb ([auComponent, audioUnit, err]() -> AudioUnitSharedPtr + { + if (err != noErr) + return nullptr; + + AudioUnitSharedPtr auPtr { AudioUnitUniquePtr { audioUnit } }; + audioUnitARACache[auComponent] = auPtr; + return auPtr; + }()); + }); } //============================================================================== -class AudioUnitPluginWindowCarbon; class AudioUnitPluginWindowCocoa; //============================================================================== @@ -386,15 +696,8 @@ return defaultValue; } - String getName (int /*maximumStringLength*/) const override - { - return name; - } - - String getLabel() const override - { - return valueLabel; - } + String getName (int /*maximumStringLength*/) const override { return name; } + String getLabel() const override { return valueLabel; } String getText (float value, int maximumLength) const override { @@ -510,15 +813,18 @@ UInt32 getRawParamID() const { return paramID; } + void setName (String&& newName) { name = std::move (newName); } + void setLabel (String&& newLabel) { valueLabel = std::move (newLabel); } + private: AudioUnitPluginInstance& pluginInstance; const UInt32 paramID; - const String name; + String name; const AudioUnitParameterValue minValue, maxValue, range; const bool automatable, discrete; const int numSteps; const bool valuesHaveStrings, isSwitch; - const String valueLabel; + String valueLabel; const AudioUnitParameterValue defaultValue; StringArray auValueStrings; }; @@ -536,7 +842,7 @@ AudioComponentGetDescription (auComponent, &componentDesc); - isAUv3 = ((componentDesc.componentFlags & kAudioComponentFlag_IsV3AudioUnit) != 0); + isAUv3 = AudioUnitFormatHelpers::isPluginAUv3 (componentDesc); wantsMidiMessages = componentDesc.componentType == kAudioUnitType_MusicDevice || componentDesc.componentType == kAudioUnitType_MusicEffect @@ -624,8 +930,8 @@ bool canApplyBusCountChange (bool isInput, bool isAdding, BusProperties& outProperties) override { - int currentCount = getBusCount (isInput); - int newCount = currentCount + (isAdding ? 1 : -1); + auto currentCount = (UInt32) getBusCount (isInput); + auto newCount = (UInt32) ((int) currentCount + (isAdding ? 1 : -1)); AudioUnitScope scope = isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output; if (AudioUnitSetProperty (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &newCount, sizeof (newCount)) == noErr) @@ -728,7 +1034,7 @@ layoutHasChanged = true; err = AudioUnitSetProperty (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &newCount, sizeof (newCount)); - jassert (err == noErr); + jassertquiet (err == noErr); } for (int i = 0; i < n; ++i) @@ -871,6 +1177,23 @@ desc.numInputChannels = getTotalNumInputChannels(); desc.numOutputChannels = getTotalNumOutputChannels(); desc.isInstrument = (componentDesc.componentType == kAudioUnitType_MusicDevice); + + #if JUCE_PLUGINHOST_ARA + desc.hasARAExtension = [&] + { + UInt32 propertySize = sizeof (ARA::ARAAudioUnitFactory); + Boolean isWriteable = FALSE; + + OSStatus status = AudioUnitGetPropertyInfo (audioUnit, + ARA::kAudioUnitProperty_ARAFactory, + kAudioUnitScope_Global, + 0, + &propertySize, + &isWriteable); + + return (status == noErr) && (propertySize == sizeof (ARA::ARAAudioUnitFactory)) && ! isWriteable; + }(); + #endif } void getExtensions (ExtensionsVisitor& visitor) const override @@ -885,6 +1208,33 @@ }; visitor.visitAudioUnitClient (Extensions { this }); + + #ifdef JUCE_PLUGINHOST_ARA + struct ARAExtensions : public ExtensionsVisitor::ARAClient + { + explicit ARAExtensions (const AudioUnitPluginInstance* instanceIn) : instance (instanceIn) {} + + void createARAFactoryAsync (std::function cb) const override + { + getOrCreateARAAudioUnit ({ instance->auComponent, instance->isAUv3 }, + [origCb = std::move (cb)] (auto dylibKeepAliveAudioUnit) + { + origCb ([&]() -> ARAFactoryWrapper + { + if (dylibKeepAliveAudioUnit != nullptr) + return ARAFactoryWrapper { ::juce::getARAFactory (std::move (dylibKeepAliveAudioUnit)) }; + + return ARAFactoryWrapper { nullptr }; + }()); + }); + } + + const AudioUnitPluginInstance* instance = nullptr; + }; + + if (hasARAExtension (audioUnit)) + visitor.visitARAClient (ARAExtensions (this)); + #endif } void* getPlatformSpecificData() override { return audioUnit; } @@ -977,10 +1327,9 @@ zerostruct (timeStamp); timeStamp.mSampleTime = 0; - timeStamp.mHostTime = GetCurrentHostTime (0, newSampleRate, isAUv3); + timeStamp.mHostTime = mach_absolute_time(); timeStamp.mFlags = kAudioTimeStampSampleTimeValid | kAudioTimeStampHostTimeValid; - currentBuffer = nullptr; wasPlaying = false; resetBuses(); @@ -1003,6 +1352,13 @@ AudioUnitUninitialize (audioUnit); } } + + inMapping .setUpMapping (audioUnit, true); + outMapping.setUpMapping (audioUnit, false); + + preparedChannels = jmax (getTotalNumInputChannels(), getTotalNumOutputChannels()); + preparedSamples = estimatedSamplesPerBlock; + inputBuffer.setSize (preparedChannels, preparedSamples); } } @@ -1010,12 +1366,11 @@ { if (prepared) { - AudioUnitUninitialize (audioUnit); resetBuses(); AudioUnitReset (audioUnit, kAudioUnitScope_Global, 0); + AudioUnitUninitialize (audioUnit); outputBufferList.clear(); - currentBuffer = nullptr; prepared = false; } @@ -1030,7 +1385,29 @@ void processAudio (AudioBuffer& buffer, MidiBuffer& midiMessages, bool processBlockBypassedCalled) { - auto numSamples = buffer.getNumSamples(); + auto* playhead = getPlayHead(); + const auto position = playhead != nullptr ? playhead->getPosition() : nullopt; + + if (const auto hostTimeNs = position.hasValue() ? position->getHostTimeNs() : nullopt) + { + timeStamp.mHostTime = *hostTimeNs; + timeStamp.mFlags |= kAudioTimeStampHostTimeValid; + } + else + { + timeStamp.mHostTime = 0; + timeStamp.mFlags &= ~kAudioTimeStampHostTimeValid; + } + + // If these are hit, we might allocate in the process block! + jassert (buffer.getNumChannels() <= preparedChannels); + jassert (buffer.getNumSamples() <= preparedSamples); + // Copy the input buffer to guard against the case where a bus has more output channels + // than input channels, so rendering the output for that bus might stamp over the input + // to the following bus. + inputBuffer.makeCopyOf (buffer, true); + + const auto numSamples = buffer.getNumSamples(); if (auSupportsBypass) { @@ -1044,29 +1421,26 @@ if (prepared) { - timeStamp.mHostTime = GetCurrentHostTime (numSamples, getSampleRate(), isAUv3); - int numOutputBuses; - - int chIdx = 0; - numOutputBuses = getBusCount (false); + const auto numOutputBuses = getBusCount (false); for (int i = 0; i < numOutputBuses; ++i) { if (AUBuffer* buf = outputBufferList[i]) { AudioBufferList& abl = *buf; + const auto* bus = getBus (false, i); + const auto channelCount = bus != nullptr ? bus->getNumberOfChannels() : 0; - for (AudioUnitElement j = 0; j < abl.mNumberBuffers; ++j) + for (auto juceChannel = 0; juceChannel < channelCount; ++juceChannel) { - abl.mBuffers[j].mNumberChannels = 1; - abl.mBuffers[j].mDataByteSize = (UInt32) ((size_t) numSamples * sizeof (float)); - abl.mBuffers[j].mData = buffer.getWritePointer (chIdx++); + const auto auChannel = outMapping.getAuIndexForJuceChannel ((size_t) i, (size_t) juceChannel); + abl.mBuffers[auChannel].mNumberChannels = 1; + abl.mBuffers[auChannel].mDataByteSize = (UInt32) ((size_t) numSamples * sizeof (float)); + abl.mBuffers[auChannel].mData = buffer.getWritePointer (bus->getChannelIndexInProcessBlockBuffer (juceChannel)); } } } - currentBuffer = &buffer; - if (wantsMidiMessages) { for (const auto metadata : midiMessages) @@ -1142,10 +1516,10 @@ for (int dir = 0; dir < 2; ++dir) { - const bool isInput = (dir == 0); - const int n = getElementCount (comp, isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output); + const auto isInput = (dir == 0); + const auto n = AudioUnitFormatHelpers::getElementCount (comp, isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output); - for (int i = 0; i < n; ++i) + for (UInt32 i = 0; i < n; ++i) { String busName; AudioChannelSet currentLayout; @@ -1383,99 +1757,72 @@ for (size_t i = 0; i < numParams; ++i) { - AudioUnitParameterInfo info; - UInt32 sz = sizeof (info); + const ScopedAudioUnitParameterInfo info { audioUnit, ids[i] }; - if (AudioUnitGetProperty (audioUnit, - kAudioUnitProperty_ParameterInfo, - kAudioUnitScope_Global, - ids[i], &info, &sz) == noErr) - { - String paramName; + if (! info.isValid()) + continue; - if ((info.flags & kAudioUnitParameterFlag_HasCFNameString) != 0) - { - paramName = String::fromCFString (info.cfNameString); + const auto paramName = getParamName (info.get()); + const auto label = getParamLabel (info.get()); + const auto isDiscrete = (info.get().unit == kAudioUnitParameterUnit_Indexed + || info.get().unit == kAudioUnitParameterUnit_Boolean); + const auto isBoolean = info.get().unit == kAudioUnitParameterUnit_Boolean; + + auto parameter = std::make_unique (*this, + ids[i], + paramName, + info.get().minValue, + info.get().maxValue, + info.get().defaultValue, + (info.get().flags & kAudioUnitParameterFlag_NonRealTime) == 0, + isDiscrete, + isDiscrete ? (int) (info.get().maxValue - info.get().minValue + 1.0f) : AudioProcessor::getDefaultNumParameterSteps(), + isBoolean, + label, + (info.get().flags & kAudioUnitParameterFlag_ValuesHaveStrings) != 0); - if ((info.flags & kAudioUnitParameterFlag_CFNameRelease) != 0) - CFRelease (info.cfNameString); - } - else - { - paramName = String (info.name, sizeof (info.name)); - } - - bool isDiscrete = (info.unit == kAudioUnitParameterUnit_Indexed - || info.unit == kAudioUnitParameterUnit_Boolean); - bool isBoolean = info.unit == kAudioUnitParameterUnit_Boolean; + paramIDToParameter.emplace (ids[i], parameter.get()); - auto label = [info]() -> String - { - if (info.unit == kAudioUnitParameterUnit_Percent) return "%"; - if (info.unit == kAudioUnitParameterUnit_Seconds) return "s"; - if (info.unit == kAudioUnitParameterUnit_Hertz) return "Hz"; - if (info.unit == kAudioUnitParameterUnit_Decibels) return "dB"; - if (info.unit == kAudioUnitParameterUnit_Milliseconds) return "ms"; - - return {}; - }(); - - auto parameter = std::make_unique (*this, - ids[i], - paramName, - info.minValue, - info.maxValue, - info.defaultValue, - (info.flags & kAudioUnitParameterFlag_NonRealTime) == 0, - isDiscrete, - isDiscrete ? (int) (info.maxValue - info.minValue + 1.0f) : AudioProcessor::getDefaultNumParameterSteps(), - isBoolean, - label, - (info.flags & kAudioUnitParameterFlag_ValuesHaveStrings) != 0); - - paramIDToParameter.emplace (ids[i], parameter.get()); + if (info.get().flags & kAudioUnitParameterFlag_HasClump) + { + auto groupInfo = groupIDMap.find (info.get().clumpID); - if (info.flags & kAudioUnitParameterFlag_HasClump) + if (groupInfo == groupIDMap.end()) { - auto groupInfo = groupIDMap.find (info.clumpID); - - if (groupInfo == groupIDMap.end()) - { - auto getClumpName = [this, info] - { - AudioUnitParameterNameInfo clumpNameInfo; - UInt32 clumpSz = sizeof (clumpNameInfo); - zerostruct (clumpNameInfo); - clumpNameInfo.inID = info.clumpID; - clumpNameInfo.inDesiredLength = (SInt32) 256; - - if (AudioUnitGetProperty (audioUnit, - kAudioUnitProperty_ParameterClumpName, - kAudioUnitScope_Global, - 0, - &clumpNameInfo, - &clumpSz) == noErr) - return String::fromCFString (clumpNameInfo.outName); - - return String (info.clumpID); - }; - - auto group = std::make_unique (String (info.clumpID), - getClumpName(), String()); - group->addChild (std::move (parameter)); - groupIDMap[info.clumpID] = group.get(); - newParameterTree.addChild (std::move (group)); - } - else + const auto clumpName = [this, &info] { - groupInfo->second->addChild (std::move (parameter)); - } + AudioUnitParameterNameInfo clumpNameInfo; + UInt32 clumpSz = sizeof (clumpNameInfo); + zerostruct (clumpNameInfo); + clumpNameInfo.inID = info.get().clumpID; + clumpNameInfo.inDesiredLength = (SInt32) 256; + + if (AudioUnitGetProperty (audioUnit, + kAudioUnitProperty_ParameterClumpName, + kAudioUnitScope_Global, + 0, + &clumpNameInfo, + &clumpSz) == noErr) + return String::fromCFString (clumpNameInfo.outName); + + return String (info.get().clumpID); + }(); + + auto group = std::make_unique (String (info.get().clumpID), + clumpName, String()); + group->addChild (std::move (parameter)); + groupIDMap[info.get().clumpID] = group.get(); + newParameterTree.addChild (std::move (group)); } else { - newParameterTree.addChild (std::move (parameter)); + groupInfo->second->addChild (std::move (parameter)); } } + else + { + newParameterTree.addChild (std::move (parameter)); + } } } } @@ -1513,10 +1860,11 @@ private: //============================================================================== - friend class AudioUnitPluginWindowCarbon; friend class AudioUnitPluginWindowCocoa; friend class AudioUnitPluginFormat; + CoreAudioTimeConversions timeConversions; + AudioComponentDescription componentDesc; AudioComponent auComponent; String pluginName, manufacturer, version; @@ -1642,10 +1990,10 @@ OwnedArray outputBufferList; AudioTimeStamp timeStamp; - AudioBuffer* currentBuffer = nullptr; + AudioBuffer inputBuffer; Array> supportedInLayouts, supportedOutLayouts; - int numChannelInfos; + int numChannelInfos, preparedChannels = 0, preparedSamples = 0; HeapBlock channelInfos; AudioUnit audioUnit; @@ -1655,6 +2003,7 @@ std::map paramIDToParameter; + AudioUnitFormatHelpers::SingleDirectionChannelMapping inMapping, outMapping; MidiDataConcatenator midiConcatenator; CriticalSection midiInLock; MidiBuffer incomingMidi; @@ -1778,6 +2127,7 @@ switch (prop.mPropertyID) { case kAudioUnitProperty_ParameterList: + updateParameterInfo(); updateHostDisplay (AudioProcessorListener::ChangeDetails().withParameterInfoChanged (true)); break; @@ -1801,40 +2151,124 @@ static void eventListenerCallback (void* userRef, void*, const AudioUnitEvent* event, UInt64, AudioUnitParameterValue value) { + JUCE_ASSERT_MESSAGE_THREAD jassert (event != nullptr); static_cast (userRef)->eventCallback (*event, value); } + + void updateParameterInfo() + { + for (const auto& idAndParam : paramIDToParameter) + { + const auto& id = idAndParam.first; + const auto& param = idAndParam.second; + + const ScopedAudioUnitParameterInfo info { audioUnit, id }; + + if (! info.isValid()) + continue; + + param->setName (getParamName (info.get())); + param->setLabel (getParamLabel (info.get())); + } + } #endif + /* Some fields in the AudioUnitParameterInfo may need to be released after use, + so we'll do that using RAII. + */ + class ScopedAudioUnitParameterInfo + { + public: + ScopedAudioUnitParameterInfo (AudioUnit au, UInt32 paramId) + { + auto sz = (UInt32) sizeof (info); + valid = noErr == AudioUnitGetProperty (au, + kAudioUnitProperty_ParameterInfo, + kAudioUnitScope_Global, + paramId, + &info, + &sz); + } + + ScopedAudioUnitParameterInfo (const ScopedAudioUnitParameterInfo&) = delete; + ScopedAudioUnitParameterInfo (ScopedAudioUnitParameterInfo&&) = delete; + ScopedAudioUnitParameterInfo& operator= (const ScopedAudioUnitParameterInfo&) = delete; + ScopedAudioUnitParameterInfo& operator= (ScopedAudioUnitParameterInfo&&) = delete; + + ~ScopedAudioUnitParameterInfo() noexcept + { + if ((info.flags & kAudioUnitParameterFlag_CFNameRelease) == 0) + return; + + if (info.cfNameString != nullptr) + CFRelease (info.cfNameString); + + if (info.unit == kAudioUnitParameterUnit_CustomUnit && info.unitName != nullptr) + CFRelease (info.unitName); + } + + bool isValid() const { return valid; } + + const AudioUnitParameterInfo& get() const noexcept { return info; } + + private: + AudioUnitParameterInfo info; + bool valid = false; + }; + + static String getParamName (const AudioUnitParameterInfo& info) + { + if ((info.flags & kAudioUnitParameterFlag_HasCFNameString) == 0) + return { info.name, sizeof (info.name) }; + + return String::fromCFString (info.cfNameString); + } + + static String getParamLabel (const AudioUnitParameterInfo& info) + { + if (info.unit == kAudioUnitParameterUnit_CustomUnit) return String::fromCFString (info.unitName); + if (info.unit == kAudioUnitParameterUnit_Percent) return "%"; + if (info.unit == kAudioUnitParameterUnit_Seconds) return "s"; + if (info.unit == kAudioUnitParameterUnit_Hertz) return "Hz"; + if (info.unit == kAudioUnitParameterUnit_Decibels) return "dB"; + if (info.unit == kAudioUnitParameterUnit_Milliseconds) return "ms"; + + return {}; + } + //============================================================================== OSStatus renderGetInput (AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 inBusNumber, UInt32 inNumberFrames, - AudioBufferList* ioData) const + AudioBufferList* ioData) { - if (currentBuffer != nullptr) + if (inputBuffer.getNumChannels() <= 0) { - // if this ever happens, might need to add extra handling - jassert (inNumberFrames == (UInt32) currentBuffer->getNumSamples()); - auto buffer = static_cast (inBusNumber) < getBusCount (true) - ? getBusBuffer (*currentBuffer, true, static_cast (inBusNumber)) - : AudioBuffer(); + jassertfalse; + return noErr; + } - for (int i = 0; i < static_cast (ioData->mNumberBuffers); ++i) - { - if (i < buffer.getNumChannels()) - { - memcpy (ioData->mBuffers[i].mData, - buffer.getReadPointer (i), - sizeof (float) * inNumberFrames); - } - else - { - zeromem (ioData->mBuffers[i].mData, - sizeof (float) * inNumberFrames); - } - } + // if this ever happens, might need to add extra handling + if (inputBuffer.getNumSamples() != (int) inNumberFrames) + { + jassertfalse; + return noErr; + } + + const auto buffer = static_cast (inBusNumber) < getBusCount (true) + ? getBusBuffer (inputBuffer, true, static_cast (inBusNumber)) + : AudioBuffer(); + + for (int juceChannel = 0; juceChannel < buffer.getNumChannels(); ++juceChannel) + { + const auto auChannel = (int) inMapping.getAuIndexForJuceChannel (inBusNumber, (size_t) juceChannel); + + if (auChannel < buffer.getNumChannels()) + memcpy (ioData->mBuffers[auChannel].mData, buffer.getReadPointer (juceChannel), sizeof (float) * inNumberFrames); + else + zeromem (ioData->mBuffers[auChannel].mData, sizeof (float) * inNumberFrames); } return noErr; @@ -1867,12 +2301,10 @@ { if (auto* ph = getPlayHead()) { - AudioPlayHead::CurrentPositionInfo result; - - if (ph->getCurrentPosition (result)) + if (const auto pos = ph->getPosition()) { - setIfNotNull (outCurrentBeat, result.ppqPosition); - setIfNotNull (outCurrentTempo, result.bpm); + setIfNotNull (outCurrentBeat, pos->getPpqPosition().orFallback (0.0)); + setIfNotNull (outCurrentTempo, pos->getBpm().orFallback (0.0)); return noErr; } } @@ -1887,14 +2319,13 @@ { if (auto* ph = getPlayHead()) { - AudioPlayHead::CurrentPositionInfo result; - - if (ph->getCurrentPosition (result)) + if (const auto pos = ph->getPosition()) { + const auto signature = pos->getTimeSignature().orFallback (AudioPlayHead::TimeSignature{}); setIfNotNull (outDeltaSampleOffsetToNextBeat, (UInt32) 0); //xxx - setIfNotNull (outTimeSig_Numerator, (UInt32) result.timeSigNumerator); - setIfNotNull (outTimeSig_Denominator, (UInt32) result.timeSigDenominator); - setIfNotNull (outCurrentMeasureDownBeat, result.ppqPositionOfLastBarStart); //xxx wrong + setIfNotNull (outTimeSig_Numerator, (UInt32) signature.numerator); + setIfNotNull (outTimeSig_Denominator, (UInt32) signature.denominator); + setIfNotNull (outCurrentMeasureDownBeat, pos->getPpqPositionOfLastBarStart().orFallback (0.0)); //xxx wrong return noErr; } } @@ -1980,29 +2411,6 @@ } //============================================================================== - static UInt64 GetCurrentHostTime (int numSamples, double sampleRate, bool isAUv3) noexcept - { - #if ! JUCE_IOS - if (! isAUv3) - return AudioGetCurrentHostTime(); - #else - ignoreUnused (isAUv3); - #endif - - UInt64 currentTime = mach_absolute_time(); - static mach_timebase_info_data_t sTimebaseInfo = { 0, 0 }; - - if (sTimebaseInfo.denom == 0) - mach_timebase_info (&sTimebaseInfo); - - auto bufferNanos = static_cast (numSamples) * 1.0e9 / sampleRate; - auto bufferTicks = static_cast (std::ceil (bufferNanos * (static_cast (sTimebaseInfo.denom) - / static_cast (sTimebaseInfo.numer)))); - currentTime += bufferTicks; - - return currentTime; - } - bool isBusCountWritable (bool isInput) const noexcept { UInt32 countSize; @@ -2017,28 +2425,16 @@ //============================================================================== int getElementCount (AudioUnitScope scope) const noexcept { - return static_cast (getElementCount (audioUnit, scope)); - } - - static int getElementCount (AudioUnit comp, AudioUnitScope scope) noexcept - { - UInt32 count; - UInt32 countSize = sizeof (count); - - auto err = AudioUnitGetProperty (comp, kAudioUnitProperty_ElementCount, scope, 0, &count, &countSize); - jassert (err == noErr); - ignoreUnused (err); - - return static_cast (count); + return static_cast (AudioUnitFormatHelpers::getElementCount (audioUnit, scope)); } //============================================================================== - void getBusProperties (bool isInput, int busIdx, String& busName, AudioChannelSet& currentLayout) const + void getBusProperties (bool isInput, UInt32 busIdx, String& busName, AudioChannelSet& currentLayout) const { getBusProperties (audioUnit, isInput, busIdx, busName, currentLayout); } - static void getBusProperties (AudioUnit comp, bool isInput, int busIdx, String& busName, AudioChannelSet& currentLayout) + static void getBusProperties (AudioUnit comp, bool isInput, UInt32 busIdx, String& busName, AudioChannelSet& currentLayout) { const AudioUnitScope scope = isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output; busName = (isInput ? "Input #" : "Output #") + String (busIdx + 1); @@ -2047,7 +2443,7 @@ CFObjectHolder busNameCF; UInt32 propertySize = sizeof (busNameCF.object); - if (AudioUnitGetProperty (comp, kAudioUnitProperty_ElementName, scope, static_cast (busIdx), &busNameCF.object, &propertySize) == noErr) + if (AudioUnitGetProperty (comp, kAudioUnitProperty_ElementName, scope, busIdx, &busNameCF.object, &propertySize) == noErr) if (busNameCF.object != nullptr) busName = nsStringToJuce ((NSString*) busNameCF.object); @@ -2055,7 +2451,7 @@ AudioChannelLayout auLayout; propertySize = sizeof (auLayout); - if (AudioUnitGetProperty (comp, kAudioUnitProperty_AudioChannelLayout, scope, static_cast (busIdx), &auLayout, &propertySize) == noErr) + if (AudioUnitGetProperty (comp, kAudioUnitProperty_AudioChannelLayout, scope, busIdx, &auLayout, &propertySize) == noErr) currentLayout = CoreAudioLayouts::fromCoreAudio (auLayout); } @@ -2064,7 +2460,7 @@ AudioStreamBasicDescription descr; propertySize = sizeof (descr); - if (AudioUnitGetProperty (comp, kAudioUnitProperty_StreamFormat, scope, static_cast (busIdx), &descr, &propertySize) == noErr) + if (AudioUnitGetProperty (comp, kAudioUnitProperty_StreamFormat, scope, busIdx, &descr, &propertySize) == noErr) currentLayout = AudioChannelSet::canonicalChannelSet (static_cast (descr.mChannelsPerFrame)); } } @@ -2398,7 +2794,10 @@ { const auto viewSize = [&controller] { - auto size = [controller preferredContentSize]; + auto size = CGSizeZero; + + if (@available (macOS 10.11, *)) + size = [controller preferredContentSize]; if (size.width == 0 || size.height == 0) size = controller.view.frame.size; @@ -2436,162 +2835,12 @@ } }; -#if JUCE_SUPPORT_CARBON - -//============================================================================== -class AudioUnitPluginWindowCarbon : public AudioProcessorEditor -{ -public: - AudioUnitPluginWindowCarbon (AudioUnitPluginInstance& p) - : AudioProcessorEditor (&p), - plugin (p), - audioComponent (nullptr), - viewComponent (nullptr) - { - innerWrapper.reset (new InnerWrapperComponent (*this)); - addAndMakeVisible (innerWrapper.get()); - - setOpaque (true); - setVisible (true); - setSize (400, 300); - - UInt32 propertySize; - if (AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_GetUIComponentList, - kAudioUnitScope_Global, 0, &propertySize, NULL) == noErr - && propertySize > 0) - { - HeapBlock views (propertySize / sizeof (AudioComponentDescription)); - - if (AudioUnitGetProperty (plugin.audioUnit, kAudioUnitProperty_GetUIComponentList, - kAudioUnitScope_Global, 0, &views[0], &propertySize) == noErr) - { - audioComponent = AudioComponentFindNext (nullptr, &views[0]); - } - } - } - - ~AudioUnitPluginWindowCarbon() - { - innerWrapper = nullptr; - - if (isValid()) - plugin.editorBeingDeleted (this); - } - - bool isValid() const noexcept { return audioComponent != nullptr; } - - //============================================================================== - void paint (Graphics& g) override - { - g.fillAll (Colours::black); - } - - void resized() override - { - if (innerWrapper != nullptr) - innerWrapper->setSize (getWidth(), getHeight()); - } - - //============================================================================== - bool keyStateChanged (bool) override { return false; } - bool keyPressed (const KeyPress&) override { return false; } - - //============================================================================== - AudioUnit getAudioUnit() const { return plugin.audioUnit; } - - AudioUnitCarbonView getViewComponent() - { - if (viewComponent == nullptr && audioComponent != nullptr) - AudioComponentInstanceNew (audioComponent, &viewComponent); - - return viewComponent; - } - - void closeViewComponent() - { - if (viewComponent != nullptr) - { - JUCE_AU_LOG ("Closing AU GUI: " + plugin.getName()); - - AudioComponentInstanceDispose (viewComponent); - viewComponent = nullptr; - } - } - -private: - //============================================================================== - AudioUnitPluginInstance& plugin; - AudioComponent audioComponent; - AudioUnitCarbonView viewComponent; - - //============================================================================== - class InnerWrapperComponent : public CarbonViewWrapperComponent - { - public: - InnerWrapperComponent (AudioUnitPluginWindowCarbon& w) : owner (w) {} - - ~InnerWrapperComponent() - { - deleteWindow(); - } - - HIViewRef attachView (WindowRef windowRef, HIViewRef rootView) override - { - JUCE_AU_LOG ("Opening AU GUI: " + owner.plugin.getName()); - - AudioUnitCarbonView carbonView = owner.getViewComponent(); - - if (carbonView == 0) - return 0; - - Float32Point pos = { 0, 0 }; - Float32Point size = { 250, 200 }; - HIViewRef pluginView = 0; - - AudioUnitCarbonViewCreate (carbonView, owner.getAudioUnit(), windowRef, rootView, - &pos, &size, (ControlRef*) &pluginView); - - return pluginView; - } - - void removeView (HIViewRef) override - { - owner.closeViewComponent(); - } - - private: - AudioUnitPluginWindowCarbon& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InnerWrapperComponent) - }; - - friend class InnerWrapperComponent; - std::unique_ptr innerWrapper; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioUnitPluginWindowCarbon) -}; - -#endif - //============================================================================== AudioProcessorEditor* AudioUnitPluginInstance::createEditor() { std::unique_ptr w (new AudioUnitPluginWindowCocoa (*this, false)); if (! static_cast (w.get())->isValid()) - w.reset(); - - #if JUCE_SUPPORT_CARBON - if (w == nullptr) - { - w.reset (new AudioUnitPluginWindowCarbon (*this)); - - if (! static_cast (w.get())->isValid()) - w.reset(); - } - #endif - - if (w == nullptr) w.reset (new AudioUnitPluginWindowCocoa (*this, true)); // use AUGenericView as a fallback return w.release(); @@ -2637,92 +2886,54 @@ double rate, int blockSize, PluginCreationCallback callback) { - using namespace AudioUnitFormatHelpers; + auto auComponentResult = getAudioComponent (*this, desc); - if (fileMightContainThisPluginType (desc.fileOrIdentifier)) + if (! auComponentResult.isValid()) { - String pluginName, version, manufacturer; - AudioComponentDescription componentDesc; - AudioComponent auComponent; - String errMessage = NEEDS_TRANS ("Cannot find AudioUnit from description"); - - if ((! getComponentDescFromIdentifier (desc.fileOrIdentifier, componentDesc, pluginName, version, manufacturer)) - && (! getComponentDescFromFile (desc.fileOrIdentifier, componentDesc, pluginName, version, manufacturer))) - { - callback (nullptr, errMessage); - return; - } - - if ((auComponent = AudioComponentFindNext (nullptr, &componentDesc)) == nullptr) - { - callback (nullptr, errMessage); - return; - } + callback (nullptr, std::move (auComponentResult.errorMessage)); + return; + } - if (AudioComponentGetDescription (auComponent, &componentDesc) != noErr) - { - callback (nullptr, errMessage); - return; - } + createAudioUnit (auComponentResult.component, + [rate, blockSize, origCallback = std::move (callback)] (AudioUnit audioUnit, OSStatus err) + { + if (err == noErr) + { + auto instance = std::make_unique (audioUnit); - struct AUAsyncInitializationCallback - { - typedef void (^AUCompletionCallbackBlock)(AudioComponentInstance, OSStatus); + if (instance->initialise (rate, blockSize)) + origCallback (std::move (instance), {}); + else + origCallback (nullptr, NEEDS_TRANS ("Unable to initialise the AudioUnit plug-in")); + } + else + { + auto errMsg = TRANS ("An OS error occurred during initialisation of the plug-in (XXX)"); + origCallback (nullptr, errMsg.replace ("XXX", String (err))); + } + }); +} - AUAsyncInitializationCallback (double inSampleRate, int inFramesPerBuffer, - PluginCreationCallback inOriginalCallback) - : sampleRate (inSampleRate), framesPerBuffer (inFramesPerBuffer), - originalCallback (std::move (inOriginalCallback)) - { - block = CreateObjCBlock (this, &AUAsyncInitializationCallback::completion); - } +void AudioUnitPluginFormat::createARAFactoryAsync (const PluginDescription& desc, ARAFactoryCreationCallback callback) +{ + auto auComponentResult = getAudioComponent (*this, desc); - AUCompletionCallbackBlock getBlock() noexcept { return block; } + if (! auComponentResult.isValid()) + { + callback ({ {}, "Failed to create AudioComponent for " + desc.descriptiveName }); + return; + } - void completion (AudioComponentInstance audioUnit, OSStatus err) + getOrCreateARAAudioUnit (auComponentResult.component, [cb = std::move (callback)] (auto dylibKeepAliveAudioUnit) + { + cb ([&]() -> ARAFactoryResult { - if (err == noErr) - { - std::unique_ptr instance (new AudioUnitPluginInstance (audioUnit)); - - if (instance->initialise (sampleRate, framesPerBuffer)) - originalCallback (std::move (instance), {}); - else - originalCallback (nullptr, NEEDS_TRANS ("Unable to initialise the AudioUnit plug-in")); - } - else - { - auto errMsg = TRANS ("An OS error occurred during initialisation of the plug-in (XXX)"); - originalCallback (nullptr, errMsg.replace ("XXX", String (err))); - } + if (dylibKeepAliveAudioUnit != nullptr) + return { ARAFactoryWrapper { ::juce::getARAFactory (std::move (dylibKeepAliveAudioUnit)) }, "" }; - delete this; - } - - double sampleRate; - int framesPerBuffer; - PluginCreationCallback originalCallback; - ObjCBlock block; - }; - - auto callbackBlock = new AUAsyncInitializationCallback (rate, blockSize, std::move (callback)); - - if ((componentDesc.componentFlags & kAudioComponentFlag_IsV3AudioUnit) != 0) - { - AudioComponentInstantiate (auComponent, kAudioComponentInstantiation_LoadOutOfProcess, - callbackBlock->getBlock()); - - return; - } - - AudioComponentInstance audioUnit; - auto err = AudioComponentInstanceNew(auComponent, &audioUnit); - callbackBlock->completion (err != noErr ? nullptr : audioUnit, err); - } - else - { - callback (nullptr, NEEDS_TRANS ("Plug-in description is not an AudioUnit plug-in")); - } + return { {}, "Failed to create ARAFactory from the provided AudioUnit" }; + }()); + }); } bool AudioUnitPluginFormat::requiresUnblockedMessageThreadDuringCreation (const PluginDescription& desc) const @@ -2736,8 +2947,10 @@ pluginName, version, manufacturer)) { if (AudioComponent auComp = AudioComponentFindNext (nullptr, &componentDesc)) + { if (AudioComponentGetDescription (auComp, &componentDesc) == noErr) - return ((componentDesc.componentFlags & kAudioComponentFlag_IsV3AudioUnit) != 0); + return AudioUnitFormatHelpers::isPluginAUv3 (componentDesc); + } } return false; @@ -2769,11 +2982,7 @@ || desc.componentType == kAudioUnitType_Mixer || desc.componentType == kAudioUnitType_MIDIProcessor) { - ignoreUnused (allowPluginsWhichRequireAsynchronousInstantiation); - - const auto isAUv3 = ((desc.componentFlags & kAudioComponentFlag_IsV3AudioUnit) != 0); - - if (allowPluginsWhichRequireAsynchronousInstantiation || ! isAUv3) + if (allowPluginsWhichRequireAsynchronousInstantiation || ! AudioUnitFormatHelpers::isPluginAUv3 (desc)) result.add (AudioUnitFormatHelpers::createPluginIdentifier (desc)); } } diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_AU_Shared.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_AU_Shared.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_AU_Shared.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_AU_Shared.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,6 +23,8 @@ ============================================================================== */ +#ifndef DOXYGEN + // This macro can be set if you need to override this internal name for some reason.. #ifndef JUCE_STATE_DICTIONARY_KEY #define JUCE_STATE_DICTIONARY_KEY "jucePluginState" @@ -31,8 +33,6 @@ namespace juce { -#ifndef DOXYGEN - struct AudioUnitHelpers { class ChannelRemapper @@ -157,13 +157,10 @@ AudioBuffer& getBuffer (UInt32 frames) noexcept { - #if JUCE_DEBUG - for (int i = 0; i < (int) channels.size(); ++i) - jassert (channels[(size_t) i] != nullptr); - #endif + jassert (std::none_of (channels.begin(), channels.end(), [] (auto* x) { return x == nullptr; })); - if (! channels.empty()) - mutableBuffer.setDataToReferTo (channels.data(), (int) channels.size(), static_cast (frames)); + const auto channelPtr = channels.empty() ? scratch.getArrayOfWritePointers() : channels.data(); + mutableBuffer.setDataToReferTo (channelPtr, (int) channels.size(), static_cast (frames)); return mutableBuffer; } @@ -215,25 +212,31 @@ } } - void clearInputBus (int index) + void clearInputBus (int index, int bufferLength) { if (isPositiveAndBelow (index, inputBusOffsets.size() - 1)) - clearChannels (inputBusOffsets[(size_t) index], inputBusOffsets[(size_t) (index + 1)]); + clearChannels ({ inputBusOffsets[(size_t) index], inputBusOffsets[(size_t) (index + 1)] }, bufferLength); } - void clearUnusedChannels() + void clearUnusedChannels (int bufferLength) { jassert (! inputBusOffsets .empty()); jassert (! outputBusOffsets.empty()); - clearChannels (inputBusOffsets.back(), outputBusOffsets.back()); + clearChannels ({ inputBusOffsets.back(), outputBusOffsets.back() }, bufferLength); } private: - void clearChannels (int begin, int end) + void clearChannels (Range range, int bufferLength) { - for (auto i = begin; i < end; ++i) - zeromem (scratch.getWritePointer (i), sizeof (float) * (size_t) scratch.getNumSamples()); + jassert (bufferLength <= scratch.getNumSamples()); + + if (range.getEnd() <= (int) channels.size()) + { + std::for_each (channels.begin() + range.getStart(), + channels.begin() + range.getEnd(), + [bufferLength] (float* ptr) { zeromem (ptr, sizeof (float) * (size_t) bufferLength); }); + } } float* uniqueBuffer (int idx, float* buffer) noexcept @@ -557,6 +560,6 @@ } }; -#endif - } // namespace juce + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LV2Common.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LV2Common.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LV2Common.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LV2Common.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,621 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#pragma once + +#ifndef DOXYGEN + +#include "juce_lv2_config.h" + +#ifdef Bool + #undef Bool // previously defined in X11/Xlib.h +#endif + +#ifdef verify + #undef verify // previously defined in macOS 10.11 SDK +#endif + +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wzero-as-null-pointer-constant", + "-Wcast-align", + "-Wparentheses", + "-Wnullability-extension", + "-Wsign-conversion") + +extern "C" +{ + #include "lilv/lilv/lilv.h" + #include "lv2/atom/atom.h" + #include "lv2/atom/forge.h" + #include "lv2/atom/util.h" + #include "lv2/buf-size/buf-size.h" + #include "lv2/data-access/data-access.h" + #include "lv2/dynmanifest/dynmanifest.h" + #include "lv2/instance-access/instance-access.h" + #include "lv2/log/log.h" + #include "lv2/midi/midi.h" + #include "lv2/options/options.h" + #include "lv2/parameters/parameters.h" + #include "lv2/patch/patch.h" + #include "lv2/port-groups/port-groups.h" + #include "lv2/presets/presets.h" + #include "lv2/resize-port/resize-port.h" + #include "lv2/state/state.h" + #include "lv2/time/time.h" + #include "lv2/ui/ui.h" + #include "lv2/units/units.h" + #include "lv2/worker/worker.h" + #include "serd/serd/serd.h" +} + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +#include +#include + +namespace juce +{ +namespace lv2_shared +{ + +class AtomForge +{ +public: + explicit AtomForge (LV2_URID_Map m) + : map { m }, + chunk { map.map (map.handle, LV2_ATOM__Chunk) } + { + lv2_atom_forge_init (&forge, &map); + } + + void setBuffer (void* buf, size_t size) + { + lv2_atom_forge_set_buffer (&forge, static_cast (buf), size); + } + + LV2_Atom_Forge* get() { return &forge; } + const LV2_Atom_Forge* get() const { return &forge; } + + void writeChunk (uint32_t size) + { + lv2_atom_forge_atom (&forge, size, chunk); + } + +private: + LV2_URID_Map map; + LV2_Atom_Forge forge; + const LV2_URID chunk; + + JUCE_LEAK_DETECTOR (AtomForge) +}; + +template +struct ScopedFrame +{ + template + explicit ScopedFrame (LV2_Atom_Forge* f, Args&&... args) + : forge (f) + { + Constructor::construct (forge, &frame, std::forward (args)...); + } + + ~ScopedFrame() { lv2_atom_forge_pop (forge, &frame); } + + LV2_Atom_Forge_Frame frame; + LV2_Atom_Forge* forge = nullptr; + + JUCE_DECLARE_NON_COPYABLE (ScopedFrame) + JUCE_DECLARE_NON_MOVEABLE (ScopedFrame) + JUCE_LEAK_DETECTOR (ScopedFrame) +}; + +struct SequenceTraits { static constexpr auto construct = lv2_atom_forge_sequence_head; }; +struct ObjectTraits { static constexpr auto construct = lv2_atom_forge_object; }; + +using SequenceFrame = ScopedFrame; +using ObjectFrame = ScopedFrame; + +struct NumericAtomParser +{ + explicit NumericAtomParser (LV2_URID_Map mapFeatureIn) + : mapFeature (mapFeatureIn) {} + + template struct Tag { LV2_URID urid; }; + + template + static Optional tryParse (const LV2_Atom&, const void*) + { + return {}; + } + + template + static Optional tryParse (const LV2_Atom& atom, const void* data, Tag head, Tag... tail) + { + if (atom.type == head.urid && atom.size == sizeof (Head)) + return static_cast (*reinterpret_cast (data)); + + return tryParse (atom, data, tail...); + } + + template + Optional parseNumericAtom (const LV2_Atom* atom, const void* data) const + { + if (atom == nullptr) + return {}; + + return tryParse (*atom, + data, + Tag { mLV2_ATOM__Bool }, + Tag { mLV2_ATOM__Int }, + Tag { mLV2_ATOM__Long }, + Tag { mLV2_ATOM__Float }, + Tag { mLV2_ATOM__Double }); + } + + template + Optional parseNumericAtom (const LV2_Atom* atom) const + { + return parseNumericAtom (atom, atom + 1); + } + + template + Optional parseNumericOption (const LV2_Options_Option* option) const + { + if (option != nullptr) + { + const LV2_Atom atom { option->size, option->type }; + return parseNumericAtom (&atom, option->value); + } + + return {}; + } + + LV2_URID map (const char* str) const { return mapFeature.map (mapFeature.handle, str); } + + const LV2_URID_Map mapFeature; + #define X(str) const LV2_URID m##str = map (str); + X (LV2_ATOM__Double) + X (LV2_ATOM__Float) + X (LV2_ATOM__Int) + X (LV2_ATOM__Long) + X (LV2_ATOM__Bool) + #undef X + + JUCE_LEAK_DETECTOR (NumericAtomParser) +}; + +//============================================================================== +struct PatchSetHelper +{ + PatchSetHelper (LV2_URID_Map mapFeatureIn, const char* pluginUri) + : parser (mapFeatureIn), + pluginUrid (parser.map (pluginUri)) + {} + + bool isPlugin (const LV2_Atom* subject) const + { + if (subject == nullptr) + return true; + + return subject->type == mLV2_ATOM__URID + && reinterpret_cast (subject)->body == pluginUrid; + } + + template + void processPatchSet (const LV2_Atom_Object* object, Callback&& callback) + { + if (object->body.otype != mLV2_PATCH__Set) + return; + + const LV2_Atom* subject = nullptr; + const LV2_Atom* property = nullptr; + const LV2_Atom* value = nullptr; + + LV2_Atom_Object_Query query[] { { mLV2_PATCH__subject, &subject }, + { mLV2_PATCH__property, &property }, + { mLV2_PATCH__value, &value }, + LV2_ATOM_OBJECT_QUERY_END }; + + lv2_atom_object_query (object, query); + + if (! isPlugin (subject)) + return; + + setPluginProperty (property, value, std::forward (callback)); + } + + template + void processPatchSet (const LV2_Atom_Event* event, Callback&& callback) + { + if (event->body.type == mLV2_ATOM__Object) + processPatchSet (reinterpret_cast (&event->body), std::forward (callback)); + } + + template + void setPluginProperty (const LV2_Atom* property, const LV2_Atom* value, Callback&& callback) + { + if (property == nullptr) + { + // No property was supplied. + jassertfalse; + return; + } + + if (property->type != mLV2_ATOM__URID) + { + // Set property is not a URID. + jassertfalse; + return; + } + + const auto parseResult = parser.parseNumericAtom (value); + + if (! parseResult.hasValue()) + { + // Didn't understand the type of this atom. + jassertfalse; + return; + } + + callback.setParameter (reinterpret_cast (property)->body, *parseResult); + } + + NumericAtomParser parser; + LV2_URID pluginUrid; + #define X(str) const LV2_URID m##str = parser.map (str); + X (LV2_ATOM__Bool) + X (LV2_ATOM__Object) + X (LV2_ATOM__URID) + X (LV2_PATCH__Set) + X (LV2_PATCH__property) + X (LV2_PATCH__subject) + X (LV2_PATCH__value) + #undef X + + JUCE_LEAK_DETECTOR (PatchSetHelper) +}; + +//============================================================================== +template +class Iterator +{ + using Container = typename Traits::Container; + using Iter = typename Traits::Iter; + +public: + using difference_type = ptrdiff_t; + using value_type = decltype (Traits::get (std::declval(), std::declval())); + using pointer = value_type*; + using reference = value_type; + using iterator_category = std::input_iterator_tag; + + /** Create iterator in end/sentinel state */ + Iterator() = default; + + /** Create iterator pointing to the beginning of this collection */ + explicit Iterator (Container p) noexcept + : container (p), iter (testEnd (Traits::begin (container))) {} + + Iterator begin() const noexcept { return *this; } + Iterator end() const noexcept { return {}; } + + bool operator== (const Iterator& other) const noexcept + { + return iter == nullptr && other.iter == nullptr; + } + + bool operator!= (const Iterator& other) const noexcept + { + return ! operator== (other); + } + + Iterator& operator++() + { + iter = testEnd (Traits::next (container, iter)); + return *this; + } + + Iterator operator++ (int) + { + auto copy = *this; + ++(*this); + return copy; + } + + reference operator*() const noexcept + { + return Traits::get (container, iter); + } + +private: + Iter testEnd (Iter i) const noexcept + { + return Traits::isEnd (container, i) ? Iter{} : i; + } + + Container container{}; + Iter iter{}; +}; + +//============================================================================== +struct SequenceWithSize +{ + SequenceWithSize() = default; + + SequenceWithSize (const LV2_Atom_Sequence_Body* bodyIn, size_t sizeIn) + : body (bodyIn), size (sizeIn) {} + + explicit SequenceWithSize (const LV2_Atom_Sequence* sequence) + : body (&sequence->body), size (sequence->atom.size) {} + + const LV2_Atom_Sequence_Body* body = nullptr; + size_t size = 0; + + JUCE_LEAK_DETECTOR (SequenceWithSize) +}; + +struct SequenceIteratorTraits +{ + using Container = SequenceWithSize; + using Iter = LV2_Atom_Event*; + + static LV2_Atom_Event* begin (const Container& s) noexcept + { + return lv2_atom_sequence_begin (s.body); + } + + static LV2_Atom_Event* next (const Container&, Iter it) noexcept + { + return lv2_atom_sequence_next (it); + } + + static bool isEnd (const Container& s, Iter it) noexcept + { + return lv2_atom_sequence_is_end (s.body, static_cast (s.size), it); + } + + static LV2_Atom_Event* get (const Container&, Iter e) noexcept { return e; } +}; + +using SequenceIterator = Iterator; + +const std::map channelDesignationMap +{ + { LV2_PORT_GROUPS__center, AudioChannelSet::ChannelType::centre }, + { LV2_PORT_GROUPS__centerLeft, AudioChannelSet::ChannelType::leftCentre }, + { LV2_PORT_GROUPS__centerRight, AudioChannelSet::ChannelType::rightCentre }, + { LV2_PORT_GROUPS__left, AudioChannelSet::ChannelType::left }, + { LV2_PORT_GROUPS__lowFrequencyEffects, AudioChannelSet::ChannelType::LFE }, + { LV2_PORT_GROUPS__rearCenter, AudioChannelSet::ChannelType::surround }, + { LV2_PORT_GROUPS__rearLeft, AudioChannelSet::ChannelType::leftSurroundRear }, + { LV2_PORT_GROUPS__rearRight, AudioChannelSet::ChannelType::rightSurroundRear }, + { LV2_PORT_GROUPS__right, AudioChannelSet::ChannelType::right }, + { LV2_PORT_GROUPS__sideLeft, AudioChannelSet::ChannelType::leftSurroundSide }, + { LV2_PORT_GROUPS__sideRight, AudioChannelSet::ChannelType::rightSurroundSide } +}; + +/* Useful for converting a `void*` to another type (X11 Window, function pointer etc.) without + invoking UB. +*/ +template +static auto wordCast (Word word) +{ + static_assert (sizeof (word) == sizeof (OtherWordType), "Word sizes must match"); + return readUnaligned (&word); +} + +//============================================================================== +struct SinglePortInfo +{ + uint32_t index; + AudioChannelSet::ChannelType designation; + bool optional; + + auto tie() const { return std::tie (index, designation, optional); } + bool operator== (const SinglePortInfo& other) const { return tie() == other.tie(); } + bool operator< (const SinglePortInfo& other) const { return index < other.index; } +}; + +struct ParsedGroup +{ + String uid; + std::set info; + + auto tie() const { return std::tie (uid, info); } + bool operator== (const ParsedGroup& other) const { return tie() == other.tie(); } + + static AudioChannelSet getEquivalentSet (const std::set& info) + { + const auto hasUnknownKind = [] (const SinglePortInfo& i) { return i.designation == AudioChannelSet::unknown; }; + + if (std::any_of (info.begin(), info.end(), hasUnknownKind)) + return AudioChannelSet::discreteChannels ((int) info.size()); + + AudioChannelSet result; + + for (const auto& port : info) + result.addChannel (port.designation); + + return result; + } + + AudioChannelSet getEquivalentSet() const noexcept { return getEquivalentSet (info); } + + bool isRequired() const + { + const auto getRequired = [] (const SinglePortInfo& i) { return ! i.optional; }; + return std::any_of (info.begin(), info.end(), getRequired); + } + + bool isCompatible (const AudioChannelSet& requestedBus) const + { + return requestedBus == getEquivalentSet() || (! isRequired() && requestedBus.isDisabled()); + } +}; + +struct ParsedBuses +{ + std::vector inputs, outputs; +}; + +class PortToAudioBufferMap +{ +public: + PortToAudioBufferMap (const AudioProcessor::BusesLayout& layout, const ParsedBuses& buses) + : PortToAudioBufferMap ({ layout.inputBuses, buses.inputs }, + { layout.outputBuses, buses.outputs }) + {} + + int getChannelForPort (uint32_t port) const + { + const auto it = ports.find (port); + return it != ports.end() ? it->second : -1; + } + +private: + PortToAudioBufferMap (const Array& host, + const std::vector& client) + : ports (getPortLayout (host, client)) + {} + + PortToAudioBufferMap (const PortToAudioBufferMap& inputs, + const PortToAudioBufferMap& outputs) + { + ports.insert (inputs.ports.begin(), inputs.ports.end()); + ports.insert (outputs.ports.begin(), outputs.ports.end()); + + // If this assertion is hit, some ports have duplicate indices + jassert (ports.size() == inputs.ports.size() + outputs.ports.size()); + } + + static std::map getPortLayout (const Array& layout, + const std::vector& parsedGroup) + { + if ((int) parsedGroup.size() != layout.size()) + { + // Something has gone very wrong when computing/applying bus layouts! + jassertfalse; + return {}; + } + + std::map result; + int channelOffsetOfBus = 0; + auto groupIterator = parsedGroup.begin(); + + for (const auto& bus : layout) + { + const auto& group = groupIterator->info; + + for (const auto& port : group) + { + const auto index = bus.getChannelIndexForType (port.designation); + + if (index >= 0) + result.emplace (port.index, channelOffsetOfBus + index); + } + + channelOffsetOfBus += bus.size(); + ++groupIterator; + } + + if ((int) result.size() != channelOffsetOfBus) + { + jassertfalse; + return {}; + } + + return result; + } + + std::map ports; + + JUCE_LEAK_DETECTOR (PortToAudioBufferMap) +}; + +// This will convert some grouped and ungrouped ports into a single collection of +// buses with a stable order. +// If any group has been marked as the main group, this will be placed first in the +// collection of results. The remaining groups will be sorted according to the +// indices of their ports. +// If there are no groups, all mandatory ports will be grouped into the first bus, +// and all remaining optional ports will have a separate bus each. +static inline std::vector findStableBusOrder (const String& mainGroupUid, + const std::map>& groupedPorts, + const std::set& ungroupedPorts) +{ + if (groupedPorts.empty()) + { + std::vector result; + + ParsedGroup mandatoryPorts; + + for (const auto& port : ungroupedPorts) + if (! port.optional) + mandatoryPorts.info.insert (port); + + if (! mandatoryPorts.info.empty()) + result.push_back (std::move (mandatoryPorts)); + + for (const auto& port : ungroupedPorts) + if (port.optional) + result.push_back ({ String{}, { port } }); + + return result; + } + + std::vector result; + + const auto pushGroup = [&] (const std::pair>& info) + { + result.push_back ({ info.first, info.second }); + }; + + const auto mainGroupIterator = groupedPorts.find (mainGroupUid); + + if (mainGroupIterator != groupedPorts.end()) + pushGroup (*mainGroupIterator); + + for (auto it = groupedPorts.begin(); it != groupedPorts.end(); ++it) + if (it != mainGroupIterator) + pushGroup (*it); + + for (const auto& info : ungroupedPorts) + result.push_back ({ String{}, { info } }); + + if (! result.empty()) + { + // It is an error for the same port to be a member of multiple groups. + // Therefore, a standard sort will always be stable, and we don't need to + // use an explicitly stable sort. + const auto compare = [] (const ParsedGroup& a, const ParsedGroup& b) { return a.info < b.info; }; + std::sort (std::next (result.begin()), result.end(), compare); + } + + return result; +} + +} +} + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,5614 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#if JUCE_PLUGINHOST_LV2 + +#include "juce_LV2Common.h" +#include "juce_LV2Resources.h" + +#include + +#include + +namespace juce +{ +namespace lv2_host +{ + +template +auto with (Struct s, Value Struct::* member, Value value) noexcept +{ + s.*member = std::move (value); + return s; +} + +/* Converts a void* to an LV2_Atom* if the buffer looks like it holds a well-formed Atom, or + returns nullptr otherwise. +*/ +static const LV2_Atom* convertToAtomPtr (const void* ptr, size_t size) +{ + if (size < sizeof (LV2_Atom)) + { + jassertfalse; + return nullptr; + } + + const auto header = readUnaligned (ptr); + + if (size < header.size + sizeof (LV2_Atom)) + { + jassertfalse; + return nullptr; + } + + // This is UB _if_ the ptr doesn't really point to an LV2_Atom. + return reinterpret_cast (ptr); +} + +// Allows mutable access to the items in a vector, without allowing the vector itself +// to be modified. +template +class SimpleSpan +{ +public: + constexpr SimpleSpan (T* beginIn, T* endIn) : b (beginIn), e (endIn) {} + + constexpr auto begin() const { return b; } + constexpr auto end() const { return e; } + + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4814) + constexpr auto& operator[] (size_t index) { return b[index]; } + JUCE_END_IGNORE_WARNINGS_MSVC + + constexpr auto size() const { return (size_t) (e - b); } + +private: + T* b; + T* e; +}; + +template +constexpr auto makeSimpleSpan (T* b, T* e) { return SimpleSpan { b, e }; } + +template +constexpr auto makeSimpleSpan (R& r) { return makeSimpleSpan (r.data(), r.data() + r.size()); } + +struct PhysicalResizeListener +{ + virtual ~PhysicalResizeListener() = default; + virtual void viewRequestedResizeInPhysicalPixels (int width, int height) = 0; +}; + +struct LogicalResizeListener +{ + virtual ~LogicalResizeListener() = default; + virtual void viewRequestedResizeInLogicalPixels (int width, int height) = 0; +}; + +#if JUCE_WINDOWS +class WindowSizeChangeDetector +{ +public: + WindowSizeChangeDetector() + : hook (SetWindowsHookEx (WH_CALLWNDPROC, + callWndProc, + (HINSTANCE) juce::Process::getCurrentModuleInstanceHandle(), + GetCurrentThreadId())) + {} + + ~WindowSizeChangeDetector() noexcept + { + UnhookWindowsHookEx (hook); + } + + static void addListener (HWND hwnd, PhysicalResizeListener& listener) + { + getActiveEditors().emplace (hwnd, &listener); + } + + static void removeListener (HWND hwnd) + { + getActiveEditors().erase (hwnd); + } + +private: + static std::map& getActiveEditors() + { + static std::map map; + return map; + } + + static void processMessage (int nCode, const CWPSTRUCT* info) + { + if (nCode < 0 || info == nullptr) + return; + + constexpr UINT events[] { WM_SIZING, WM_SIZE, WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED }; + + if (std::find (std::begin (events), std::end (events), info->message) == std::end (events)) + return; + + auto& map = getActiveEditors(); + auto iter = map.find (info->hwnd); + + if (iter == map.end()) + return; + + RECT rect; + GetWindowRect (info->hwnd, &rect); + iter->second->viewRequestedResizeInPhysicalPixels (rect.right - rect.left, rect.bottom - rect.top); + } + + static LRESULT CALLBACK callWndProc (int nCode, WPARAM wParam, LPARAM lParam) + { + processMessage (nCode, lv2_shared::wordCast (lParam)); + return CallNextHookEx ({}, nCode, wParam, lParam); + } + + HHOOK hook; +}; + +class WindowSizeChangeListener +{ +public: + WindowSizeChangeListener (HWND hwndIn, PhysicalResizeListener& l) + : hwnd (hwndIn) + { + detector->addListener (hwnd, l); + } + + ~WindowSizeChangeListener() + { + detector->removeListener (hwnd); + } + +private: + SharedResourcePointer detector; + HWND hwnd; + + JUCE_LEAK_DETECTOR (WindowSizeChangeListener) +}; +#endif + +struct FreeLilvNode +{ + void operator() (LilvNode* ptr) const noexcept { lilv_node_free (ptr); } +}; + +using OwningNode = std::unique_ptr; + +template +class TypesafeLilvNode +{ +public: + template + TypesafeLilvNode (Ts&&... ts) + : node (Traits::construct (std::forward (ts)...)) {} + + bool equals (const TypesafeLilvNode& other) const noexcept + { + return lilv_node_equals (node.get(), other.node.get()); + } + + const LilvNode* get() const noexcept { return node.get(); } + + auto getTyped() const noexcept -> decltype (Traits::access (nullptr)) + { + return Traits::access (node.get()); + } + + static TypesafeLilvNode claim (LilvNode* node) + { + return TypesafeLilvNode { node }; + } + + static TypesafeLilvNode copy (const LilvNode* node) + { + return TypesafeLilvNode { lilv_node_duplicate (node) }; + } + +private: + explicit TypesafeLilvNode (LilvNode* ptr) + : node (ptr) + { + jassert (ptr == nullptr || Traits::verify (node.get())); + } + + OwningNode node; + + JUCE_LEAK_DETECTOR (TypesafeLilvNode) +}; + +struct UriConstructorTrait +{ + static LilvNode* construct (LilvWorld* world, const char* uri) noexcept + { + return lilv_new_uri (world, uri); + } + + static LilvNode* construct (LilvWorld* world, const char* host, const char* path) noexcept + { + return lilv_new_file_uri (world, host, path); + } + + static constexpr auto verify = lilv_node_is_uri; + static constexpr auto access = lilv_node_as_uri; +}; + +struct StringConstructorTrait { static constexpr auto construct = lilv_new_string; + static constexpr auto verify = lilv_node_is_string; + static constexpr auto access = lilv_node_as_string; }; + +using NodeUri = TypesafeLilvNode; +using NodeString = TypesafeLilvNode; + +struct UsefulUris +{ + explicit UsefulUris (LilvWorld* worldIn) + : world (worldIn) {} + + LilvWorld* const world = nullptr; + + #define X(str) const NodeUri m##str { world, str }; + X (LV2_ATOM__AtomPort) + X (LV2_ATOM__atomTransfer) + X (LV2_ATOM__eventTransfer) + X (LV2_CORE__AudioPort) + X (LV2_CORE__CVPort) + X (LV2_CORE__ControlPort) + X (LV2_CORE__GeneratorPlugin) + X (LV2_CORE__InputPort) + X (LV2_CORE__InstrumentPlugin) + X (LV2_CORE__OutputPort) + X (LV2_CORE__enumeration) + X (LV2_CORE__integer) + X (LV2_CORE__toggled) + X (LV2_RESIZE_PORT__minimumSize) + X (LV2_UI__floatProtocol) + X (LV2_WORKER__interface) + #undef X +}; + +template +struct OwningPtrTraits +{ + using type = std::unique_ptr; + static const Ptr* get (const type& t) noexcept { return t.get(); } +}; + +template +struct NonOwningPtrTraits +{ + using type = const Ptr*; + static const Ptr* get (const type& t) noexcept { return t; } +}; + +struct PluginsIteratorTraits +{ + using Container = const LilvPlugins*; + using Iter = LilvIter*; + static constexpr auto begin = lilv_plugins_begin; + static constexpr auto next = lilv_plugins_next; + static constexpr auto isEnd = lilv_plugins_is_end; + static constexpr auto get = lilv_plugins_get; +}; + +using PluginsIterator = lv2_shared::Iterator; + +struct PluginClassesIteratorTraits +{ + using Container = const LilvPluginClasses*; + using Iter = LilvIter*; + static constexpr auto begin = lilv_plugin_classes_begin; + static constexpr auto next = lilv_plugin_classes_next; + static constexpr auto isEnd = lilv_plugin_classes_is_end; + static constexpr auto get = lilv_plugin_classes_get; +}; + +using PluginClassesIterator = lv2_shared::Iterator; + +struct NodesIteratorTraits +{ + using Container = const LilvNodes*; + using Iter = LilvIter*; + static constexpr auto begin = lilv_nodes_begin; + static constexpr auto next = lilv_nodes_next; + static constexpr auto isEnd = lilv_nodes_is_end; + static constexpr auto get = lilv_nodes_get; +}; + +using NodesIterator = lv2_shared::Iterator; + +struct ScalePointsIteratorTraits +{ + using Container = const LilvScalePoints*; + using Iter = LilvIter*; + static constexpr auto begin = lilv_scale_points_begin; + static constexpr auto next = lilv_scale_points_next; + static constexpr auto isEnd = lilv_scale_points_is_end; + static constexpr auto get = lilv_scale_points_get; +}; + +using ScalePointsIterator = lv2_shared::Iterator; + +struct UisIteratorTraits +{ + using Container = const LilvUIs*; + using Iter = LilvIter*; + static constexpr auto begin = lilv_uis_begin; + static constexpr auto next = lilv_uis_next; + static constexpr auto isEnd = lilv_uis_is_end; + static constexpr auto get = lilv_uis_get; +}; + +using UisIterator = lv2_shared::Iterator; + +template +class NodesImpl +{ +public: + using type = typename PtrTraits::type; + + template + explicit NodesImpl (Ptr* ptr) + : nodes (type { ptr }) {} + + explicit NodesImpl (type ptr) + : nodes (std::move (ptr)) {} + + unsigned size() const noexcept { return lilv_nodes_size (PtrTraits::get (nodes)); } + + NodesIterator begin() const noexcept + { + return nodes == nullptr ? NodesIterator{} + : NodesIterator { PtrTraits::get (nodes) }; + } + + NodesIterator end() const noexcept { return {}; } + +private: + type nodes{}; +}; + +struct NodesFree +{ + void operator() (LilvNodes* ptr) const noexcept { lilv_nodes_free (ptr); } +}; + +using OwningNodes = NodesImpl>; +using NonOwningNodes = NodesImpl>; + +class ScalePoints +{ +public: + explicit ScalePoints (const LilvScalePoints* pt) + : points (pt) {} + + ScalePointsIterator begin() const noexcept + { + return points == nullptr ? ScalePointsIterator{} + : ScalePointsIterator { points }; + } + + ScalePointsIterator end() const noexcept { return {}; } + +private: + const LilvScalePoints* points = nullptr; +}; + +class ScalePoint +{ +public: + explicit ScalePoint (const LilvScalePoint* pt) + : point (pt) {} + + const LilvNode* getLabel() const noexcept { return lilv_scale_point_get_label (point); } + const LilvNode* getValue() const noexcept { return lilv_scale_point_get_value (point); } + +private: + const LilvScalePoint* point = nullptr; +}; + +struct PortRange +{ + float defaultValue, min, max; +}; + +class Port +{ +public: + enum class Kind + { + control, + audio, + cv, + atom, + unknown, + }; + + enum class Direction + { + input, + output, + unknown, + }; + + Port (const LilvPlugin* pluginIn, const LilvPort* portIn) + : plugin (pluginIn), port (portIn) {} + + Direction getDirection (const UsefulUris& uris) const noexcept + { + if (isA (uris.mLV2_CORE__InputPort)) + return Direction::input; + + if (isA (uris.mLV2_CORE__OutputPort)) + return Direction::output; + + return Direction::unknown; + } + + Kind getKind (const UsefulUris& uris) const noexcept + { + if (isA (uris.mLV2_CORE__ControlPort)) + return Kind::control; + + if (isA (uris.mLV2_CORE__AudioPort)) + return Kind::audio; + + if (isA (uris.mLV2_CORE__CVPort)) + return Kind::cv; + + if (isA (uris.mLV2_ATOM__AtomPort)) + return Kind::atom; + + return Kind::unknown; + } + + OwningNode get (const LilvNode* predicate) const noexcept + { + return OwningNode { lilv_port_get (plugin, port, predicate) }; + } + + NonOwningNodes getClasses() const noexcept + { + return NonOwningNodes { lilv_port_get_classes (plugin, port) }; + } + + NodeString getName() const noexcept + { + return NodeString::claim (lilv_port_get_name (plugin, port)); + } + + NodeString getSymbol() const noexcept + { + return NodeString::copy (lilv_port_get_symbol (plugin, port)); + } + + OwningNodes getProperties() const noexcept + { + return OwningNodes { lilv_port_get_properties (plugin, port) }; + } + + ScalePoints getScalePoints() const noexcept + { + return ScalePoints { lilv_port_get_scale_points (plugin, port) }; + } + + bool hasProperty (const NodeUri& uri) const noexcept + { + return lilv_port_has_property (plugin, port, uri.get()); + } + + uint32_t getIndex() const noexcept { return lilv_port_get_index (plugin, port); } + + static float getFloatValue (const LilvNode* node, float fallback) + { + if (lilv_node_is_float (node) || lilv_node_is_int (node)) + return lilv_node_as_float (node); + + return fallback; + } + + bool supportsEvent (const LilvNode* node) const noexcept + { + return lilv_port_supports_event (plugin, port, node); + } + + PortRange getRange() const noexcept + { + LilvNode* def = nullptr; + LilvNode* min = nullptr; + LilvNode* max = nullptr; + + lilv_port_get_range (plugin, port, &def, &min, &max); + + const OwningNode defOwner { def }; + const OwningNode minOwner { min }; + const OwningNode maxOwner { max }; + + return { getFloatValue (def, 0.0f), + getFloatValue (min, 0.0f), + getFloatValue (max, 1.0f) }; + } + + bool isValid() const noexcept { return port != nullptr; } + +private: + bool isA (const NodeUri& uri) const noexcept + { + return lilv_port_is_a (plugin, port, uri.get()); + } + + const LilvPlugin* plugin = nullptr; + const LilvPort* port = nullptr; + + JUCE_LEAK_DETECTOR (Port) +}; + +class Plugin +{ +public: + explicit Plugin (const LilvPlugin* p) : plugin (p) {} + + bool verify() const noexcept { return lilv_plugin_verify (plugin); } + NodeUri getUri() const noexcept { return NodeUri::copy (lilv_plugin_get_uri (plugin)); } + NodeUri getBundleUri() const noexcept { return NodeUri::copy (lilv_plugin_get_bundle_uri (plugin)); } + NodeUri getLibraryUri() const noexcept { return NodeUri::copy (lilv_plugin_get_library_uri (plugin)); } + NodeString getName() const noexcept { return NodeString::claim (lilv_plugin_get_name (plugin)); } + NodeString getAuthorName() const noexcept { return NodeString::claim (lilv_plugin_get_author_name (plugin)); } + uint32_t getNumPorts() const noexcept { return lilv_plugin_get_num_ports (plugin); } + const LilvPluginClass* getClass() const noexcept { return lilv_plugin_get_class (plugin); } + OwningNodes getValue (const LilvNode* predicate) const noexcept { return OwningNodes { lilv_plugin_get_value (plugin, predicate) }; } + + Port getPortByIndex (uint32_t index) const noexcept + { + return Port { plugin, lilv_plugin_get_port_by_index (plugin, index) }; + } + + Port getPortByDesignation (const LilvNode* portClass, const LilvNode* designation) const noexcept + { + return Port { plugin, lilv_plugin_get_port_by_designation (plugin, portClass, designation) }; + } + + OwningNodes getRequiredFeatures() const noexcept + { + return OwningNodes { lilv_plugin_get_required_features (plugin) }; + } + + OwningNodes getOptionalFeatures() const noexcept + { + return OwningNodes { lilv_plugin_get_optional_features (plugin) }; + } + + bool hasExtensionData (const NodeUri& uri) const noexcept + { + return lilv_plugin_has_extension_data (plugin, uri.get()); + } + + bool hasFeature (const NodeUri& uri) const noexcept + { + return lilv_plugin_has_feature (plugin, uri.get()); + } + + template + uint32_t getNumPortsOfClass (const Classes&... classes) const noexcept + { + return lilv_plugin_get_num_ports_of_class (plugin, classes.get()..., 0); + } + + const LilvPlugin* get() const noexcept { return plugin; } + + bool hasLatency() const noexcept { return lilv_plugin_has_latency (plugin); } + uint32_t getLatencyPortIndex() const noexcept { return lilv_plugin_get_latency_port_index (plugin); } + +private: + const LilvPlugin* plugin = nullptr; + + JUCE_LEAK_DETECTOR (Plugin) +}; + +/* + This is very similar to the symap implementation in jalv. +*/ +class SymbolMap +{ +public: + SymbolMap() = default; + + SymbolMap (std::initializer_list uris) + { + for (const auto* str : uris) + map (str); + } + + LV2_URID map (const char* uri) + { + const auto comparator = [this] (size_t index, const String& str) + { + return strings[index] < str; + }; + + const auto uriString = String::fromUTF8 (uri); + const auto it = std::lower_bound (indices.cbegin(), indices.cend(), uriString, comparator); + + if (it != indices.cend() && strings[*it] == uriString) + return static_cast (*it + 1); + + const auto index = strings.size(); + indices.insert (it, index); + strings.push_back (uriString); + return static_cast (index + 1); + } + + const char* unmap (LV2_URID urid) const + { + const auto index = urid - 1; + return index < strings.size() ? strings[index].toRawUTF8() + : nullptr; + } + + static LV2_URID mapUri (LV2_URID_Map_Handle handle, const char* uri) + { + return static_cast (handle)->map (uri); + } + + static const char* unmapUri (LV2_URID_Unmap_Handle handle, LV2_URID urid) + { + return static_cast (handle)->unmap (urid); + } + + LV2_URID_Map getMapFeature() { return { this, mapUri }; } + LV2_URID_Unmap getUnmapFeature() { return { this, unmapUri }; } + +private: + std::vector strings; + std::vector indices; + + JUCE_LEAK_DETECTOR (SymbolMap) +}; + +struct UsefulUrids +{ + explicit UsefulUrids (SymbolMap& m) : symap (m) {} + + SymbolMap& symap; + + #define X(token) const LV2_URID m##token = symap.map (token); + X (LV2_ATOM__Bool) + X (LV2_ATOM__Double) + X (LV2_ATOM__Float) + X (LV2_ATOM__Int) + X (LV2_ATOM__Long) + X (LV2_ATOM__Object) + X (LV2_ATOM__Sequence) + X (LV2_ATOM__atomTransfer) + X (LV2_ATOM__beatTime) + X (LV2_ATOM__eventTransfer) + X (LV2_ATOM__frameTime) + X (LV2_LOG__Error) + X (LV2_LOG__Note) + X (LV2_LOG__Trace) + X (LV2_LOG__Warning) + X (LV2_MIDI__MidiEvent) + X (LV2_PATCH__Set) + X (LV2_PATCH__property) + X (LV2_PATCH__value) + X (LV2_STATE__StateChanged) + X (LV2_TIME__Position) + X (LV2_TIME__barBeat) + X (LV2_TIME__beat) + X (LV2_TIME__beatUnit) + X (LV2_TIME__beatsPerBar) + X (LV2_TIME__beatsPerMinute) + X (LV2_TIME__frame) + X (LV2_TIME__speed) + X (LV2_TIME__bar) + X (LV2_UI__floatProtocol) + X (LV2_UNITS__beat) + X (LV2_UNITS__frame) + #undef X +}; + +class Log +{ +public: + explicit Log (const UsefulUrids* u) : urids (u) {} + + LV2_Log_Log* getLogFeature() { return &logFeature; } + +private: + int vprintfCallback (LV2_URID type, const char* fmt, va_list ap) const + { + // If this is hit, the plugin has encountered some kind of error + jassertquiet (type != urids->mLV2_LOG__Error && type != urids->mLV2_LOG__Warning); + return std::vfprintf (stderr, fmt, ap); + } + + static int vprintfCallback (LV2_Log_Handle handle, + LV2_URID type, + const char* fmt, + va_list ap) + { + return static_cast (handle)->vprintfCallback (type, fmt, ap); + } + + static int printfCallback (LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...) + { + va_list list; + va_start (list, fmt); + auto result = vprintfCallback (handle, type, fmt, list); + va_end (list); + return result; + } + + const UsefulUrids* urids = nullptr; + LV2_Log_Log logFeature { this, printfCallback, vprintfCallback }; + + JUCE_LEAK_DETECTOR (Log) +}; + +struct Features +{ + explicit Features (std::vector&& f) + : features (std::move (f)) {} + + static std::vector getUris (const std::vector& features) + { + std::vector result; + result.reserve (features.size()); + + for (const auto& feature : features) + result.push_back (String::fromUTF8 (feature.URI)); + + return result; + } + + std::vector features; + std::vector pointers = makeNullTerminatedArray(); + +private: + std::vector makeNullTerminatedArray() + { + std::vector result; + result.reserve (features.size() + 1); + + for (const auto& feature : features) + result.push_back (&feature); + + result.push_back (nullptr); + + return result; + } + + JUCE_LEAK_DETECTOR (Features) +}; + +template +struct OptionalExtension +{ + OptionalExtension() = default; + + explicit OptionalExtension (Extension extensionIn) : extension (extensionIn), valid (true) {} + + Extension extension; + bool valid = false; +}; + +class Instance +{ + struct Free + { + void operator() (LilvInstance* ptr) const noexcept { lilv_instance_free (ptr); } + }; + +public: + using Ptr = std::unique_ptr; + using GetExtensionData = const void* (*) (const char*); + + Instance (const Plugin& pluginIn, double sampleRate, const LV2_Feature* const* features) + : plugin (pluginIn), + instance (lilv_plugin_instantiate (plugin.get(), sampleRate, features)) {} + + void activate() { lilv_instance_activate (instance.get()); } + void run (uint32_t sampleCount) { lilv_instance_run (instance.get(), sampleCount); } + void deactivate() { lilv_instance_deactivate (instance.get()); } + + const char* getUri() const noexcept { return lilv_instance_get_uri (instance.get()); } + + LV2_Handle getHandle() const noexcept { return lilv_instance_get_handle (instance.get()); } + + LilvInstance* get() const noexcept { return instance.get(); } + + void connectPort (uint32_t index, void* data) + { + lilv_instance_connect_port (instance.get(), index, data); + } + + template + OptionalExtension getExtensionData (const NodeUri& uri) const noexcept + { + if (plugin.get() == nullptr || ! plugin.hasExtensionData (uri) || instance.get() == nullptr) + return {}; + + return OptionalExtension { readUnaligned (lilv_instance_get_extension_data (instance.get(), uri.getTyped())) }; + } + + GetExtensionData getExtensionDataCallback() const noexcept + { + return instance->lv2_descriptor->extension_data; + } + + bool operator== (std::nullptr_t) const noexcept { return instance == nullptr; } + bool operator!= (std::nullptr_t) const noexcept { return ! (*this == nullptr); } + +private: + Plugin plugin; + Ptr instance; + + JUCE_LEAK_DETECTOR (Instance) +}; + +enum class Realtime { no, yes }; + +// Must be trivial! +struct WorkResponder +{ + static WorkResponder getDefault() { return { nullptr, nullptr }; } + + LV2_Worker_Status processResponse (uint32_t size, const void* data) const + { + return worker->work_response (handle, size, data); + } + + bool isValid() const { return handle != nullptr && worker != nullptr; } + + LV2_Handle handle; + const LV2_Worker_Interface* worker; +}; + +struct WorkerResponseListener +{ + virtual ~WorkerResponseListener() = default; + virtual LV2_Worker_Status responseGenerated (WorkResponder, uint32_t, const void*) = 0; +}; + +struct RespondHandle +{ + LV2_Worker_Status respond (uint32_t size, const void* data) const + { + if (realtime == Realtime::yes) + return listener.responseGenerated (responder, size, data); + + return responder.processResponse (size, data); + } + + static LV2_Worker_Status respond (LV2_Worker_Respond_Handle handle, + uint32_t size, + const void* data) + { + return static_cast (handle)->respond (size, data); + } + + WorkResponder responder; + WorkerResponseListener& listener; + Realtime realtime; +}; + +// Must be trivial! +struct WorkSubmitter +{ + static WorkSubmitter getDefault() { return { nullptr, nullptr, nullptr, nullptr }; } + + LV2_Worker_Status doWork (Realtime realtime, uint32_t size, const void* data) const + { + // The Worker spec says that the host "MUST NOT make concurrent calls to [work] from + // several threads". + // Taking the work mutex here ensures that only one piece of work is done at a time. + // If we didn't take the work mutex, there would be a danger of work happening + // simultaneously on the worker thread and the render thread when switching between + // realtime/offline modes (in realtime mode, work happens on the worker thread; in + // offline mode, work happens immediately on the render/audio thread). + const ScopedLock lock (*workMutex); + + RespondHandle respondHandle { WorkResponder { handle, worker }, *listener, realtime }; + return worker->work (handle, RespondHandle::respond, &respondHandle, size, data); + } + + bool isValid() const { return handle != nullptr && worker != nullptr && listener != nullptr && workMutex != nullptr; } + + LV2_Handle handle; + const LV2_Worker_Interface* worker; + WorkerResponseListener* listener; + CriticalSection* workMutex; +}; + +template ::value, int> = 0> +static auto toChars (Trivial value) +{ + std::array result; + writeUnaligned (result.data(), value); + return result; +} + +template +class WorkQueue +{ +public: + static_assert (std::is_trivial::value, "Context must be copyable as bytes"); + + explicit WorkQueue (int size) + : fifo (size), data (static_cast (size)) {} + + LV2_Worker_Status push (Context context, size_t size, const void* contents) + { + const auto* bytes = static_cast (contents); + const auto numToWrite = sizeof (Header) + size; + + if (static_cast (fifo.getFreeSpace()) < numToWrite) + return LV2_WORKER_ERR_NO_SPACE; + + Header header { size, context }; + const auto headerBuffer = toChars (header); + + const auto scope = fifo.write (static_cast (numToWrite)); + jassert (scope.blockSize1 + scope.blockSize2 == static_cast (numToWrite)); + + size_t index = 0; + scope.forEach ([&] (int i) + { + data[static_cast (i)] = index < headerBuffer.size() ? headerBuffer[index] + : bytes[index - headerBuffer.size()]; + ++index; + }); + + return LV2_WORKER_SUCCESS; + } + + Context pop (std::vector& dest) + { + // If the vector is too small we'll have to resize it on the audio thread + jassert (dest.capacity() >= data.size()); + dest.clear(); + + const auto numReady = fifo.getNumReady(); + + if (static_cast (numReady) < sizeof (Header)) + { + jassert (numReady == 0); + return Context::getDefault(); + } + + std::array headerBuffer; + + { + size_t index = 0; + fifo.read (sizeof (Header)).forEach ([&] (int i) + { + headerBuffer[index++] = data[static_cast (i)]; + }); + } + + const auto header = readUnaligned
(headerBuffer.data()); + + jassert (static_cast (fifo.getNumReady()) >= header.size); + + dest.resize (header.size); + + { + size_t index = 0; + fifo.read (static_cast (header.size)).forEach ([&] (int i) + { + dest[index++] = data[static_cast (i)]; + }); + } + + return header.context; + } + +private: + struct Header + { + size_t size; + Context context; + }; + + AbstractFifo fifo; + std::vector data; + + JUCE_LEAK_DETECTOR (WorkQueue) +}; + +/* + Keeps track of active plugin instances, so that we can avoid sending work + messages to dead plugins. +*/ +class HandleRegistry +{ +public: + void insert (LV2_Handle handle) + { + const SpinLock::ScopedLockType lock (mutex); + handles.insert (handle); + } + + void erase (LV2_Handle handle) + { + const SpinLock::ScopedLockType lock (mutex); + handles.erase (handle); + } + + template + LV2_Worker_Status ifContains (LV2_Handle handle, Fn&& callback) + { + const SpinLock::ScopedLockType lock (mutex); + + if (handles.find (handle) != handles.cend()) + return callback(); + + return LV2_WORKER_ERR_UNKNOWN; + } + +private: + std::set handles; + SpinLock mutex; + + JUCE_LEAK_DETECTOR (HandleRegistry) +}; + +/* + Implements an LV2 Worker, allowing work to be scheduled in realtime + by the plugin instance. + + IMPORTANT this will die pretty hard if `getExtensionData (LV2_WORKER__interface)` + returns garbage, so make sure to check that the plugin `hasExtensionData` before + constructing one of these! +*/ +class SharedThreadedWorker : public WorkerResponseListener +{ +public: + ~SharedThreadedWorker() noexcept override + { + shouldExit = true; + thread.join(); + } + + LV2_Worker_Status schedule (WorkSubmitter submitter, + uint32_t size, + const void* data) + { + return registry.ifContains (submitter.handle, [&] + { + return incoming.push (submitter, size, data); + }); + } + + LV2_Worker_Status responseGenerated (WorkResponder responder, + uint32_t size, + const void* data) override + { + return registry.ifContains (responder.handle, [&] + { + return outgoing.push (responder, size, data); + }); + } + + void processResponses() + { + for (;;) + { + auto workerResponder = outgoing.pop (message); + + if (! message.empty() && workerResponder.isValid()) + workerResponder.processResponse (static_cast (message.size()), message.data()); + else + break; + } + } + + void registerHandle (LV2_Handle handle) { registry.insert (handle); } + void deregisterHandle (LV2_Handle handle) { registry.erase (handle); } + +private: + static constexpr auto queueSize = 8192; + std::atomic shouldExit { false }; + WorkQueue incoming { queueSize }; + WorkQueue outgoing { queueSize }; + std::vector message = std::vector (queueSize); + std::thread thread { [this] + { + std::vector buffer (queueSize); + + while (! shouldExit) + { + const auto submitter = incoming.pop (buffer); + + if (! buffer.empty() && submitter.isValid()) + submitter.doWork (Realtime::yes, (uint32_t) buffer.size(), buffer.data()); + else + std::this_thread::sleep_for (std::chrono::milliseconds (1)); + } + } }; + HandleRegistry registry; + + JUCE_LEAK_DETECTOR (SharedThreadedWorker) +}; + +struct HandleHolder +{ + virtual ~HandleHolder() = default; + virtual LV2_Handle getHandle() const = 0; + virtual const LV2_Worker_Interface* getWorkerInterface() const = 0; +}; + +class WorkScheduler +{ +public: + explicit WorkScheduler (HandleHolder& handleHolderIn) + : handleHolder (handleHolderIn) {} + + void processResponses() { workerThread->processResponses(); } + + LV2_Worker_Schedule& getWorkerSchedule() { return schedule; } + + void setNonRealtime (bool nonRealtime) { realtime = ! nonRealtime; } + + void registerHandle (LV2_Handle handle) { workerThread->registerHandle (handle); } + void deregisterHandle (LV2_Handle handle) { workerThread->deregisterHandle (handle); } + +private: + LV2_Worker_Status scheduleWork (uint32_t size, const void* data) + { + WorkSubmitter submitter { handleHolder.getHandle(), + handleHolder.getWorkerInterface(), + workerThread, + &workMutex }; + + // If we're in realtime mode, the work should go onto a background thread, + // and we'll process it later. + // If we're offline, we can just do the work immediately, without worrying about + // drop-outs + return realtime ? workerThread->schedule (submitter, size, data) + : submitter.doWork (Realtime::no, size, data); + } + + static LV2_Worker_Status scheduleWork (LV2_Worker_Schedule_Handle handle, + uint32_t size, + const void* data) + { + return static_cast (handle)->scheduleWork (size, data); + } + + SharedResourcePointer workerThread; + HandleHolder& handleHolder; + LV2_Worker_Schedule schedule { this, scheduleWork }; + CriticalSection workMutex; + bool realtime = true; + + JUCE_LEAK_DETECTOR (WorkScheduler) +}; + +struct FeaturesDataListener +{ + virtual ~FeaturesDataListener() = default; + virtual LV2_Resize_Port_Status resizeCallback (uint32_t index, size_t size) = 0; +}; + +class Resize +{ +public: + explicit Resize (FeaturesDataListener& l) + : listener (l) {} + + LV2_Resize_Port_Resize& getFeature() { return resize; } + +private: + LV2_Resize_Port_Status resizeCallback (uint32_t index, size_t size) + { + return listener.resizeCallback (index, size); + } + + static LV2_Resize_Port_Status resizeCallback (LV2_Resize_Port_Feature_Data data, uint32_t index, size_t size) + { + return static_cast (data)->resizeCallback (index, size); + } + + FeaturesDataListener& listener; + LV2_Resize_Port_Resize resize { this, resizeCallback }; +}; + +class FeaturesData +{ +public: + FeaturesData (HandleHolder& handleHolder, + FeaturesDataListener& l, + int32_t maxBlockSizeIn, + int32_t sequenceSizeIn, + const UsefulUrids* u) + : urids (u), + resize (l), + maxBlockSize (maxBlockSizeIn), + sequenceSize (sequenceSizeIn), + workScheduler (handleHolder) + {} + + LV2_Options_Option* getOptions() noexcept { return options.data(); } + + int32_t getMaxBlockSize() const noexcept { return maxBlockSize; } + + void setNonRealtime (bool newValue) { realtime = ! newValue; } + + const LV2_Feature* const* getFeatureArray() const noexcept { return features.pointers.data(); } + + static std::vector getFeatureUris() + { + return Features::getUris (makeFeatures ({}, {}, {}, {}, {}, {})); + } + + void processResponses() { workScheduler.processResponses(); } + + void registerHandle (LV2_Handle handle) { workScheduler.registerHandle (handle); } + void deregisterHandle (LV2_Handle handle) { workScheduler.deregisterHandle (handle); } + +private: + static std::vector makeFeatures (LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + LV2_Options_Option* options, + LV2_Worker_Schedule* schedule, + LV2_Resize_Port_Resize* resize, + LV2_Log_Log* log) + { + ignoreUnused (log); + + return { LV2_Feature { LV2_STATE__loadDefaultState, nullptr }, + LV2_Feature { LV2_BUF_SIZE__boundedBlockLength, nullptr }, + LV2_Feature { LV2_URID__map, map }, + LV2_Feature { LV2_URID__unmap, unmap }, + LV2_Feature { LV2_OPTIONS__options, options }, + LV2_Feature { LV2_WORKER__schedule, schedule }, + LV2_Feature { LV2_STATE__threadSafeRestore, nullptr }, + #if JUCE_DEBUG + LV2_Feature { LV2_LOG__log, log }, + #endif + LV2_Feature { LV2_RESIZE_PORT__resize, resize } }; + } + + LV2_Options_Option makeOption (const char* uid, const int32_t* ptr) + { + return { LV2_OPTIONS_INSTANCE, + 0, // INSTANCE kinds must have a subject of 0 + urids->symap.map (uid), + sizeof (int32_t), + urids->symap.map (LV2_ATOM__Int), + ptr }; + } + + const UsefulUrids* urids; + Resize resize; + Log log { urids }; + + const int32_t minBlockSize = 0, maxBlockSize = 0, sequenceSize = 0; + + std::vector options + { + makeOption (LV2_BUF_SIZE__minBlockLength, &minBlockSize), + makeOption (LV2_BUF_SIZE__maxBlockLength, &maxBlockSize), + makeOption (LV2_BUF_SIZE__sequenceSize, &sequenceSize), + { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, nullptr }, // The final entry must be nulled out + }; + + WorkScheduler workScheduler; + + LV2_URID_Map map = urids->symap.getMapFeature(); + LV2_URID_Unmap unmap = urids->symap.getUnmapFeature(); + Features features { makeFeatures (&map, + &unmap, + options.data(), + &workScheduler.getWorkerSchedule(), + &resize.getFeature(), + log.getLogFeature()) }; + + bool realtime = true; + + JUCE_LEAK_DETECTOR (FeaturesData) +}; + +//============================================================================== +struct TryLockAndCall +{ + template + void operator() (SpinLock& mutex, Fn&& fn) + { + const SpinLock::ScopedTryLockType lock (mutex); + + if (lock.isLocked()) + fn(); + } +}; + +struct LockAndCall +{ + template + void operator() (SpinLock& mutex, Fn&& fn) + { + const SpinLock::ScopedLockType lock (mutex); + fn(); + } +}; + +struct RealtimeReadTrait +{ + using Read = TryLockAndCall; + using Write = LockAndCall; +}; + +struct RealtimeWriteTrait +{ + using Read = LockAndCall; + using Write = TryLockAndCall; +}; + +struct MessageHeader +{ + uint32_t portIndex; + uint32_t protocol; +}; + +template +struct MessageBufferInterface +{ + virtual ~MessageBufferInterface() = default; + virtual void pushMessage (Header header, uint32_t size, const void* buffer) = 0; +}; + +template +class Messages : public MessageBufferInterface
+{ + using Read = typename LockTraits::Read; + using Write = typename LockTraits::Write; + + struct FullHeader + { + Header header; + uint32_t size; + }; + +public: + Messages() { data.reserve (initialBufferSize); } + + void pushMessage (Header header, uint32_t size, const void* buffer) override + { + Write{} (mutex, [&] + { + const auto chars = toChars (FullHeader { header, size }); + const auto bufferAsChars = static_cast (buffer); + data.insert (data.end(), chars.begin(), chars.end()); + data.insert (data.end(), bufferAsChars, bufferAsChars + size); + }); + } + + template + void readAllAndClear (Callback&& callback) + { + Read{} (mutex, [&] + { + if (data.empty()) + return; + + const auto end = data.data() + data.size(); + + for (auto ptr = data.data(); ptr < end;) + { + const auto header = readUnaligned (ptr); + callback (header.header, header.size, ptr + sizeof (header)); + ptr += sizeof (header) + header.size; + } + + data.clear(); + }); + } + +private: + static constexpr auto initialBufferSize = 8192; + SpinLock mutex; + std::vector data; + + JUCE_LEAK_DETECTOR (Messages) +}; + +//============================================================================== +class LambdaTimer : private Timer +{ +public: + explicit LambdaTimer (std::function c) : callback (c) {} + + ~LambdaTimer() noexcept override { stopTimer(); } + + using Timer::startTimer; + using Timer::startTimerHz; + using Timer::stopTimer; + +private: + void timerCallback() override { callback(); } + + std::function callback; +}; + +struct UiEventListener : public MessageBufferInterface +{ + virtual int idle() = 0; +}; + +struct UiMessageHeader +{ + UiEventListener* listener; + MessageHeader header; +}; + +class ProcessorToUi : public MessageBufferInterface +{ +public: + ProcessorToUi() { timer.startTimerHz (60); } + + void addUi (UiEventListener& l) { JUCE_ASSERT_MESSAGE_THREAD; activeUis.insert (&l); } + void removeUi (UiEventListener& l) { JUCE_ASSERT_MESSAGE_THREAD; activeUis.erase (&l); } + + void pushMessage (UiMessageHeader header, uint32_t size, const void* buffer) override + { + processorToUi.pushMessage (header, size, buffer); + } + +private: + Messages processorToUi; + std::set activeUis; + LambdaTimer timer { [this] + { + for (auto* l : activeUis) + if (l->idle() != 0) + return; + + processorToUi.readAllAndClear ([&] (const UiMessageHeader& header, uint32_t size, const char* data) + { + if (activeUis.find (header.listener) != activeUis.cend()) + header.listener->pushMessage (header.header, size, data); + }); + } }; +}; + +/* These type identifiers may be used to check the type of the incoming data. */ +struct StatefulPortUrids +{ + explicit StatefulPortUrids (SymbolMap& map) + : Float (map.map (LV2_ATOM__Float)), + Double (map.map (LV2_ATOM__Double)), + Int (map.map (LV2_ATOM__Int)), + Long (map.map (LV2_ATOM__Long)) + {} + + const LV2_URID Float, Double, Int, Long; +}; + +/* + A bit like SortedSet, but only requires `operator<` and not `operator==`, so + it behaves a bit more like a std::set. +*/ +template +class SafeSortedSet +{ +public: + using iterator = typename std::vector:: iterator; + using const_iterator = typename std::vector::const_iterator; + + template + const_iterator find (const Other& other) const noexcept + { + const auto it = std::lower_bound (storage.cbegin(), storage.cend(), other); + + if (it != storage.cend() && ! (other < *it)) + return it; + + return storage.cend(); + } + + void insert (Value&& value) { insertImpl (std::move (value)); } + void insert (const Value& value) { insertImpl (value); } + + size_t size() const noexcept { return storage.size(); } + bool empty() const noexcept { return storage.empty(); } + + iterator begin() noexcept { return storage. begin(); } + const_iterator begin() const noexcept { return storage. begin(); } + const_iterator cbegin() const noexcept { return storage.cbegin(); } + + iterator end() noexcept { return storage. end(); } + const_iterator end() const noexcept { return storage. end(); } + const_iterator cend() const noexcept { return storage.cend(); } + + auto& operator[] (size_t index) const { return storage[index]; } + +private: + template + void insertImpl (Arg&& value) + { + const auto it = std::lower_bound (storage.cbegin(), storage.cend(), value); + + if (it == storage.cend() || value < *it) + storage.insert (it, std::forward (value)); + } + + std::vector storage; +}; + +struct StoredScalePoint +{ + String label; + float value; + + bool operator< (const StoredScalePoint& other) const noexcept { return value < other.value; } +}; + +inline bool operator< (const StoredScalePoint& a, float b) noexcept { return a.value < b; } +inline bool operator< (float a, const StoredScalePoint& b) noexcept { return a < b.value; } + +struct ParameterInfo +{ + ParameterInfo() = default; + + ParameterInfo (SafeSortedSet scalePointsIn, + String identifierIn, + float defaultValueIn, + float minIn, + float maxIn, + bool isToggleIn, + bool isIntegerIn, + bool isEnumIn) + : scalePoints (std::move (scalePointsIn)), + identifier (std::move (identifierIn)), + defaultValue (defaultValueIn), + min (minIn), + max (maxIn), + isToggle (isToggleIn), + isInteger (isIntegerIn), + isEnum (isEnumIn) + {} + + static SafeSortedSet getScalePoints (const Port& port) + { + SafeSortedSet scalePoints; + + for (const LilvScalePoint* p : port.getScalePoints()) + { + const ScalePoint wrapper { p }; + const auto value = wrapper.getValue(); + const auto label = wrapper.getLabel(); + + if (lilv_node_is_float (value) || lilv_node_is_int (value)) + scalePoints.insert ({ lilv_node_as_string (label), lilv_node_as_float (value) }); + } + + return scalePoints; + } + + static ParameterInfo getInfoForPort (const UsefulUris& uris, const Port& port) + { + const auto range = port.getRange(); + + return { getScalePoints (port), + "sym:" + String::fromUTF8 (port.getSymbol().getTyped()), + range.defaultValue, + range.min, + range.max, + port.hasProperty (uris.mLV2_CORE__toggled), + port.hasProperty (uris.mLV2_CORE__integer), + port.hasProperty (uris.mLV2_CORE__enumeration) }; + } + + SafeSortedSet scalePoints; + + /* This is the 'symbol' of a port, or the 'designation' of a parameter without a symbol. */ + String identifier; + + float defaultValue = 0.0f, min = 0.0f, max = 1.0f; + bool isToggle = false, isInteger = false, isEnum = false; + + JUCE_LEAK_DETECTOR (ParameterInfo) +}; + +struct PortHeader +{ + String name; + String symbol; + uint32_t index; + Port::Direction direction; +}; + +struct ControlPort +{ + ControlPort (const PortHeader& headerIn, const ParameterInfo& infoIn) + : header (headerIn), info (infoIn) {} + + PortHeader header; + ParameterInfo info; + float currentValue = info.defaultValue; +}; + +struct CVPort +{ + PortHeader header; +}; + +struct AudioPort +{ + PortHeader header; +}; + +template +class SingleSizeAlignedStorage +{ +public: + SingleSizeAlignedStorage() = default; + + explicit SingleSizeAlignedStorage (size_t sizeInBytes) + : storage (new char[sizeInBytes + Alignment]), + alignedPointer (storage.get()), + space (sizeInBytes + Alignment) + { + alignedPointer = std::align (Alignment, sizeInBytes, alignedPointer, space); + } + + void* data() const { return alignedPointer; } + size_t size() const { return space; } + +private: + std::unique_ptr storage; + void* alignedPointer = nullptr; + size_t space = 0; +}; + +template +static SingleSizeAlignedStorage grow (SingleSizeAlignedStorage storage, size_t size) +{ + if (size <= storage.size()) + return storage; + + SingleSizeAlignedStorage newStorage { jmax (size, (storage.size() * 3) / 2) }; + std::memcpy (newStorage.data(), storage.data(), storage.size()); + return newStorage; +} + +enum class SupportsTime { no, yes }; + +class AtomPort +{ +public: + AtomPort (PortHeader h, size_t bytes, SymbolMap& map, SupportsTime supportsTime) + : header (h), contents (bytes), forge (map.getMapFeature()), time (supportsTime) {} + + PortHeader header; + + void replaceWithChunk() + { + forge.setBuffer (data(), size()); + forge.writeChunk ((uint32_t) (size() - sizeof (LV2_Atom))); + } + + void replaceBufferWithAtom (const LV2_Atom* atom) + { + const auto totalSize = atom->size + sizeof (LV2_Atom); + + if (totalSize <= size()) + std::memcpy (data(), atom, totalSize); + else + replaceWithChunk(); + } + + void beginSequence() + { + forge.setBuffer (data(), size()); + lv2_atom_forge_sequence_head (forge.get(), &frame, 0); + } + + void endSequence() + { + lv2_atom_forge_pop (forge.get(), &frame); + } + + /* For this to work, the 'atom' pointer must be well-formed. + + It must be followed by an atom header, then at least 'size' bytes of body. + */ + void addAtomToSequence (int64_t timestamp, const LV2_Atom* atom) + { + // This reinterpret_cast is not UB, casting to a char* is acceptable. + // Doing arithmetic on this pointer is dubious, but I can't think of a better alternative + // given that we don't have any way of knowing the concrete type of the atom. + addEventToSequence (timestamp, + atom->type, + atom->size, + reinterpret_cast (atom) + sizeof (LV2_Atom)); + } + + void addEventToSequence (int64_t timestamp, uint32_t type, uint32_t size, const void* content) + { + lv2_atom_forge_frame_time (forge.get(), timestamp); + lv2_atom_forge_atom (forge.get(), size, type); + lv2_atom_forge_write (forge.get(), content, size); + } + + void ensureSizeInBytes (size_t size) + { + contents = grow (std::move (contents), size); + } + + char* data() noexcept { return data (*this); } + const char* data() const noexcept { return data (*this); } + + size_t size() const noexcept { return contents.size(); } + + lv2_shared::AtomForge& getForge() { return forge; } + const lv2_shared::AtomForge& getForge() const { return forge; } + + bool getSupportsTime() const { return time == SupportsTime::yes; } + +private: + template + static auto data (This& t) -> decltype (t.data()) + { + return unalignedPointerCast (t.contents.data()); + } + + // Atoms are required to be 64-bit aligned + SingleSizeAlignedStorage<8> contents; + lv2_shared::AtomForge forge; + LV2_Atom_Forge_Frame frame; + SupportsTime time = SupportsTime::no; +}; + +class Plugins +{ +public: + explicit Plugins (const LilvPlugins* list) noexcept : plugins (list) {} + + unsigned size() const noexcept { return lilv_plugins_size (plugins); } + + PluginsIterator begin() const noexcept { return PluginsIterator { plugins }; } + PluginsIterator end() const noexcept { return PluginsIterator{}; } + + const LilvPlugin* getByUri (const NodeUri& uri) const + { + return lilv_plugins_get_by_uri (plugins, uri.get()); + } + +private: + const LilvPlugins* plugins = nullptr; +}; + +template +class PluginClassesImpl +{ +public: + using type = typename PtrTraits::type; + + explicit PluginClassesImpl (type ptr) + : classes (std::move (ptr)) {} + + unsigned size() const noexcept { return lilv_plugin_classes_size (PtrTraits::get (classes)); } + + PluginClassesIterator begin() const noexcept { return PluginClassesIterator { PtrTraits::get (classes) }; } + PluginClassesIterator end() const noexcept { return PluginClassesIterator{}; } + + const LilvPluginClass* getByUri (const NodeUri& uri) const noexcept + { + return lilv_plugin_classes_get_by_uri (PtrTraits::get (classes), uri.get()); + } + +private: + type classes{}; +}; + +struct PluginClassesFree +{ + void operator() (LilvPluginClasses* ptr) const noexcept { lilv_plugin_classes_free (ptr); } +}; + +using OwningPluginClasses = PluginClassesImpl>; +using NonOwningPluginClasses = PluginClassesImpl>; + +class World +{ +public: + World() : world (lilv_world_new()) {} + + void loadAll() { lilv_world_load_all (world.get()); } + void loadBundle (const NodeUri& uri) { lilv_world_load_bundle (world.get(), uri.get()); } + void unloadBundle (const NodeUri& uri) { lilv_world_unload_bundle (world.get(), uri.get()); } + + void loadResource (const NodeUri& uri) { lilv_world_load_resource (world.get(), uri.get()); } + void unloadResource (const NodeUri& uri) { lilv_world_unload_resource (world.get(), uri.get()); } + + void loadSpecifications() { lilv_world_load_specifications (world.get()); } + void loadPluginClasses() { lilv_world_load_plugin_classes (world.get()); } + + Plugins getAllPlugins() const { return Plugins { lilv_world_get_all_plugins (world.get()) }; } + NonOwningPluginClasses getPluginClasses() const { return NonOwningPluginClasses { lilv_world_get_plugin_classes (world.get()) }; } + + NodeUri newUri (const char* uri) { return NodeUri { world.get(), uri }; } + NodeUri newFileUri (const char* host, const char* path) { return NodeUri { world.get(), host, path }; } + NodeString newString (const char* str) { return NodeString { world.get(), str }; } + + bool ask (const LilvNode* subject, const LilvNode* predicate, const LilvNode* object) const + { + return lilv_world_ask (world.get(), subject, predicate, object); + } + + OwningNode get (const LilvNode* subject, const LilvNode* predicate, const LilvNode* object) const + { + return OwningNode { lilv_world_get (world.get(), subject, predicate, object) }; + } + + OwningNodes findNodes (const LilvNode* subject, const LilvNode* predicate, const LilvNode* object) const + { + return OwningNodes { lilv_world_find_nodes (world.get(), subject, predicate, object) }; + } + + LilvWorld* get() const { return world.get(); } + +private: + struct Free + { + void operator() (LilvWorld* ptr) const noexcept { lilv_world_free (ptr); } + }; + + std::unique_ptr world; +}; + +class Ports +{ +public: + static constexpr auto sequenceSize = 8192; + + template + void forEachPort (Callback&& callback) const + { + for (const auto& port : controlPorts) + callback (port.header); + + for (const auto& port : cvPorts) + callback (port.header); + + for (const auto& port : audioPorts) + callback (port.header); + + for (const auto& port : atomPorts) + callback (port.header); + } + + auto getControlPorts() { return makeSimpleSpan (controlPorts); } + auto getControlPorts() const { return makeSimpleSpan (controlPorts); } + auto getCvPorts() { return makeSimpleSpan (cvPorts); } + auto getCvPorts() const { return makeSimpleSpan (cvPorts); } + auto getAudioPorts() { return makeSimpleSpan (audioPorts); } + auto getAudioPorts() const { return makeSimpleSpan (audioPorts); } + auto getAtomPorts() { return makeSimpleSpan (atomPorts); } + auto getAtomPorts() const { return makeSimpleSpan (atomPorts); } + + static Optional getPorts (World& world, const UsefulUris& uris, const Plugin& plugin, SymbolMap& symap) + { + Ports value; + bool successful = true; + + const auto numPorts = plugin.getNumPorts(); + const auto timeNode = world.newUri (LV2_TIME__Position); + + for (uint32_t i = 0; i != numPorts; ++i) + { + const auto port = plugin.getPortByIndex (i); + + const PortHeader header { String::fromUTF8 (port.getName().getTyped()), + String::fromUTF8 (port.getSymbol().getTyped()), + i, + port.getDirection (uris) }; + + switch (port.getKind (uris)) + { + case Port::Kind::control: + { + value.controlPorts.push_back ({ header, ParameterInfo::getInfoForPort (uris, port) }); + break; + } + + case Port::Kind::cv: + value.cvPorts.push_back ({ header }); + break; + + case Port::Kind::audio: + { + value.audioPorts.push_back ({ header }); + break; + } + + case Port::Kind::atom: + { + const auto supportsTime = port.supportsEvent (timeNode.get()); + value.atomPorts.push_back ({ header, + (size_t) Ports::sequenceSize, + symap, + supportsTime ? SupportsTime::yes : SupportsTime::no }); + break; + } + + case Port::Kind::unknown: + successful = false; + break; + } + } + + for (auto& atomPort : value.atomPorts) + { + const auto port = plugin.getPortByIndex (atomPort.header.index); + const auto minSize = port.get (uris.mLV2_RESIZE_PORT__minimumSize.get()); + + if (minSize != nullptr) + atomPort.ensureSizeInBytes ((size_t) lilv_node_as_int (minSize.get())); + } + + return successful ? makeOptional (std::move (value)) : nullopt; + } + +private: + std::vector controlPorts; + std::vector cvPorts; + std::vector audioPorts; + std::vector atomPorts; +}; + +class InstanceWithSupports : private FeaturesDataListener, + private HandleHolder +{ +public: + InstanceWithSupports (World& world, + std::unique_ptr&& symapIn, + const Plugin& plugin, + Ports portsIn, + int32_t initialBufferSize, + double sampleRate) + : symap (std::move (symapIn)), + ports (std::move (portsIn)), + features (*this, *this, initialBufferSize, lv2_host::Ports::sequenceSize, &urids), + instance (plugin, sampleRate, features.getFeatureArray()), + workerInterface (instance.getExtensionData (world.newUri (LV2_WORKER__interface))) + { + if (instance == nullptr) + return; + + for (auto& port : ports.getControlPorts()) + instance.connectPort (port.header.index, &port.currentValue); + + for (auto& port : ports.getAtomPorts()) + instance.connectPort (port.header.index, port.data()); + + for (auto& port : ports.getCvPorts()) + instance.connectPort (port.header.index, nullptr); + + for (auto& port : ports.getAudioPorts()) + instance.connectPort (port.header.index, nullptr); + + features.registerHandle (instance.getHandle()); + } + + ~InstanceWithSupports() override + { + if (instance != nullptr) + features.deregisterHandle (instance.getHandle()); + } + + std::unique_ptr symap; + const UsefulUrids urids { *symap }; + Ports ports; + FeaturesData features; + Instance instance; + Messages uiToProcessor; + SharedResourcePointer processorToUi; + +private: + LV2_Handle handle = instance == nullptr ? nullptr : instance.getHandle(); + OptionalExtension workerInterface; + + LV2_Handle getHandle() const override { return handle; } + const LV2_Worker_Interface* getWorkerInterface() const override { return workerInterface.valid ? &workerInterface.extension : nullptr; } + + LV2_Resize_Port_Status resizeCallback (uint32_t index, size_t size) override + { + if (ports.getAtomPorts().size() <= index) + return LV2_RESIZE_PORT_ERR_UNKNOWN; + + auto& port = ports.getAtomPorts()[index]; + + if (port.header.direction != Port::Direction::output) + return LV2_RESIZE_PORT_ERR_UNKNOWN; + + port.ensureSizeInBytes (size); + instance.connectPort (port.header.index, port.data()); + + return LV2_RESIZE_PORT_SUCCESS; + } + + JUCE_DECLARE_NON_COPYABLE (InstanceWithSupports) + JUCE_DECLARE_NON_MOVEABLE (InstanceWithSupports) + JUCE_LEAK_DETECTOR (InstanceWithSupports) +}; + +struct PortState +{ + const void* data; + uint32_t size; + uint32_t kind; +}; + +class PortMap +{ +public: + explicit PortMap (Ports& ports) + { + for (auto& port : ports.getControlPorts()) + symbolToControlPortMap.emplace (port.header.symbol, &port); + } + + PortState getState (const String& symbol, const StatefulPortUrids& urids) + { + if (auto* port = getControlPortForSymbol (symbol)) + return { &port->currentValue, sizeof (float), urids.Float }; + + // At time of writing, lilv_state_new_from_instance did not attempt to store + // the state of non-control ports. Perhaps that has changed? + jassertfalse; + return { nullptr, 0, 0 }; + } + + void restoreState (const String& symbol, const StatefulPortUrids& urids, PortState ps) + { + if (auto* port = getControlPortForSymbol (symbol)) + { + port->currentValue = [&]() -> float + { + if (ps.kind == urids.Float) + return getValueFrom (ps.data, ps.size); + + if (ps.kind == urids.Double) + return getValueFrom (ps.data, ps.size); + + if (ps.kind == urids.Int) + return getValueFrom (ps.data, ps.size); + + if (ps.kind == urids.Long) + return getValueFrom (ps.data, ps.size); + + jassertfalse; + return {}; + }(); + } + else + jassertfalse; // Restoring state for non-control ports is not currently supported. + } + +private: + template + static float getValueFrom (const void* data, uint32_t size) + { + jassertquiet (size == sizeof (Value)); + return (float) readUnaligned (data); + } + + ControlPort* getControlPortForSymbol (const String& symbol) const + { + const auto iter = symbolToControlPortMap.find (symbol); + return iter != symbolToControlPortMap.cend() ? iter->second : nullptr; + } + + std::map symbolToControlPortMap; + JUCE_LEAK_DETECTOR (PortMap) +}; + +struct FreeString { void operator() (void* ptr) const noexcept { lilv_free (ptr); } }; + +class PluginState +{ +public: + PluginState() = default; + + explicit PluginState (LilvState* ptr) + : state (ptr) {} + + const LilvState* get() const noexcept { return state.get(); } + + void restore (InstanceWithSupports& instance, PortMap& portMap) const + { + if (state != nullptr) + SaveRestoreHandle { instance, portMap }.restore (state.get()); + } + + std::string toString (LilvWorld* world, LV2_URID_Map* map, LV2_URID_Unmap* unmap, const char* uri) const + { + std::unique_ptr result { lilv_state_to_string (world, + map, + unmap, + state.get(), + uri, + nullptr) }; + return std::string { result.get() }; + } + + String getLabel() const + { + return String::fromUTF8 (lilv_state_get_label (state.get())); + } + + void setLabel (const String& label) + { + lilv_state_set_label (state.get(), label.toRawUTF8()); + } + + class SaveRestoreHandle + { + public: + explicit SaveRestoreHandle (InstanceWithSupports& instanceIn, PortMap& portMap) + : instance (instanceIn.instance.get()), + features (instanceIn.features.getFeatureArray()), + urids (*instanceIn.symap), + map (portMap) + {} + + PluginState save (const LilvPlugin* plugin, LV2_URID_Map* mapFeature) + { + return PluginState { lilv_state_new_from_instance (plugin, + instance, + mapFeature, + nullptr, + nullptr, + nullptr, + nullptr, + getPortValue, + this, + LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE, + features ) }; + } + + void restore (const LilvState* stateIn) + { + lilv_state_restore (stateIn, + instance, + setPortValue, + this, + 0, + features); + } + + private: + static const void* getPortValue (const char* portSymbol, + void* userData, + uint32_t* size, + uint32_t* type) + { + auto& handle = *static_cast (userData); + + const auto state = handle.map.getState (portSymbol, handle.urids); + *size = state.size; + *type = state.kind; + return state.data; + } + + static void setPortValue (const char* portSymbol, + void* userData, + const void* value, + uint32_t size, + uint32_t type) + { + const auto& handle = *static_cast (userData); + handle.map.restoreState (portSymbol, handle.urids, { static_cast (value), size, type }); + } + + LilvInstance* instance = nullptr; + const LV2_Feature* const* features = nullptr; + const StatefulPortUrids urids; + PortMap& map; + }; + +private: + struct Free + { + void operator() (LilvState* ptr) const noexcept { lilv_state_free (ptr); } + }; + + std::unique_ptr state; + + JUCE_LEAK_DETECTOR (PluginState) +}; + +/* + Wraps an LV2 UI bundle, providing access to the descriptor (if available). +*/ +struct UiDescriptorLibrary +{ + using GetDescriptor = LV2UI_Descriptor* (*) (uint32_t); + + UiDescriptorLibrary() = default; + + explicit UiDescriptorLibrary (const String& libraryPath) + : library (std::make_unique (libraryPath)), + getDescriptor (lv2_shared::wordCast (library->getFunction ("lv2ui_descriptor"))) {} + + std::unique_ptr library; + GetDescriptor getDescriptor = nullptr; +}; + +class UiDescriptorArgs +{ +public: + String libraryPath; + String uiUri; + + auto withLibraryPath (String v) const noexcept { return with (&UiDescriptorArgs::libraryPath, v); } + auto withUiUri (String v) const noexcept { return with (&UiDescriptorArgs::uiUri, v); } + +private: + UiDescriptorArgs with (String UiDescriptorArgs::* member, String value) const noexcept + { + return juce::lv2_host::with (*this, member, std::move (value)); + } +}; + +/* + Stores a pointer to the descriptor for a specific UI bundle and UI URI. +*/ +class UiDescriptor +{ +public: + UiDescriptor() = default; + + explicit UiDescriptor (const UiDescriptorArgs& args) + : library (args.libraryPath), + descriptor (extractUiDescriptor (library, args.uiUri.toRawUTF8())) + {} + + void portEvent (LV2UI_Handle ui, + uint32_t portIndex, + uint32_t bufferSize, + uint32_t format, + const void* buffer) const + { + JUCE_ASSERT_MESSAGE_THREAD + + if (auto* lv2Descriptor = get()) + if (auto* callback = lv2Descriptor->port_event) + callback (ui, portIndex, bufferSize, format, buffer); + } + + bool hasExtensionData (World& world, const char* uid) const + { + return world.ask (world.newUri (descriptor->URI).get(), + world.newUri (LV2_CORE__extensionData).get(), + world.newUri (uid).get()); + } + + template + OptionalExtension getExtensionData (World& world, const char* uid) const + { + if (! hasExtensionData (world, uid)) + return {}; + + if (auto* lv2Descriptor = get()) + if (auto* extension = lv2Descriptor->extension_data) + return OptionalExtension (readUnaligned (extension (uid))); + + return {}; + } + + const LV2UI_Descriptor* get() const noexcept { return descriptor; } + +private: + static const LV2UI_Descriptor* extractUiDescriptor (const UiDescriptorLibrary& lib, const char* uiUri) + { + if (lib.getDescriptor == nullptr) + return nullptr; + + for (uint32_t i = 0;; ++i) + { + const auto* descriptor = lib.getDescriptor (i); + + if (descriptor == nullptr) + return nullptr; + + if (strcmp (uiUri, descriptor->URI) == 0) + return descriptor; + } + } + + UiDescriptorLibrary library; + const LV2UI_Descriptor* descriptor = nullptr; + + JUCE_LEAK_DETECTOR (UiDescriptor) +}; + +enum class Update { no, yes }; + +/* A bit like the FlaggedFloatCache used by the VST3 host/client. + + While the FlaggedFloatCache always clears all set flags during the ifSet() call, + this class stores the "value changed" flags for the processor and UI separately, + so that they can be read at different rates. +*/ +class ParameterValuesAndFlags +{ +public: + ParameterValuesAndFlags() = default; + + explicit ParameterValuesAndFlags (size_t sizeIn) + : values (sizeIn), + needsUiUpdate (sizeIn), + needsProcessorUpdate (sizeIn) + { + std::fill (values.begin(), values.end(), 0.0f); + } + + size_t size() const noexcept { return values.size(); } + + void set (size_t index, float value, Update update) + { + jassert (index < size()); + values[index].store (value, std::memory_order_relaxed); + needsUiUpdate .set (index, update == Update::yes ? 1 : 0); + needsProcessorUpdate.set (index, update == Update::yes ? 1 : 0); + } + + float get (size_t index) const noexcept + { + jassert (index < size()); + return values[index].load (std::memory_order_relaxed); + } + + template + void ifProcessorValuesChanged (Callback&& callback) + { + ifChanged (needsProcessorUpdate, std::forward (callback)); + } + + template + void ifUiValuesChanged (Callback&& callback) + { + ifChanged (needsUiUpdate, std::forward (callback)); + } + + void clearUiFlags() { needsUiUpdate.clear(); } + +private: + template + void ifChanged (FlagCache<1>& flags, Callback&& callback) + { + flags.ifSet ([this, &callback] (size_t groupIndex, uint32_t) + { + callback (groupIndex, values[groupIndex].load (std::memory_order_relaxed)); + }); + } + + std::vector> values; + FlagCache<1> needsUiUpdate; + FlagCache<1> needsProcessorUpdate; + + JUCE_LEAK_DETECTOR (ParameterValuesAndFlags) +}; + +class LV2Parameter : public AudioPluginInstance::HostedParameter +{ +public: + LV2Parameter (const String& nameIn, + const ParameterInfo& infoIn, + ParameterValuesAndFlags& floatCache) + : cache (floatCache), + info (infoIn), + range (info.min, info.max), + name (nameIn), + normalisedDefault (range.convertTo0to1 (infoIn.defaultValue)) + {} + + float getValue() const noexcept override + { + return range.convertTo0to1 (getDenormalisedValue()); + } + + void setValue (float f) override + { + cache.set ((size_t) getParameterIndex(), range.convertFrom0to1 (f), Update::yes); + } + + void setDenormalisedValue (float denormalised) + { + cache.set ((size_t) getParameterIndex(), denormalised, Update::yes); + sendValueChangedMessageToListeners (range.convertTo0to1 (denormalised)); + } + + void setDenormalisedValueWithoutTriggeringUpdate (float denormalised) + { + cache.set ((size_t) getParameterIndex(), denormalised, Update::no); + sendValueChangedMessageToListeners (range.convertTo0to1 (denormalised)); + } + + float getDenormalisedValue() const noexcept + { + return cache.get ((size_t) getParameterIndex()); + } + + float getDefaultValue() const override { return normalisedDefault; } + float getDenormalisedDefaultValue() const { return info.defaultValue; } + + float getValueForText (const String& text) const override + { + if (! info.isEnum) + return range.convertTo0to1 (text.getFloatValue()); + + const auto it = std::find_if (info.scalePoints.begin(), + info.scalePoints.end(), + [&] (const StoredScalePoint& stored) { return stored.label == text; }); + return it != info.scalePoints.end() ? range.convertTo0to1 (it->value) : normalisedDefault; + } + + int getNumSteps() const override + { + if (info.isToggle) + return 2; + + if (info.isEnum) + return static_cast (info.scalePoints.size()); + + if (info.isInteger) + return static_cast (range.getRange().getLength()) + 1; + + return AudioProcessorParameter::getNumSteps(); + } + + bool isDiscrete() const override { return info.isEnum || info.isInteger || info.isToggle; } + bool isBoolean() const override { return info.isToggle; } + + StringArray getAllValueStrings() const override + { + if (! info.isEnum) + return {}; + + return AudioProcessorParameter::getAllValueStrings(); + } + + String getText (float normalisedValue, int) const override + { + const auto denormalised = range.convertFrom0to1 (normalisedValue); + + if (info.isEnum && ! info.scalePoints.empty()) + { + // The normalised value might not correspond to the exact value of a scale point. + // In this case, we find the closest label by searching the midpoints of the scale + // point values. + const auto index = std::distance (midPoints.begin(), + std::lower_bound (midPoints.begin(), midPoints.end(), normalisedValue)); + jassert (isPositiveAndBelow (index, info.scalePoints.size())); + return info.scalePoints[(size_t) index].label; + } + + return getFallbackParameterString (denormalised); + } + + String getParameterID() const override + { + return info.identifier; + } + + String getName (int maxLength) const override + { + return name.substring (0, maxLength); + } + + String getLabel() const override + { + // TODO + return {}; + } + +private: + String getFallbackParameterString (float denormalised) const + { + if (info.isToggle) + return denormalised > 0.0f ? "On" : "Off"; + + if (info.isInteger) + return String { static_cast (denormalised) }; + + return String { denormalised }; + } + + static std::vector findScalePointMidPoints (const SafeSortedSet& set) + { + if (set.size() < 2) + return {}; + + std::vector result; + + for (auto it = std::next (set.begin()); it != set.end(); ++it) + result.push_back ((std::prev (it)->value + it->value) * 0.5f); + + jassert (std::is_sorted (result.begin(), result.end())); + jassert (result.size() + 1 == set.size()); + return result; + } + + ParameterValuesAndFlags& cache; + const ParameterInfo info; + const std::vector midPoints = findScalePointMidPoints (info.scalePoints); + const NormalisableRange range; + const String name; + const float normalisedDefault; + + JUCE_LEAK_DETECTOR (LV2Parameter) +}; + +class UiInstanceArgs +{ +public: + File bundlePath; + URL pluginUri; + + auto withBundlePath (File v) const noexcept { return with (&UiInstanceArgs::bundlePath, std::move (v)); } + auto withPluginUri (URL v) const noexcept { return with (&UiInstanceArgs::pluginUri, std::move (v)); } + +private: + template + UiInstanceArgs with (Member UiInstanceArgs::* member, Member value) const noexcept + { + return juce::lv2_host::with (*this, member, std::move (value)); + } +}; + +static File bundlePathFromUri (const char* uri) +{ + return File { std::unique_ptr { lilv_file_uri_parse (uri, nullptr) }.get() }; +} + +/* + Creates and holds a UI instance for a plugin with a specific URI, using the provided descriptor. +*/ +class UiInstance +{ +public: + UiInstance (World& world, + const UiDescriptor* descriptorIn, + const UiInstanceArgs& args, + const LV2_Feature* const* features, + MessageBufferInterface& messagesIn, + SymbolMap& map, + PhysicalResizeListener& rl) + : descriptor (descriptorIn), + resizeListener (rl), + uiToProcessor (messagesIn), + mLV2_UI__floatProtocol (map.map (LV2_UI__floatProtocol)), + mLV2_ATOM__atomTransfer (map.map (LV2_ATOM__atomTransfer)), + mLV2_ATOM__eventTransfer (map.map (LV2_ATOM__eventTransfer)), + instance (makeInstance (args.pluginUri, args.bundlePath, features)), + idleCallback (getExtensionData (world, LV2_UI__idleInterface)) + { + jassert (descriptor != nullptr); + jassert (widget != nullptr); + + ignoreUnused (resizeListener); + } + + LV2UI_Handle getHandle() const noexcept { return instance.get(); } + + void pushMessage (MessageHeader header, uint32_t size, const void* buffer) + { + descriptor->portEvent (getHandle(), header.portIndex, size, header.protocol, buffer); + } + + int idle() + { + if (idleCallback.valid && idleCallback.extension.idle != nullptr) + return idleCallback.extension.idle (getHandle()); + + return 0; + } + + template + OptionalExtension getExtensionData (World& world, const char* uid) const + { + return descriptor->getExtensionData (world, uid); + } + + Rectangle getDetectedViewBounds() const + { + #if JUCE_MAC + const auto frame = [(NSView*) widget frame]; + return { (int) frame.size.width, (int) frame.size.height }; + #elif JUCE_LINUX || JUCE_BSD + Window root = 0; + int wx = 0, wy = 0; + unsigned int ww = 0, wh = 0, bw = 0, bitDepth = 0; + + XWindowSystemUtilities::ScopedXLock xLock; + auto* display = XWindowSystem::getInstance()->getDisplay(); + X11Symbols::getInstance()->xGetGeometry (display, + (::Drawable) widget, + &root, + &wx, + &wy, + &ww, + &wh, + &bw, + &bitDepth); + + return { (int) ww, (int) wh }; + #elif JUCE_WINDOWS + RECT rect; + GetWindowRect ((HWND) widget, &rect); + return { rect.right - rect.left, rect.bottom - rect.top }; + #else + return {}; + #endif + } + + const UiDescriptor* descriptor = nullptr; + +private: + using Instance = std::unique_ptr; + using Idle = int (*) (LV2UI_Handle); + + Instance makeInstance (const URL& pluginUri, const File& bundlePath, const LV2_Feature* const* features) + { + if (descriptor->get() == nullptr) + return { nullptr, [] (LV2UI_Handle) {} }; + + return Instance { descriptor->get()->instantiate (descriptor->get(), + pluginUri.toString (false).toRawUTF8(), + File::addTrailingSeparator (bundlePath.getFullPathName()).toRawUTF8(), + writeFunction, + this, + &widget, + features), + descriptor->get()->cleanup }; + } + + void write (uint32_t portIndex, uint32_t bufferSize, uint32_t protocol, const void* buffer) + { + const LV2_URID protocols[] { 0, mLV2_UI__floatProtocol, mLV2_ATOM__atomTransfer, mLV2_ATOM__eventTransfer }; + const auto it = std::find (std::begin (protocols), std::end (protocols), protocol); + + if (it != std::end (protocols)) + { + uiToProcessor.pushMessage ({ portIndex, protocol }, bufferSize, buffer); + } + } + + static void writeFunction (LV2UI_Controller controller, + uint32_t portIndex, + uint32_t bufferSize, + uint32_t portProtocol, + const void* buffer) + { + jassert (controller != nullptr); + static_cast (controller)->write (portIndex, bufferSize, portProtocol, buffer); + } + + PhysicalResizeListener& resizeListener; + MessageBufferInterface& uiToProcessor; + LV2UI_Widget widget = nullptr; + const LV2_URID mLV2_UI__floatProtocol; + const LV2_URID mLV2_ATOM__atomTransfer; + const LV2_URID mLV2_ATOM__eventTransfer; + Instance instance; + OptionalExtension idleCallback; + + #if JUCE_MAC + NSViewFrameWatcher frameWatcher { (NSView*) widget, [this] + { + const auto bounds = getDetectedViewBounds(); + resizeListener.viewRequestedResizeInPhysicalPixels (bounds.getWidth(), bounds.getHeight()); + } }; + #elif JUCE_WINDOWS + WindowSizeChangeListener frameWatcher { (HWND) widget, resizeListener }; + #endif + + JUCE_LEAK_DETECTOR (UiInstance) +}; + +struct TouchListener +{ + virtual ~TouchListener() = default; + virtual void controlGrabbed (uint32_t port, bool grabbed) = 0; +}; + +class AsyncFn : public AsyncUpdater +{ +public: + explicit AsyncFn (std::function callbackIn) + : callback (std::move (callbackIn)) {} + + ~AsyncFn() override { cancelPendingUpdate(); } + + void handleAsyncUpdate() override { callback(); } + +private: + std::function callback; +}; + +class UiFeaturesDataOptions +{ +public: + float initialScaleFactor = 0.0f, sampleRate = 0.0f; + + auto withInitialScaleFactor (float v) const { return with (&UiFeaturesDataOptions::initialScaleFactor, v); } + auto withSampleRate (float v) const { return with (&UiFeaturesDataOptions::sampleRate, v); } + +private: + UiFeaturesDataOptions with (float UiFeaturesDataOptions::* member, float value) const + { + return juce::lv2_host::with (*this, member, value); + } +}; + +class UiFeaturesData +{ +public: + UiFeaturesData (PhysicalResizeListener& rl, + TouchListener& tl, + LV2_Handle instanceIn, + LV2UI_Widget parentIn, + Instance::GetExtensionData getExtensionData, + const Ports& ports, + SymbolMap& symapIn, + const UiFeaturesDataOptions& optIn) + : opts (optIn), + resizeListener (rl), + touchListener (tl), + instance (instanceIn), + parent (parentIn), + symap (symapIn), + dataAccess { getExtensionData }, + portIndices (makePortIndices (ports)) + { + } + + const LV2_Feature* const* getFeatureArray() const noexcept { return features.pointers.data(); } + + static std::vector getFeatureUris() + { + return Features::getUris (makeFeatures ({}, {}, {}, {}, {}, {}, {}, {}, {}, {})); + } + + Rectangle getLastRequestedBounds() const { return { lastRequestedWidth, lastRequestedHeight }; } + +private: + static std::vector makeFeatures (LV2UI_Resize* resize, + LV2UI_Widget parent, + LV2_Handle handle, + LV2_Extension_Data_Feature* data, + LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + LV2UI_Port_Map* portMap, + LV2UI_Touch* touch, + LV2_Options_Option* options, + LV2_Log_Log* log) + { + return { LV2_Feature { LV2_UI__resize, resize }, + LV2_Feature { LV2_UI__parent, parent }, + LV2_Feature { LV2_UI__idleInterface, nullptr }, + LV2_Feature { LV2_INSTANCE_ACCESS_URI, handle }, + LV2_Feature { LV2_DATA_ACCESS_URI, data }, + LV2_Feature { LV2_URID__map, map }, + LV2_Feature { LV2_URID__unmap, unmap}, + LV2_Feature { LV2_UI__portMap, portMap }, + LV2_Feature { LV2_UI__touch, touch }, + LV2_Feature { LV2_OPTIONS__options, options }, + LV2_Feature { LV2_LOG__log, log } }; + } + + int resizeCallback (int width, int height) + { + lastRequestedWidth = width; + lastRequestedHeight = height; + resizeListener.viewRequestedResizeInPhysicalPixels (width, height); + return 0; + } + + static int resizeCallback (LV2UI_Feature_Handle handle, int width, int height) + { + return static_cast (handle)->resizeCallback (width, height); + } + + uint32_t portIndexCallback (const char* symbol) const + { + const auto it = portIndices.find (symbol); + return it != portIndices.cend() ? it->second : LV2UI_INVALID_PORT_INDEX; + } + + static uint32_t portIndexCallback (LV2UI_Feature_Handle handle, const char* symbol) + { + return static_cast (handle)->portIndexCallback (symbol); + } + + void touchCallback (uint32_t portIndex, bool grabbed) const + { + touchListener.controlGrabbed (portIndex, grabbed); + } + + static void touchCallback (LV2UI_Feature_Handle handle, uint32_t index, bool b) + { + return static_cast (handle)->touchCallback (index, b); + } + + static std::map makePortIndices (const Ports& ports) + { + std::map result; + + ports.forEachPort ([&] (const PortHeader& header) + { + const auto emplaced = result.emplace (header.symbol, header.index); + + // This will complain if there are duplicate port symbols. + jassert (emplaced.second); + ignoreUnused (emplaced); + }); + + return result; + } + + const UiFeaturesDataOptions opts; + PhysicalResizeListener& resizeListener; + TouchListener& touchListener; + LV2_Handle instance{}; + LV2UI_Widget parent{}; + SymbolMap& symap; + const UsefulUrids urids { symap }; + Log log { &urids }; + int lastRequestedWidth = 0, lastRequestedHeight = 0; + std::vector options { { LV2_OPTIONS_INSTANCE, + 0, + symap.map (LV2_UI__scaleFactor), + sizeof (float), + symap.map (LV2_ATOM__Float), + &opts.initialScaleFactor }, + { LV2_OPTIONS_INSTANCE, + 0, + symap.map (LV2_PARAMETERS__sampleRate), + sizeof (float), + symap.map (LV2_ATOM__Float), + &opts.sampleRate }, + { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, nullptr } }; // The final entry must be nulled out + LV2UI_Resize resize { this, resizeCallback }; + LV2_URID_Map map = symap.getMapFeature(); + LV2_URID_Unmap unmap = symap.getUnmapFeature(); + LV2UI_Port_Map portMap { this, portIndexCallback }; + LV2UI_Touch touch { this, touchCallback }; + LV2_Extension_Data_Feature dataAccess; + std::map portIndices; + Features features { makeFeatures (&resize, + parent, + instance, + &dataAccess, + &map, + &unmap, + &portMap, + &touch, + options.data(), + log.getLogFeature()) }; + + JUCE_LEAK_DETECTOR (UiFeaturesData) +}; + +class UiInstanceWithSupports +{ +public: + UiInstanceWithSupports (World& world, + PhysicalResizeListener& resizeListener, + TouchListener& touchListener, + const UiDescriptor* descriptor, + const UiInstanceArgs& args, + LV2UI_Widget parent, + InstanceWithSupports& engineInstance, + const UiFeaturesDataOptions& opts) + : features (resizeListener, + touchListener, + engineInstance.instance.getHandle(), + parent, + engineInstance.instance.getExtensionDataCallback(), + engineInstance.ports, + *engineInstance.symap, + opts), + instance (world, + descriptor, + args, + features.getFeatureArray(), + engineInstance.uiToProcessor, + *engineInstance.symap, + resizeListener) + {} + + UiFeaturesData features; + UiInstance instance; + + JUCE_LEAK_DETECTOR (UiInstanceWithSupports) +}; + +struct RequiredFeatures +{ + explicit RequiredFeatures (OwningNodes nodes) + : values (std::move (nodes)) {} + + OwningNodes values; +}; + +struct OptionalFeatures +{ + explicit OptionalFeatures (OwningNodes nodes) + : values (std::move (nodes)) {} + + OwningNodes values; +}; + +template +static bool noneOf (Range&& range, Predicate&& pred) +{ + // Not a mistake, this is for ADL + using std::begin; + using std::end; + return std::none_of (begin (range), end (range), std::forward (pred)); +} + +class PeerChangedListener : private ComponentMovementWatcher +{ +public: + PeerChangedListener (Component& c, std::function peerChangedIn) + : ComponentMovementWatcher (&c), peerChanged (std::move (peerChangedIn)) + { + } + + void componentMovedOrResized (bool, bool) override {} + void componentPeerChanged() override { NullCheckedInvocation::invoke (peerChanged); } + void componentVisibilityChanged() override {} + + using ComponentMovementWatcher::componentVisibilityChanged; + using ComponentMovementWatcher::componentMovedOrResized; + +private: + std::function peerChanged; +}; + +struct ViewSizeListener : private ComponentMovementWatcher +{ + ViewSizeListener (Component& c, PhysicalResizeListener& l) + : ComponentMovementWatcher (&c), listener (l) + { + } + + void componentMovedOrResized (bool, bool wasResized) override + { + if (wasResized) + { + const auto physicalSize = Desktop::getInstance().getDisplays() + .logicalToPhysical (getComponent()->localAreaToGlobal (getComponent()->getLocalBounds())); + const auto width = physicalSize.getWidth(); + const auto height = physicalSize.getHeight(); + + if (width > 10 && height > 10) + listener.viewRequestedResizeInPhysicalPixels (width, height); + } + } + + void componentPeerChanged() override {} + void componentVisibilityChanged() override {} + + using ComponentMovementWatcher::componentVisibilityChanged; + using ComponentMovementWatcher::componentMovedOrResized; + + PhysicalResizeListener& listener; +}; + +class ConfiguredEditorComponent : public Component, + private PhysicalResizeListener +{ +public: + ConfiguredEditorComponent (World& world, + InstanceWithSupports& instance, + UiDescriptor& uiDescriptor, + LogicalResizeListener& resizeListenerIn, + TouchListener& touchListener, + const String& uiBundleUri, + const UiFeaturesDataOptions& opts) + : resizeListener (resizeListenerIn), + floatUrid (instance.symap->map (LV2_ATOM__Float)), + scaleFactorUrid (instance.symap->map (LV2_UI__scaleFactor)), + uiInstance (new UiInstanceWithSupports (world, + *this, + touchListener, + &uiDescriptor, + UiInstanceArgs{}.withBundlePath (bundlePathFromUri (uiBundleUri.toRawUTF8())) + .withPluginUri (URL (instance.instance.getUri())), + viewComponent.getWidget(), + instance, + opts)), + resizeClient (uiInstance->instance.getExtensionData (world, LV2_UI__resize)), + optionsInterface (uiInstance->instance.getExtensionData (world, LV2_OPTIONS__interface)) + { + jassert (uiInstance != nullptr); + + setOpaque (true); + addAndMakeVisible (viewComponent); + + const auto boundsToUse = [&] + { + const auto requested = uiInstance->features.getLastRequestedBounds(); + + if (requested.getWidth() > 10 && requested.getHeight() > 10) + return requested; + + return uiInstance->instance.getDetectedViewBounds(); + }(); + + const auto scaled = lv2ToComponentRect (boundsToUse); + lastWidth = scaled.getWidth(); + lastHeight = scaled.getHeight(); + setSize (lastWidth, lastHeight); + } + + ~ConfiguredEditorComponent() override + { + viewComponent.prepareForDestruction(); + } + + void paint (Graphics& g) override + { + g.fillAll (Colours::black); + } + + void resized() override + { + viewComponent.setBounds (getLocalBounds()); + } + + void updateViewBounds() + { + // If the editor changed size as a result of a request from the client, + // we shouldn't send a notification back to the client. + if (uiInstance != nullptr) + { + if (resizeClient.valid && resizeClient.extension.ui_resize != nullptr) + { + const auto physicalSize = componentToLv2Rect (getLocalBounds()); + + resizeClient.extension.ui_resize (uiInstance->instance.getHandle(), + physicalSize.getWidth(), + physicalSize.getHeight()); + } + } + } + + void pushMessage (MessageHeader header, uint32_t size, const void* buffer) + { + if (uiInstance != nullptr) + uiInstance->instance.pushMessage (header, size, buffer); + } + + int idle() + { + if (uiInstance != nullptr) + return uiInstance->instance.idle(); + + return 0; + } + + void childBoundsChanged (Component* c) override + { + if (c == nullptr) + resizeToFitView(); + } + + void setUserScaleFactor (float userScale) { userScaleFactor = userScale; } + + void sendScaleFactorToPlugin() + { + const auto factor = getEffectiveScale(); + + const LV2_Options_Option options[] + { + { LV2_OPTIONS_INSTANCE, 0, scaleFactorUrid, sizeof (float), floatUrid, &factor }, + { {}, {}, {}, {}, {}, {} } + }; + + if (optionsInterface.valid) + optionsInterface.extension.set (uiInstance->instance.getHandle(), options); + + applyLastRequestedPhysicalSize(); + } + +private: + void viewRequestedResizeInPhysicalPixels (int width, int height) override + { + lastWidth = width; + lastHeight = height; + const auto logical = lv2ToComponentRect ({ width, height }); + resizeListener.viewRequestedResizeInLogicalPixels (logical.getWidth(), logical.getHeight()); + } + + void resizeToFitView() + { + viewComponent.fitToView(); + resizeListener.viewRequestedResizeInLogicalPixels (viewComponent.getWidth(), viewComponent.getHeight()); + } + + void applyLastRequestedPhysicalSize() + { + viewRequestedResizeInPhysicalPixels (lastWidth, lastHeight); + viewComponent.forceViewToSize(); + } + + /* Convert from the component's coordinate system to the hosted LV2's coordinate system. */ + Rectangle componentToLv2Rect (Rectangle r) const + { + return localAreaToGlobal (r) * nativeScaleFactor * getDesktopScaleFactor(); + } + + /* Convert from the hosted LV2's coordinate system to the component's coordinate system. */ + Rectangle lv2ToComponentRect (Rectangle vr) const + { + return getLocalArea (nullptr, vr / (nativeScaleFactor * getDesktopScaleFactor())); + } + + float getEffectiveScale() const { return nativeScaleFactor * userScaleFactor; } + + // If possible, try to keep platform-specific handing restricted to the implementation of + // ViewComponent. Keep the interface of ViewComponent consistent on all platforms. + #if JUCE_LINUX || JUCE_BSD + struct InnerHolder + { + struct Inner : public XEmbedComponent + { + Inner() : XEmbedComponent (true, true) + { + setOpaque (true); + addToDesktop (0); + } + }; + + Inner inner; + }; + + struct ViewComponent : public InnerHolder, + public XEmbedComponent + { + explicit ViewComponent (PhysicalResizeListener& l) + : XEmbedComponent ((unsigned long) inner.getPeer()->getNativeHandle(), true, false), + listener (inner, l) + { + setOpaque (true); + } + + ~ViewComponent() + { + removeClient(); + } + + void prepareForDestruction() + { + inner.removeClient(); + } + + LV2UI_Widget getWidget() { return lv2_shared::wordCast (inner.getHostWindowID()); } + void forceViewToSize() {} + void fitToView() {} + + ViewSizeListener listener; + }; + #elif JUCE_MAC + struct ViewComponent : public NSViewComponentWithParent + { + explicit ViewComponent (PhysicalResizeListener&) + : NSViewComponentWithParent (WantsNudge::no) {} + LV2UI_Widget getWidget() { return getView(); } + void forceViewToSize() {} + void fitToView() { resizeToFitView(); } + void prepareForDestruction() {} + }; + #elif JUCE_WINDOWS + struct ViewComponent : public HWNDComponent + { + explicit ViewComponent (PhysicalResizeListener&) + { + setOpaque (true); + inner.addToDesktop (0); + + if (auto* peer = inner.getPeer()) + setHWND (peer->getNativeHandle()); + } + + void paint (Graphics& g) override { g.fillAll (Colours::black); } + + LV2UI_Widget getWidget() { return getHWND(); } + + void forceViewToSize() { updateHWNDBounds(); } + void fitToView() { resizeToFit(); } + + void prepareForDestruction() {} + + private: + struct Inner : public Component + { + Inner() { setOpaque (true); } + void paint (Graphics& g) override { g.fillAll (Colours::black); } + }; + + Inner inner; + }; + #else + struct ViewComponent : public Component + { + explicit ViewComponent (PhysicalResizeListener&) {} + void* getWidget() { return nullptr; } + void forceViewToSize() {} + void fitToView() {} + void prepareForDestruction() {} + }; + #endif + + struct ScaleNotifierCallback + { + ConfiguredEditorComponent& window; + + void operator() (float platformScale) const + { + MessageManager::callAsync ([ref = Component::SafePointer (&window), platformScale] + { + if (auto* r = ref.getComponent()) + { + if (std::exchange (r->nativeScaleFactor, platformScale) == platformScale) + return; + + r->nativeScaleFactor = platformScale; + r->sendScaleFactorToPlugin(); + } + }); + } + }; + + LogicalResizeListener& resizeListener; + int lastWidth = 0, lastHeight = 0; + float nativeScaleFactor = 1.0f, userScaleFactor = 1.0f; + NativeScaleFactorNotifier scaleNotifier { this, ScaleNotifierCallback { *this } }; + ViewComponent viewComponent { *this }; + LV2_URID floatUrid, scaleFactorUrid; + std::unique_ptr uiInstance; + OptionalExtension resizeClient; + OptionalExtension optionsInterface; + PeerChangedListener peerListener { *this, [this] + { + applyLastRequestedPhysicalSize(); + } }; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ConfiguredEditorComponent) +}; + +//============================================================================== +/* Interface to receive notifications when the Editor changes. */ +struct EditorListener +{ + virtual ~EditorListener() = default; + + /* The editor needs to be recreated in a few different scenarios, such as: + - When the scale factor of the window changes, because we can only provide the + scale factor to the view during construction + - When the sample rate changes, because the processor also needs to be destroyed + and recreated in this case + + This function will be called whenever the editor has been recreated, in order to + allow the processor (or other listeners) to respond, e.g. by sending all of the + current port/parameter values to the view. + */ + virtual void viewCreated (UiEventListener* newListener) = 0; + + virtual void notifyEditorBeingDeleted() = 0; +}; + +/* We can't pass the InstanceWithSupports directly to the editor, because + it might be destroyed and reconstructed if the sample rate changes. +*/ +struct InstanceProvider +{ + virtual ~InstanceProvider() noexcept = default; + + virtual InstanceWithSupports* getInstanceWithSupports() const = 0; +}; + +class Editor : public AudioProcessorEditor, + public UiEventListener, + private LogicalResizeListener +{ +public: + Editor (World& worldIn, + AudioPluginInstance& p, + InstanceProvider& instanceProviderIn, + UiDescriptor& uiDescriptorIn, + TouchListener& touchListenerIn, + EditorListener& listenerIn, + const String& uiBundleUriIn, + RequiredFeatures requiredIn, + OptionalFeatures optionalIn) + : AudioProcessorEditor (p), + world (worldIn), + instanceProvider (&instanceProviderIn), + uiDescriptor (&uiDescriptorIn), + touchListener (&touchListenerIn), + listener (&listenerIn), + uiBundleUri (uiBundleUriIn), + required (std::move (requiredIn)), + optional (std::move (optionalIn)) + { + setResizable (isResizable (required, optional), false); + setSize (10, 10); + setOpaque (true); + + createView(); + + instanceProvider->getInstanceWithSupports()->processorToUi->addUi (*this); + } + + ~Editor() noexcept override + { + instanceProvider->getInstanceWithSupports()->processorToUi->removeUi (*this); + + listener->notifyEditorBeingDeleted(); + } + + void createView() + { + const auto initialScale = userScaleFactor * (float) [&] + { + if (auto* p = getPeer()) + return p->getPlatformScaleFactor(); + + return 1.0; + }(); + + const auto opts = UiFeaturesDataOptions{}.withInitialScaleFactor (initialScale) + .withSampleRate ((float) processor.getSampleRate()); + configuredEditor = nullptr; + configuredEditor = rawToUniquePtr (new ConfiguredEditorComponent (world, + *instanceProvider->getInstanceWithSupports(), + *uiDescriptor, + *this, + *touchListener, + uiBundleUri, + opts)); + parentHierarchyChanged(); + const auto initialSize = configuredEditor->getBounds(); + setSize (initialSize.getWidth(), initialSize.getHeight()); + + listener->viewCreated (this); + } + + void destroyView() + { + configuredEditor = nullptr; + } + + void paint (Graphics& g) override + { + g.fillAll (Colours::black); + } + + void resized() override + { + const ScopedValueSetter scope (resizeFromHost, true); + + if (auto* inner = configuredEditor.get()) + { + inner->setBounds (getLocalBounds()); + inner->updateViewBounds(); + } + } + + void parentHierarchyChanged() override + { + if (auto* comp = configuredEditor.get()) + { + if (isShowing()) + addAndMakeVisible (comp); + else + removeChildComponent (comp); + } + } + + void pushMessage (MessageHeader header, uint32_t size, const void* buffer) override + { + if (auto* comp = configuredEditor.get()) + comp->pushMessage (header, size, buffer); + } + + int idle() override + { + if (auto* comp = configuredEditor.get()) + return comp->idle(); + + return 0; + } + + void setScaleFactor (float newScale) override + { + userScaleFactor = newScale; + + if (configuredEditor != nullptr) + { + configuredEditor->setUserScaleFactor (userScaleFactor); + configuredEditor->sendScaleFactorToPlugin(); + } + } + +private: + bool isResizable (const RequiredFeatures& requiredFeatures, + const OptionalFeatures& optionalFeatures) const + { + const auto uriMatches = [] (const LilvNode* node) + { + const auto* uri = lilv_node_as_uri (node); + return std::strcmp (uri, LV2_UI__noUserResize) == 0; + }; + + return uiDescriptor->hasExtensionData (world, LV2_UI__resize) + && ! uiDescriptor->hasExtensionData (world, LV2_UI__noUserResize) + && noneOf (requiredFeatures.values, uriMatches) + && noneOf (optionalFeatures.values, uriMatches); + } + + bool isScalable() const + { + return uiDescriptor->hasExtensionData (world, LV2_OPTIONS__interface); + } + + void viewRequestedResizeInLogicalPixels (int width, int height) override + { + if (! resizeFromHost) + setSize (width, height); + } + + World& world; + InstanceProvider* instanceProvider; + UiDescriptor* uiDescriptor; + TouchListener* touchListener; + EditorListener* listener; + String uiBundleUri; + const RequiredFeatures required; + const OptionalFeatures optional; + std::unique_ptr configuredEditor; + float userScaleFactor = 1.0f; + bool resizeFromHost = false; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Editor) +}; + +class Uis +{ +public: + explicit Uis (const LilvPlugin* plugin) noexcept : uis (lilv_plugin_get_uis (plugin)) {} + + unsigned size() const noexcept { return lilv_uis_size (uis.get()); } + + UisIterator begin() const noexcept { return UisIterator { uis.get() }; } + UisIterator end() const noexcept { return UisIterator{}; } + + const LilvUI* getByUri (const NodeUri& uri) const + { + return lilv_uis_get_by_uri (uis.get(), uri.get()); + } + +private: + struct Free + { + void operator() (LilvUIs* ptr) const noexcept { lilv_uis_free (ptr); } + }; + + std::unique_ptr uis; +}; + +//============================================================================== +class PluginClass +{ +public: + explicit PluginClass (const LilvPluginClass* c) : pluginClass (c) {} + + NodeUri getParentUri() const noexcept { return NodeUri::copy (lilv_plugin_class_get_parent_uri (pluginClass)); } + NodeUri getUri() const noexcept { return NodeUri::copy (lilv_plugin_class_get_uri (pluginClass)); } + NodeString getLabel() const noexcept { return NodeString::copy (lilv_plugin_class_get_label (pluginClass)); } + OwningPluginClasses getChildren() const noexcept + { + return OwningPluginClasses { OwningPluginClasses::type { lilv_plugin_class_get_children (pluginClass) } }; + } + +private: + const LilvPluginClass* pluginClass = nullptr; +}; + +using FloatWriter = void (*) (LV2_Atom_Forge*, float); + +struct ParameterWriterUrids +{ + LV2_URID mLV2_PATCH__Set; + LV2_URID mLV2_PATCH__property; + LV2_URID mLV2_PATCH__value; + LV2_URID mLV2_ATOM__eventTransfer; +}; + +struct MessageHeaderAndSize +{ + MessageHeader header; + uint32_t size; +}; + +class ParameterWriter +{ +public: + ParameterWriter (ControlPort* p) + : data (PortBacking { p }), kind (Kind::port) {} + + ParameterWriter (FloatWriter write, LV2_URID urid, uint32_t controlPortIndex) + : data (PatchBacking { write, urid, controlPortIndex }), kind (Kind::patch) {} + + void writeToProcessor (const ParameterWriterUrids urids, LV2_Atom_Forge* forge, float value) const + { + switch (kind) + { + case Kind::patch: + { + if (forge != nullptr) + { + lv2_atom_forge_frame_time (forge, 0); + writeSetToForge (urids, *forge, value); + } + + break; + } + + case Kind::port: + data.port.port->currentValue = value; + break; + } + } + + MessageHeaderAndSize writeToUi (const ParameterWriterUrids urids, LV2_Atom_Forge& forge, float value) const + { + const auto getWrittenBytes = [&]() -> uint32_t + { + if (const auto* atom = convertToAtomPtr (forge.buf, forge.size)) + return (uint32_t) (atom->size + sizeof (LV2_Atom)); + + jassertfalse; + return 0; + }; + + switch (kind) + { + case Kind::patch: + writeSetToForge (urids, forge, value); + return { { data.patch.controlPortIndex, urids.mLV2_ATOM__eventTransfer }, getWrittenBytes() }; + + case Kind::port: + lv2_atom_forge_raw (&forge, &value, sizeof (value)); + return { { data.port.port->header.index, 0 }, sizeof (value) }; + } + + return { { 0, 0 }, 0 }; + } + + const LV2_URID* getUrid() const + { + return kind == Kind::patch ? &data.patch.urid : nullptr; + } + + const uint32_t* getPortIndex() const + { + return kind == Kind::port ? &data.port.port->header.index : nullptr; + } + +private: + void writeSetToForge (const ParameterWriterUrids urids, LV2_Atom_Forge& forge, float value) const + { + lv2_shared::ObjectFrame object { &forge, (uint32_t) 0, urids.mLV2_PATCH__Set }; + + lv2_atom_forge_key (&forge, urids.mLV2_PATCH__property); + lv2_atom_forge_urid (&forge, data.patch.urid); + + lv2_atom_forge_key (&forge, urids.mLV2_PATCH__value); + data.patch.write (&forge, value); + } + + struct PortBacking + { + ControlPort* port; + }; + + struct PatchBacking + { + FloatWriter write; + LV2_URID urid; + uint32_t controlPortIndex; + }; + + union Data + { + static_assert (std::is_trivial::value, "PortBacking must be trivial"); + static_assert (std::is_trivial::value, "PatchBacking must be trivial"); + + explicit Data (PortBacking p) : port (p) {} + explicit Data (PatchBacking p) : patch (p) {} + + PortBacking port; + PatchBacking patch; + }; + + enum class Kind { port, patch }; + + Data data; + Kind kind; + + JUCE_LEAK_DETECTOR (ParameterWriter) +}; + +static String lilvNodeToUriString (const LilvNode* node) +{ + return node != nullptr ? String::fromUTF8 (lilv_node_as_uri (node)) : String{}; +} + +static String lilvNodeToString (const LilvNode* node) +{ + return node != nullptr ? String::fromUTF8 (lilv_node_as_string (node)) : String{}; +} + +/* This holds all of the discovered groups in the plugin's manifest, and allows us to + add parameters to these groups as we discover them. + + Once all the parameters have been added with addParameter(), you can call + getTree() to convert this class' contents (which are optimised for fast lookup + and modification) into a plain old AudioProcessorParameterGroup. +*/ +class IntermediateParameterTree +{ +public: + explicit IntermediateParameterTree (World& worldIn) + : world (worldIn) + { + const auto groups = getGroups (world); + const auto symbolNode = world.newUri (LV2_CORE__symbol); + const auto nameNode = world.newUri (LV2_CORE__name); + + for (const auto& group : groups) + { + const auto symbol = lilvNodeToString (world.get (group.get(), symbolNode.get(), nullptr).get()); + const auto name = lilvNodeToString (world.get (group.get(), nameNode .get(), nullptr).get()); + owning.emplace (lilvNodeToUriString (group.get()), + std::make_unique (symbol, name, "|")); + } + } + + void addParameter (StringRef group, std::unique_ptr param) + { + if (param == nullptr) + return; + + const auto it = owning.find (group); + (it != owning.cend() ? *it->second : topLevel).addChild (std::move (param)); + } + + static AudioProcessorParameterGroup getTree (IntermediateParameterTree tree) + { + std::map nonowning; + + for (const auto& pair : tree.owning) + nonowning.emplace (pair.first, pair.second.get()); + + const auto groups = getGroups (tree.world); + const auto subgroupNode = tree.world.newUri (LV2_PORT_GROUPS__subGroupOf); + + for (const auto& group : groups) + { + const auto innerIt = tree.owning.find (lilvNodeToUriString (group.get())); + + if (innerIt == tree.owning.cend()) + continue; + + const auto outer = lilvNodeToUriString (tree.world.get (group.get(), subgroupNode.get(), nullptr).get()); + const auto outerIt = nonowning.find (outer); + + if (outerIt != nonowning.cend() && containsParameters (outerIt->second)) + outerIt->second->addChild (std::move (innerIt->second)); + } + + for (auto& subgroup : tree.owning) + if (containsParameters (subgroup.second.get())) + tree.topLevel.addChild (std::move (subgroup.second)); + + return std::move (tree.topLevel); + } + +private: + static std::vector getGroups (World& world) + { + std::vector names; + + for (auto* uri : { LV2_PORT_GROUPS__Group, LV2_PORT_GROUPS__InputGroup, LV2_PORT_GROUPS__OutputGroup }) + for (const auto* group : world.findNodes (nullptr, world.newUri (LILV_NS_RDF "type").get(), world.newUri (uri).get())) + names.push_back (OwningNode { lilv_node_duplicate (group) }); + + return names; + } + + static bool containsParameters (const AudioProcessorParameterGroup* g) + { + if (g == nullptr) + return false; + + for (auto* node : *g) + { + if (node->getParameter() != nullptr) + return true; + + if (auto* group = node->getGroup()) + if (containsParameters (group)) + return true; + } + + return false; + } + + World& world; + AudioProcessorParameterGroup topLevel; + std::map> owning; + + JUCE_LEAK_DETECTOR (IntermediateParameterTree) +}; + +struct BypassParameter : public LV2Parameter +{ + BypassParameter (const ParameterInfo& parameterInfo, ParameterValuesAndFlags& cacheIn) + : LV2Parameter ("Bypass", parameterInfo, cacheIn) {} + + float getValue() const noexcept override + { + return LV2Parameter::getValue() > 0.0f ? 0.0f : 1.0f; + } + + void setValue (float newValue) override + { + LV2Parameter::setValue (newValue > 0.0f ? 0.0f : 1.0f); + } + + float getDefaultValue() const override { return 0.0f; } + bool isAutomatable() const override { return true; } + bool isDiscrete() const override { return true; } + bool isBoolean() const override { return true; } + int getNumSteps() const override { return 2; } + StringArray getAllValueStrings() const override { return { TRANS ("Off"), TRANS ("On") }; } +}; + +struct ParameterData +{ + ParameterInfo info; + ParameterWriter writer; + String group; + String name; +}; + +template +static auto getPortPointers (SimpleSpan range) +{ + using std::begin; + std::vector result; + + for (auto& port : range) + { + result.resize (std::max ((size_t) (port.header.index + 1), result.size()), nullptr); + result[port.header.index] = &port; + } + + return result; +} + +static std::unique_ptr makeParameter (const uint32_t* enabledPortIndex, + const ParameterData& data, + ParameterValuesAndFlags& cache) +{ + // The bypass parameter is a bit special, in that JUCE expects the parameter to be a bypass + // (where 0 is active, 1 is inactive), but the LV2 version is called "enabled" and has + // different semantics (0 is inactive, 1 is active). + // To work around this, we wrap the LV2 parameter in a special inverting JUCE parameter. + + if (enabledPortIndex != nullptr) + if (auto* index = data.writer.getPortIndex()) + if (*index == *enabledPortIndex) + return std::make_unique (data.info, cache); + + return std::make_unique (data.name, data.info, cache); +} + +class ControlPortAccelerationStructure +{ +public: + ControlPortAccelerationStructure (SimpleSpan controlPorts) + : indexedControlPorts (getPortPointers (controlPorts)) + { + for (const auto& port : controlPorts) + if (port.header.direction == Port::Direction::output) + outputPorts.push_back (&port); + } + + const std::vector& getIndexedControlPorts() { return indexedControlPorts; } + + ControlPort* getControlPortByIndex (uint32_t index) const + { + if (isPositiveAndBelow (index, indexedControlPorts.size())) + return indexedControlPorts[index]; + + return nullptr; + } + + void writeOutputPorts (UiEventListener* target, MessageBufferInterface& uiMessages) const + { + if (target == nullptr) + return; + + for (const auto* port : outputPorts) + { + const auto chars = toChars (port->currentValue); + uiMessages.pushMessage ({ target, { port->header.index, 0 } }, (uint32_t) chars.size(), chars.data()); + } + } + +private: + std::vector indexedControlPorts; + std::vector outputPorts; +}; + +class ParameterValueCache +{ +public: + /* This takes some information about all the parameters that this plugin wants to expose, + then builds and installs the actual parameters. + */ + ParameterValueCache (AudioPluginInstance& processor, + World& world, + LV2_URID_Map mapFeature, + const std::vector& data, + ControlPort* enabledPort) + : uiForge (mapFeature), + cache (data.size()) + { + // Parameter indices are unknown until we add the parameters to the processor. + // This map lets us keep track of which ParameterWriter corresponds to each parameter. + // After the parameters have been added to the processor, we'll convert this + // to a simple vector that stores each ParameterWriter at the same index + // as the corresponding parameter. + std::map writerForParameter; + + IntermediateParameterTree tree { world }; + + const auto* enabledPortIndex = enabledPort != nullptr ? &enabledPort->header.index + : nullptr; + + for (const auto& item : data) + { + auto param = makeParameter (enabledPortIndex, item, cache); + + if (auto* urid = item.writer.getUrid()) + urids.emplace (*urid, param.get()); + + if (auto* index = item.writer.getPortIndex()) + portIndices.emplace (*index, param.get()); + + writerForParameter.emplace (param.get(), item.writer); + + tree.addParameter (item.group, std::move (param)); + } + + processor.setHostedParameterTree (IntermediateParameterTree::getTree (std::move (tree))); + + // Build the vector of writers + writers.reserve (data.size()); + + for (auto* param : processor.getParameters()) + { + const auto it = writerForParameter.find (param); + jassert (it != writerForParameter.end()); + writers.push_back (it->second); // The writer must exist at the same index as the parameter! + } + + // Duplicate port indices or urids? + jassert (processor.getParameters().size() == (int) (urids.size() + portIndices.size())); + + // Set parameters to default values + const auto setToDefault = [] (auto& container) + { + for (auto& item : container) + item.second->setDenormalisedValueWithoutTriggeringUpdate (item.second->getDenormalisedDefaultValue()); + }; + + setToDefault (urids); + setToDefault (portIndices); + } + + void postChangedParametersToProcessor (const ParameterWriterUrids helperUrids, + LV2_Atom_Forge* forge) + { + cache.ifProcessorValuesChanged ([&] (size_t index, float value) + { + writers[index].writeToProcessor (helperUrids, forge, value); + }); + } + + void postChangedParametersToUi (UiEventListener* target, + const ParameterWriterUrids helperUrids, + MessageBufferInterface& uiMessages) + { + if (target == nullptr) + return; + + cache.ifUiValuesChanged ([&] (size_t index, float value) + { + writeParameterToUi (target, writers[index], value, helperUrids, uiMessages); + }); + } + + void postAllParametersToUi (UiEventListener* target, + const ParameterWriterUrids helperUrids, + MessageBufferInterface& uiMessages) + { + if (target == nullptr) + return; + + const auto numWriters = writers.size(); + + for (size_t i = 0; i < numWriters; ++i) + writeParameterToUi (target, writers[i], cache.get (i), helperUrids, uiMessages); + + cache.clearUiFlags(); + } + + LV2Parameter* getParamByUrid (LV2_URID urid) const + { + const auto it = urids.find (urid); + return it != urids.end() ? it->second : nullptr; + } + + LV2Parameter* getParamByPortIndex (uint32_t portIndex) const + { + const auto it = portIndices.find (portIndex); + return it != portIndices.end() ? it->second : nullptr; + } + + void updateFromControlPorts (const ControlPortAccelerationStructure& ports) const + { + for (const auto& pair : portIndices) + if (auto* port = ports.getControlPortByIndex (pair.first)) + if (auto* param = pair.second) + param->setDenormalisedValueWithoutTriggeringUpdate (port->currentValue); + } + +private: + void writeParameterToUi (UiEventListener* target, + const ParameterWriter& writer, + float value, + const ParameterWriterUrids helperUrids, + MessageBufferInterface& uiMessages) + { + JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED + + uiForge.setBuffer (forgeStorage.data(), forgeStorage.size()); + const auto messageHeader = writer.writeToUi (helperUrids, *uiForge.get(), value); + uiMessages.pushMessage ({ target, messageHeader.header }, messageHeader.size, forgeStorage.data()); + } + + SingleSizeAlignedStorage<8> forgeStorage { 256 }; + lv2_shared::AtomForge uiForge; + + ParameterValuesAndFlags cache; + std::vector writers; + std::map urids; + std::map portIndices; + + JUCE_LEAK_DETECTOR (ParameterValueCache) +}; + +struct PatchSetCallback +{ + explicit PatchSetCallback (ParameterValueCache& x) : cache (x) {} + + // If we receive a patch set from the processor, we can assume that the UI will + // put itself into the correct state when it receives the message. + void setParameter (LV2_URID property, float value) const noexcept + { + if (auto* param = cache.getParamByUrid (property)) + param->setDenormalisedValueWithoutTriggeringUpdate (value); + } + + // TODO gesture support will probably go here, once it's part of the LV2 spec + + ParameterValueCache& cache; +}; + +struct SupportedParameter +{ + ParameterInfo info; + bool supported; + LV2_URID type; +}; + +static SupportedParameter getInfoForPatchParameter (World& worldIn, + const UsefulUrids& urids, + const NodeUri& property) +{ + const auto rangeUri = worldIn.newUri (LILV_NS_RDFS "range"); + const auto type = worldIn.get (property.get(), rangeUri.get(), nullptr); + + if (type == nullptr) + return { {}, false, {} }; + + const auto typeUrid = urids.symap.map (lilv_node_as_uri (type.get())); + + const LV2_URID types[] { urids.mLV2_ATOM__Int, + urids.mLV2_ATOM__Long, + urids.mLV2_ATOM__Float, + urids.mLV2_ATOM__Double, + urids.mLV2_ATOM__Bool }; + + if (std::find (std::begin (types), std::end (types), typeUrid) == std::end (types)) + return { {}, false, {} }; + + const auto getValue = [&] (const char* uri, float fallback) + { + return Port::getFloatValue (worldIn.get (property.get(), worldIn.newUri (uri).get(), nullptr).get(), fallback); + }; + + const auto hasPortProperty = [&] (const char* uri) + { + return worldIn.ask (property.get(), + worldIn.newUri (LV2_CORE__portProperty).get(), + worldIn.newUri (uri).get()); + }; + + const auto metadataScalePoints = worldIn.findNodes (property.get(), + worldIn.newUri (LV2_CORE__scalePoint).get(), + nullptr); + SafeSortedSet parsedScalePoints; + + for (const auto* scalePoint : metadataScalePoints) + { + const auto label = worldIn.get (scalePoint, worldIn.newUri (LILV_NS_RDFS "label").get(), nullptr); + const auto value = worldIn.get (scalePoint, worldIn.newUri (LILV_NS_RDF "value").get(), nullptr); + + if (label != nullptr && value != nullptr) + parsedScalePoints.insert ({ lilv_node_as_string (label.get()), lilv_node_as_float (value.get()) }); + else + jassertfalse; // A ScalePoint must have both a rdfs:label and a rdf:value + } + + const auto minimum = getValue (LV2_CORE__minimum, 0.0f); + const auto maximum = getValue (LV2_CORE__maximum, 1.0f); + + return { { std::move (parsedScalePoints), + "des:" + String::fromUTF8 (property.getTyped()), + getValue (LV2_CORE__default, (minimum + maximum) * 0.5f), + minimum, + maximum, + typeUrid == urids.mLV2_ATOM__Bool || hasPortProperty (LV2_CORE__toggled), + typeUrid == urids.mLV2_ATOM__Int || typeUrid == urids.mLV2_ATOM__Long, + hasPortProperty (LV2_CORE__enumeration) }, + true, + typeUrid }; +} + +static std::vector getPortBasedParameters (World& world, + const Plugin& plugin, + std::initializer_list hiddenPorts, + SimpleSpan controlPorts) +{ + std::vector result; + + const auto groupNode = world.newUri (LV2_PORT_GROUPS__group); + + for (auto& port : controlPorts) + { + if (port.header.direction != Port::Direction::input) + continue; + + if (std::find (std::begin (hiddenPorts), std::end (hiddenPorts), &port) != std::end (hiddenPorts)) + continue; + + const auto lilvPort = plugin.getPortByIndex (port.header.index); + const auto group = lilvNodeToUriString (lilvPort.get (groupNode.get()).get()); + + result.push_back ({ port.info, ParameterWriter { &port }, group, port.header.name }); + } + + return result; +} + +static void writeFloatToForge (LV2_Atom_Forge* forge, float value) { lv2_atom_forge_float (forge, value); } +static void writeDoubleToForge (LV2_Atom_Forge* forge, float value) { lv2_atom_forge_double (forge, (double) value); } +static void writeIntToForge (LV2_Atom_Forge* forge, float value) { lv2_atom_forge_int (forge, (int32_t) value); } +static void writeLongToForge (LV2_Atom_Forge* forge, float value) { lv2_atom_forge_long (forge, (int64_t) value); } +static void writeBoolToForge (LV2_Atom_Forge* forge, float value) { lv2_atom_forge_bool (forge, value > 0.5f); } + +static std::vector getPatchBasedParameters (World& world, + const Plugin& plugin, + const UsefulUrids& urids, + uint32_t controlPortIndex) +{ + // This returns our writable parameters in an indeterminate order. + // We want our parameters to be in a consistent order between runs, so + // we'll create all the parameters in one pass, sort them, and then + // add them in a separate pass. + const auto writableControls = world.findNodes (plugin.getUri().get(), + world.newUri (LV2_PATCH__writable).get(), + nullptr); + + struct DataAndUri + { + ParameterData data; + String uri; + }; + + std::vector resultWithUris; + + const auto groupNode = world.newUri (LV2_PORT_GROUPS__group); + + for (auto* ctrl : writableControls) + { + const auto labelString = [&] + { + if (auto label = world.get (ctrl, world.newUri (LILV_NS_RDFS "label").get(), nullptr)) + return String::fromUTF8 (lilv_node_as_string (label.get())); + + return String(); + }(); + + const auto uri = String::fromUTF8 (lilv_node_as_uri (ctrl)); + const auto info = getInfoForPatchParameter (world, urids, world.newUri (uri.toRawUTF8())); + + if (! info.supported) + continue; + + const auto write = [&] + { + if (info.type == urids.mLV2_ATOM__Int) + return writeIntToForge; + + if (info.type == urids.mLV2_ATOM__Long) + return writeLongToForge; + + if (info.type == urids.mLV2_ATOM__Double) + return writeDoubleToForge; + + if (info.type == urids.mLV2_ATOM__Bool) + return writeBoolToForge; + + return writeFloatToForge; + }(); + + const auto group = lilvNodeToUriString (world.get (ctrl, groupNode.get(), nullptr).get()); + resultWithUris.push_back ({ { info.info, + ParameterWriter { write, urids.symap.map (uri.toRawUTF8()), controlPortIndex }, + group, + labelString }, + uri }); + } + + const auto compareUris = [] (const DataAndUri& a, const DataAndUri& b) { return a.uri < b.uri; }; + std::sort (resultWithUris.begin(), resultWithUris.end(), compareUris); + + std::vector result; + + for (const auto& item : resultWithUris) + result.push_back (item.data); + + return result; +} + +static std::vector getJuceParameterInfo (World& world, + const Plugin& plugin, + const UsefulUrids& urids, + std::initializer_list hiddenPorts, + SimpleSpan controlPorts, + uint32_t controlPortIndex) +{ + auto port = getPortBasedParameters (world, plugin, hiddenPorts, controlPorts); + auto patch = getPatchBasedParameters (world, plugin, urids, controlPortIndex); + + port.insert (port.end(), patch.begin(), patch.end()); + return port; +} + +// Rather than sprinkle #ifdef everywhere, risking the wrath of the entire C++ +// standards committee, we put all of our conditionally-compiled stuff into a +// specialised template that compiles away to nothing when editor support is +// not available. +#if JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD + constexpr auto editorFunctionalityEnabled = true; +#else + constexpr auto editorFunctionalityEnabled = false; +#endif + +template class OptionalEditor; + +template <> +class OptionalEditor +{ +public: + OptionalEditor (String uiBundleUriIn, UiDescriptor uiDescriptorIn, std::function timerCallback) + : uiBundleUri (std::move (uiBundleUriIn)), + uiDescriptor (std::move (uiDescriptorIn)), + changedParameterFlusher (std::move (timerCallback)) {} + + void createView() + { + if (auto* editor = editorPointer.getComponent()) + editor->createView(); + } + + void destroyView() + { + if (auto* editor = editorPointer.getComponent()) + editor->destroyView(); + } + + std::unique_ptr createEditor (World& world, + AudioPluginInstance& p, + InstanceProvider& instanceProviderIn, + TouchListener& touchListenerIn, + EditorListener& listenerIn) + { + if (! hasEditor()) + return nullptr; + + const auto queryFeatures = [this, &world] (const char* kind) + { + return world.findNodes (world.newUri (uiDescriptor.get()->URI).get(), + world.newUri (kind).get(), + nullptr); + }; + + auto newEditor = std::make_unique (world, + p, + instanceProviderIn, + uiDescriptor, + touchListenerIn, + listenerIn, + uiBundleUri, + RequiredFeatures { queryFeatures (LV2_CORE__requiredFeature) }, + OptionalFeatures { queryFeatures (LV2_CORE__optionalFeature) }); + + editorPointer = newEditor.get(); + + changedParameterFlusher.startTimerHz (60); + + return newEditor; + } + + bool hasEditor() const + { + return uiDescriptor.get() != nullptr; + } + + void prepareToDestroyEditor() + { + changedParameterFlusher.stopTimer(); + } + +private: + Component::SafePointer editorPointer = nullptr; + String uiBundleUri; + UiDescriptor uiDescriptor; + LambdaTimer changedParameterFlusher; +}; + +template <> +class OptionalEditor +{ +public: + OptionalEditor (String, UiDescriptor, std::function) {} + + void createView() {} + void destroyView() {} + + std::unique_ptr createEditor(World&, + AudioPluginInstance&, + InstanceProvider&, + TouchListener&, + EditorListener&) + { + return nullptr; + } + + bool hasEditor() const { return false; } + void prepareToDestroyEditor() {} +}; + +//============================================================================== +class LV2AudioPluginInstance : public AudioPluginInstance, + private TouchListener, + private EditorListener, + private InstanceProvider +{ +public: + LV2AudioPluginInstance (std::shared_ptr worldIn, + const Plugin& pluginIn, + const UsefulUris& uris, + std::unique_ptr&& in, + PluginDescription&& desc, + std::vector knownPresetUris, + PluginState stateToApply, + String uiBundleUriIn, + UiDescriptor uiDescriptorIn) + : LV2AudioPluginInstance (worldIn, + pluginIn, + std::move (in), + std::move (desc), + std::move (knownPresetUris), + std::move (stateToApply), + std::move (uiBundleUriIn), + std::move (uiDescriptorIn), + getParsedBuses (*worldIn, pluginIn, uris)) {} + + void fillInPluginDescription (PluginDescription& d) const override { d = description; } + + const String getName() const override { return description.name; } + + void prepareToPlay (double sampleRate, int numSamples) override + { + // In REAPER, changing the sample rate will deactivate the plugin, + // save its state, destroy it, create a new instance, restore the + // state, and then activate the new instance. + // We'll do the same, because there's no way to retroactively change the + // plugin sample rate. + // This is a bit expensive, so try to avoid changing the sample rate too + // frequently. + + // In addition to the above, we also need to destroy the custom view, + // and recreate it after creating the new plugin instance. + // Ideally this should all happen in the same Component. + + deactivate(); + destroyView(); + + MemoryBlock mb; + getStateInformation (mb); + + instance = std::make_unique (*world, + std::move (instance->symap), + plugin, + std::move (instance->ports), + numSamples, + sampleRate); + + // prepareToPlay is *guaranteed* not to be called concurrently with processBlock + setStateInformationImpl (mb.getData(), (int) mb.getSize(), ConcurrentWithAudioCallback::no); + + jassert (numSamples == instance->features.getMaxBlockSize()); + + optionalEditor.createView(); + activate(); + } + + void releaseResources() override { deactivate(); } + + using AudioPluginInstance::processBlock; + using AudioPluginInstance::processBlockBypassed; + + void processBlock (AudioBuffer& audio, MidiBuffer& midi) override + { + processBlockImpl (audio, midi); + } + + void processBlockBypassed (AudioBuffer& audio, MidiBuffer& midi) override + { + if (bypassParam != nullptr) + processBlockImpl (audio, midi); + else + AudioPluginInstance::processBlockBypassed (audio, midi); + } + + double getTailLengthSeconds() const override { return {}; } // TODO + + bool acceptsMidi() const override + { + if (instance == nullptr) + return false; + + auto ports = instance->ports.getAtomPorts(); + + return std::any_of (ports.begin(), ports.end(), [&] (const AtomPort& a) + { + if (a.header.direction != Port::Direction::input) + return false; + + return portAtIndexSupportsMidi (a.header.index); + }); + } + + bool producesMidi() const override + { + if (instance == nullptr) + return false; + + auto ports = instance->ports.getAtomPorts(); + + return std::any_of (ports.begin(), ports.end(), [&] (const AtomPort& a) + { + if (a.header.direction != Port::Direction::output) + return false; + + return portAtIndexSupportsMidi (a.header.index); + }); + } + + AudioProcessorEditor* createEditor() override + { + return optionalEditor.createEditor (*world, *this, *this, *this, *this).release(); + } + + bool hasEditor() const override + { + return optionalEditor.hasEditor(); + } + + int getNumPrograms() override { return (int) presetUris.size(); } + + int getCurrentProgram() override + { + return lastAppliedPreset; + } + + void setCurrentProgram (int newProgram) override + { + JUCE_ASSERT_MESSAGE_THREAD; + + if (! isPositiveAndBelow (newProgram, presetUris.size())) + return; + + lastAppliedPreset = newProgram; + applyStateWithAppropriateLocking (loadStateWithUri (presetUris[(size_t) newProgram]), + ConcurrentWithAudioCallback::yes); + } + + const String getProgramName (int program) override + { + JUCE_ASSERT_MESSAGE_THREAD; + + if (isPositiveAndBelow (program, presetUris.size())) + return loadStateWithUri (presetUris[(size_t) program]).getLabel(); + + return {}; + } + + void changeProgramName (int program, const String& label) override + { + JUCE_ASSERT_MESSAGE_THREAD; + + if (isPositiveAndBelow (program, presetUris.size())) + loadStateWithUri (presetUris[(size_t) program]).setLabel (label); + } + + void getStateInformation (MemoryBlock& block) override + { + JUCE_ASSERT_MESSAGE_THREAD; + + // TODO where should the state URI come from? + PortMap portStateManager (instance->ports); + const auto stateUri = String::fromUTF8 (instance->instance.getUri()) + "/savedState"; + auto mapFeature = instance->symap->getMapFeature(); + auto unmapFeature = instance->symap->getUnmapFeature(); + const auto state = PluginState::SaveRestoreHandle (*instance, portStateManager).save (plugin.get(), &mapFeature); + const auto string = state.toString (world->get(), &mapFeature, &unmapFeature, stateUri.toRawUTF8()); + block.replaceAll (string.data(), string.size()); + } + + void setStateInformation (const void* data, int size) override + { + setStateInformationImpl (data, size, ConcurrentWithAudioCallback::yes); + } + + void setNonRealtime (bool newValue) noexcept override + { + JUCE_ASSERT_MESSAGE_THREAD; + + AudioPluginInstance::setNonRealtime (newValue); + instance->features.setNonRealtime (newValue); + } + + bool isBusesLayoutSupported (const BusesLayout& layout) const override + { + for (const auto& pair : { std::make_tuple (&layout.inputBuses, &declaredBusLayout.inputs), + std::make_tuple (&layout.outputBuses, &declaredBusLayout.outputs) }) + { + const auto& requested = *std::get<0> (pair); + const auto& allowed = *std::get<1> (pair); + + if ((size_t) requested.size() != allowed.size()) + return false; + + for (size_t busIndex = 0; busIndex < allowed.size(); ++busIndex) + { + const auto& requestedBus = requested[(int) busIndex]; + const auto& allowedBus = allowed[busIndex]; + + if (! allowedBus.isCompatible (requestedBus)) + return false; + } + } + + return true; + } + + void processorLayoutsChanged() override { ioMap = lv2_shared::PortToAudioBufferMap { getBusesLayout(), declaredBusLayout }; } + + AudioProcessorParameter* getBypassParameter() const override { return bypassParam; } + +private: + enum class ConcurrentWithAudioCallback { no, yes }; + + LV2AudioPluginInstance (std::shared_ptr worldIn, + const Plugin& pluginIn, + std::unique_ptr&& in, + PluginDescription&& desc, + std::vector knownPresetUris, + PluginState stateToApply, + String uiBundleUriIn, + UiDescriptor uiDescriptorIn, + const lv2_shared::ParsedBuses& parsedBuses) + : AudioPluginInstance (getBusesProperties (parsedBuses, *worldIn)), + declaredBusLayout (parsedBuses), + world (std::move (worldIn)), + plugin (pluginIn), + description (std::move (desc)), + presetUris (std::move (knownPresetUris)), + instance (std::move (in)), + optionalEditor (std::move (uiBundleUriIn), + std::move (uiDescriptorIn), + [this] { postChangedParametersToUi(); }) + { + applyStateWithAppropriateLocking (std::move (stateToApply), ConcurrentWithAudioCallback::no); + } + + void setStateInformationImpl (const void* data, int size, ConcurrentWithAudioCallback concurrent) + { + JUCE_ASSERT_MESSAGE_THREAD; + + if (data == nullptr || size == 0) + return; + + auto begin = static_cast (data); + std::vector copy (begin, begin + size); + copy.push_back (0); + auto mapFeature = instance->symap->getMapFeature(); + applyStateWithAppropriateLocking (PluginState { lilv_state_new_from_string (world->get(), &mapFeature, copy.data()) }, + concurrent); + } + + // This does *not* destroy the editor component. + // If we destroy the processor, the view must also be destroyed to avoid dangling pointers. + // However, JUCE clients expect their editors to remain valid for the duration of the + // AudioProcessor's lifetime. + // As a compromise, this will create a new LV2 view into an existing editor component. + void destroyView() + { + optionalEditor.destroyView(); + } + + void activate() + { + if (! active) + instance->instance.activate(); + + active = true; + } + + void deactivate() + { + if (active) + instance->instance.deactivate(); + + active = false; + } + + void processBlockImpl (AudioBuffer& audio, MidiBuffer& midi) + { + preparePortsForRun (audio, midi); + + instance->instance.run (static_cast (audio.getNumSamples())); + instance->features.processResponses(); + + processPortsAfterRun (midi); + } + + bool portAtIndexSupportsMidi (uint32_t index) const noexcept + { + const auto port = plugin.getPortByIndex (index); + + if (! port.isValid()) + return false; + + return port.supportsEvent (world->newUri (LV2_MIDI__MidiEvent).get()); + } + + void controlGrabbed (uint32_t port, bool grabbed) override + { + if (auto* param = parameterValues.getParamByPortIndex (port)) + { + if (grabbed) + param->beginChangeGesture(); + else + param->endChangeGesture(); + } + } + + void viewCreated (UiEventListener* newListener) override + { + uiEventListener = newListener; + postAllParametersToUi(); + } + + ParameterWriterUrids getParameterWriterUrids() const + { + return { instance->urids.mLV2_PATCH__Set, + instance->urids.mLV2_PATCH__property, + instance->urids.mLV2_PATCH__value, + instance->urids.mLV2_ATOM__eventTransfer }; + } + + void postAllParametersToUi() + { + parameterValues.postAllParametersToUi (uiEventListener, getParameterWriterUrids(), *instance->processorToUi); + controlPortStructure.writeOutputPorts (uiEventListener, *instance->processorToUi); + } + + void postChangedParametersToUi() + { + parameterValues.postChangedParametersToUi (uiEventListener, getParameterWriterUrids(), *instance->processorToUi); + controlPortStructure.writeOutputPorts (uiEventListener, *instance->processorToUi); + } + + void notifyEditorBeingDeleted() override + { + optionalEditor.prepareToDestroyEditor(); + uiEventListener = nullptr; + editorBeingDeleted (getActiveEditor()); + } + + InstanceWithSupports* getInstanceWithSupports() const override + { + return instance.get(); + } + + void applyStateWithAppropriateLocking (PluginState&& state, ConcurrentWithAudioCallback concurrent) + { + PortMap portStateManager (instance->ports); + + // If a plugin supports threadSafeRestore, its restore method is thread-safe + // and may be called concurrently with audio class functions. + if (hasThreadSafeRestore || concurrent == ConcurrentWithAudioCallback::no) + { + state.restore (*instance, portStateManager); + } + else + { + const ScopedLock lock (getCallbackLock()); + state.restore (*instance, portStateManager); + } + + parameterValues.updateFromControlPorts (controlPortStructure); + asyncFullUiParameterUpdate.triggerAsyncUpdate(); + } + + PluginState loadStateWithUri (const String& str) + { + auto mapFeature = instance->symap->getMapFeature(); + const auto presetUri = world->newUri (str.toRawUTF8()); + lilv_world_load_resource (world->get(), presetUri.get()); + return PluginState { lilv_state_new_from_world (world->get(), &mapFeature, presetUri.get()) }; + } + + void connectPorts (AudioBuffer& audio) + { + // Plugins that cannot process in-place will require the feature "inPlaceBroken". + // We don't support that feature, so if we made it to this point we can assume that + // in-place processing works. + for (const auto& port : instance->ports.getAudioPorts()) + { + const auto channel = ioMap.getChannelForPort (port.header.index); + auto* ptr = isPositiveAndBelow (channel, audio.getNumChannels()) ? audio.getWritePointer (channel) + : nullptr; + instance->instance.connectPort (port.header.index, ptr); + } + + for (const auto& port : instance->ports.getCvPorts()) + instance->instance.connectPort (port.header.index, nullptr); + + for (auto& port : instance->ports.getAtomPorts()) + instance->instance.connectPort (port.header.index, port.data()); + } + + void writeTimeInfoToPort (AtomPort& port) + { + if (port.header.direction != Port::Direction::input || ! port.getSupportsTime()) + return; + + auto* forge = port.getForge().get(); + auto* playhead = getPlayHead(); + + if (playhead == nullptr) + return; + + // Write timing info to the control port + const auto info = playhead->getPosition(); + + if (! info.hasValue()) + return; + + const auto& urids = instance->urids; + + lv2_atom_forge_frame_time (forge, 0); + + lv2_shared::ObjectFrame object { forge, (uint32_t) 0, urids.mLV2_TIME__Position }; + + lv2_atom_forge_key (forge, urids.mLV2_TIME__speed); + lv2_atom_forge_float (forge, info->getIsPlaying() ? 1.0f : 0.0f); + + if (const auto samples = info->getTimeInSamples()) + { + lv2_atom_forge_key (forge, urids.mLV2_TIME__frame); + lv2_atom_forge_long (forge, *samples); + } + + if (const auto bar = info->getBarCount()) + { + lv2_atom_forge_key (forge, urids.mLV2_TIME__bar); + lv2_atom_forge_long (forge, *bar); + } + + if (const auto beat = info->getPpqPosition()) + { + if (const auto barStart = info->getPpqPositionOfLastBarStart()) + { + lv2_atom_forge_key (forge, urids.mLV2_TIME__barBeat); + lv2_atom_forge_float (forge, (float) (*beat - *barStart)); + } + + lv2_atom_forge_key (forge, urids.mLV2_TIME__beat); + lv2_atom_forge_double (forge, *beat); + } + + if (const auto sig = info->getTimeSignature()) + { + lv2_atom_forge_key (forge, urids.mLV2_TIME__beatUnit); + lv2_atom_forge_int (forge, sig->denominator); + + lv2_atom_forge_key (forge, urids.mLV2_TIME__beatsPerBar); + lv2_atom_forge_float (forge, (float) sig->numerator); + } + + if (const auto bpm = info->getBpm()) + { + lv2_atom_forge_key (forge, urids.mLV2_TIME__beatsPerMinute); + lv2_atom_forge_float (forge, (float) *bpm); + } + } + + void preparePortsForRun (AudioBuffer& audio, MidiBuffer& midiBuffer) + { + connectPorts (audio); + + for (auto& port : instance->ports.getAtomPorts()) + { + switch (port.header.direction) + { + case Port::Direction::input: + port.beginSequence(); + break; + + case Port::Direction::output: + port.replaceWithChunk(); + break; + + case Port::Direction::unknown: + jassertfalse; + break; + } + } + + for (auto& port : instance->ports.getAtomPorts()) + writeTimeInfoToPort (port); + + const auto controlPortForge = controlPort != nullptr ? controlPort->getForge().get() + : nullptr; + + parameterValues.postChangedParametersToProcessor (getParameterWriterUrids(), controlPortForge); + + instance->uiToProcessor.readAllAndClear ([this] (MessageHeader header, uint32_t size, const void* buffer) + { + pushMessage (header, size, buffer); + }); + + for (auto& port : instance->ports.getAtomPorts()) + { + if (port.header.direction == Port::Direction::input) + { + for (const auto meta : midiBuffer) + { + port.addEventToSequence (meta.samplePosition, + instance->urids.mLV2_MIDI__MidiEvent, + static_cast (meta.numBytes), + meta.data); + } + + port.endSequence(); + } + } + + if (freeWheelingPort != nullptr) + freeWheelingPort->currentValue = isNonRealtime() ? freeWheelingPort->info.max + : freeWheelingPort->info.min; + } + + void pushMessage (MessageHeader header, uint32_t size, const void* data) + { + ignoreUnused (size); + + if (header.protocol == 0 || header.protocol == instance->urids.mLV2_UI__floatProtocol) + { + const auto value = readUnaligned (data); + + if (auto* param = parameterValues.getParamByPortIndex (header.portIndex)) + { + param->setDenormalisedValue (value); + } + else if (auto* port = controlPortStructure.getControlPortByIndex (header.portIndex)) + { + // No parameter corresponds to this port, write to the port directly + port->currentValue = value; + } + } + else if (auto* atomPort = header.portIndex < atomPorts.size() ? atomPorts[header.portIndex] : nullptr) + { + if (header.protocol == instance->urids.mLV2_ATOM__eventTransfer) + { + if (const auto* atom = convertToAtomPtr (data, (size_t) size)) + { + atomPort->addAtomToSequence (0, atom); + + // Not UB; LV2_Atom_Object has LV2_Atom as its first member + if (atom->type == instance->urids.mLV2_ATOM__Object) + patchSetHelper.processPatchSet (reinterpret_cast (data), PatchSetCallback { parameterValues }); + } + } + else if (header.protocol == instance->urids.mLV2_ATOM__atomTransfer) + { + if (const auto* atom = convertToAtomPtr (data, (size_t) size)) + atomPort->replaceBufferWithAtom (atom); + } + } + } + + void processPortsAfterRun (MidiBuffer& midi) + { + midi.clear(); + + for (auto& port : instance->ports.getAtomPorts()) + processAtomPort (port, midi); + + if (latencyPort != nullptr) + setLatencySamples ((int) latencyPort->currentValue); + } + + void processAtomPort (const AtomPort& port, MidiBuffer& midi) + { + if (port.header.direction != Port::Direction::output) + return; + + // The port holds an Atom, by definition + const auto* atom = reinterpret_cast (port.data()); + + if (atom->type != instance->urids.mLV2_ATOM__Sequence) + return; + + // The Atom said that it was of sequence type, so this isn't UB + const auto* sequence = reinterpret_cast (port.data()); + + // http://lv2plug.in/ns/ext/atom#Sequence - run() stamps are always audio frames + jassert (sequence->body.unit == 0 || sequence->body.unit == instance->urids.mLV2_UNITS__frame); + + for (const auto* event : lv2_shared::SequenceIterator { lv2_shared::SequenceWithSize { sequence } }) + { + // At the moment, we forward all outgoing events to the UI. + instance->processorToUi->pushMessage ({ uiEventListener, { port.header.index, instance->urids.mLV2_ATOM__eventTransfer } }, + (uint32_t) (event->body.size + sizeof (LV2_Atom)), + &event->body); + + if (event->body.type == instance->urids.mLV2_MIDI__MidiEvent) + midi.addEvent (event + 1, static_cast (event->body.size), static_cast (event->time.frames)); + + if (lv2_atom_forge_is_object_type (port.getForge().get(), event->body.type)) + if (reinterpret_cast (event + 1)->otype == instance->urids.mLV2_STATE__StateChanged) + updateHostDisplay (ChangeDetails{}.withNonParameterStateChanged (true)); + + patchSetHelper.processPatchSet (event, PatchSetCallback { parameterValues }); + } + } + + // Check for duplicate channel designations, and convert the set to a discrete channel layout + // if any designations are duplicated. + static std::set validateAndRedesignatePorts (std::set info) + { + const auto channelSet = lv2_shared::ParsedGroup::getEquivalentSet (info); + + if ((int) info.size() == channelSet.size()) + return info; + + std::set result; + auto designation = (int) AudioChannelSet::discreteChannel0; + + for (auto& item : info) + { + auto copy = item; + copy.designation = (AudioChannelSet::ChannelType) designation++; + result.insert (copy); + } + + return result; + } + + static AudioChannelSet::ChannelType getPortDesignation (World& world, const Port& port, size_t indexInGroup) + { + const auto defaultResult = (AudioChannelSet::ChannelType) (AudioChannelSet::discreteChannel0 + indexInGroup); + const auto node = port.get (world.newUri (LV2_CORE__designation).get()); + + if (node == nullptr) + return defaultResult; + + const auto it = lv2_shared::channelDesignationMap.find (lilvNodeToUriString (node.get())); + + if (it == lv2_shared::channelDesignationMap.end()) + return defaultResult; + + return it->second; + } + + static lv2_shared::ParsedBuses getParsedBuses (World& world, const Plugin& p, const UsefulUris& uris) + { + const auto groupPropertyUri = world.newUri (LV2_PORT_GROUPS__group); + const auto optionalUri = world.newUri (LV2_CORE__connectionOptional); + + std::map> inputGroups, outputGroups; + std::set ungroupedInputs, ungroupedOutputs; + + for (uint32_t i = 0, numPorts = p.getNumPorts(); i < numPorts; ++i) + { + const auto port = p.getPortByIndex (i); + + if (port.getKind (uris) != Port::Kind::audio) + continue; + + const auto groupUri = lilvNodeToUriString (port.get (groupPropertyUri.get()).get()); + + auto& set = [&]() -> auto& + { + if (groupUri.isEmpty()) + return port.getDirection (uris) == Port::Direction::input ? ungroupedInputs : ungroupedOutputs; + + auto& group = port.getDirection (uris) == Port::Direction::input ? inputGroups : outputGroups; + return group[groupUri]; + }(); + + set.insert ({ port.getIndex(), getPortDesignation (world, port, set.size()), port.hasProperty (optionalUri) }); + } + + for (auto* groups : { &inputGroups, &outputGroups }) + for (auto& pair : *groups) + pair.second = validateAndRedesignatePorts (std::move (pair.second)); + + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4702) + const auto getMainGroupName = [&] (const char* propertyName) + { + for (const auto* item : p.getValue (world.newUri (propertyName).get())) + return lilvNodeToUriString (item); + + return String{}; + }; + JUCE_END_IGNORE_WARNINGS_MSVC + + return { findStableBusOrder (getMainGroupName (LV2_PORT_GROUPS__mainInput), inputGroups, ungroupedInputs), + findStableBusOrder (getMainGroupName (LV2_PORT_GROUPS__mainOutput), outputGroups, ungroupedOutputs) }; + } + + static String getNameForUri (World& world, StringRef uri) + { + if (uri.isEmpty()) + return String(); + + const auto node = world.get (world.newUri (uri).get(), + world.newUri (LV2_CORE__name).get(), + nullptr); + + if (node == nullptr) + return String(); + + return String::fromUTF8 (lilv_node_as_string (node.get())); + } + + static BusesProperties getBusesProperties (const lv2_shared::ParsedBuses& parsedBuses, World& world) + { + BusesProperties result; + + for (const auto& pair : { std::make_tuple (&parsedBuses.inputs, &result.inputLayouts), + std::make_tuple (&parsedBuses.outputs, &result.outputLayouts) }) + { + const auto& buses = *std::get<0> (pair); + auto& layout = *std::get<1> (pair); + + for (const auto& bus : buses) + { + layout.add (AudioProcessor::BusProperties { getNameForUri (world, bus.uid), + bus.getEquivalentSet(), + bus.isRequired() }); + } + } + + return result; + } + + LV2_URID map (const char* str) const + { + return instance != nullptr ? instance->symap->map (str) + : LV2_URID(); + } + + ControlPort* findControlPortWithIndex (uint32_t index) const + { + auto ports = instance->ports.getControlPorts(); + const auto indexMatches = [&] (const ControlPort& p) { return p.header.index == index; }; + const auto it = std::find_if (ports.begin(), ports.end(), indexMatches); + + return it != ports.end() ? &(*it) : nullptr; + } + + const lv2_shared::ParsedBuses declaredBusLayout; + lv2_shared::PortToAudioBufferMap ioMap { getBusesLayout(), declaredBusLayout }; + std::shared_ptr world; + Plugin plugin; + PluginDescription description; + std::vector presetUris; + std::unique_ptr instance; + AsyncFn asyncFullUiParameterUpdate { [this] { postAllParametersToUi(); } }; + + std::vector atomPorts = getPortPointers (instance->ports.getAtomPorts()); + + AtomPort* const controlPort = [&]() -> AtomPort* + { + const auto port = plugin.getPortByDesignation (world->newUri (LV2_CORE__InputPort).get(), + world->newUri (LV2_CORE__control).get()); + + if (! port.isValid()) + return nullptr; + + const auto index = port.getIndex(); + + if (! isPositiveAndBelow (index, atomPorts.size())) + return nullptr; + + return atomPorts[index]; + }(); + + ControlPort* const latencyPort = [&]() -> ControlPort* + { + if (! plugin.hasLatency()) + return nullptr; + + return findControlPortWithIndex (plugin.getLatencyPortIndex()); + }(); + + ControlPort* const freeWheelingPort = [&]() -> ControlPort* + { + const auto port = plugin.getPortByDesignation (world->newUri (LV2_CORE__InputPort).get(), + world->newUri (LV2_CORE__freeWheeling).get()); + + if (! port.isValid()) + return nullptr; + + return findControlPortWithIndex (port.getIndex()); + }(); + + ControlPort* const enabledPort = [&]() -> ControlPort* + { + const auto port = plugin.getPortByDesignation (world->newUri (LV2_CORE__InputPort).get(), + world->newUri (LV2_CORE_PREFIX "enabled").get()); + + if (! port.isValid()) + return nullptr; + + return findControlPortWithIndex (port.getIndex()); + }(); + + lv2_shared::PatchSetHelper patchSetHelper { instance->symap->getMapFeature(), plugin.getUri().getTyped() }; + ControlPortAccelerationStructure controlPortStructure { instance->ports.getControlPorts() }; + ParameterValueCache parameterValues { *this, + *world, + instance->symap->getMapFeature(), + getJuceParameterInfo (*world, + plugin, + instance->urids, + { latencyPort, freeWheelingPort }, + instance->ports.getControlPorts(), + controlPort != nullptr ? controlPort->header.index : 0), + enabledPort }; + LV2Parameter* bypassParam = enabledPort != nullptr ? parameterValues.getParamByPortIndex (enabledPort->header.index) + : nullptr; + + std::atomic uiEventListener { nullptr }; + OptionalEditor<> optionalEditor; + int lastAppliedPreset = 0; + bool hasThreadSafeRestore = plugin.hasExtensionData (world->newUri (LV2_STATE__threadSafeRestore)); + bool active { false }; + + JUCE_LEAK_DETECTOR (LV2AudioPluginInstance) +}; + +} // namespace lv2 + +//============================================================================== +class LV2PluginFormat::Pimpl +{ +public: + Pimpl() + { + world->loadAll(); + + const auto tempFile = lv2ResourceFolder.getFile(); + + if (tempFile.createDirectory()) + { + for (const auto& bundle : lv2::Bundle::getAllBundles()) + { + const auto pathToBundle = tempFile.getChildFile (bundle.name + String (".lv2")); + + if (! pathToBundle.createDirectory()) + continue; + + for (const auto& resource : bundle.contents) + pathToBundle.getChildFile (resource.name).replaceWithText (resource.contents); + + const auto pathString = File::addTrailingSeparator (pathToBundle.getFullPathName()); + world->loadBundle (world->newFileUri (nullptr, pathString.toRawUTF8())); + } + } + } + + ~Pimpl() + { + lv2ResourceFolder.getFile().deleteRecursively(); + } + + void findAllTypesForFile (OwnedArray& result, + const String& identifier) + { + auto desc = getDescription (findPluginByUri (identifier)); + + if (desc.fileOrIdentifier.isNotEmpty()) + result.add (std::make_unique (desc)); + } + + bool fileMightContainThisPluginType (const String& file) const + { + // If the string looks like a URI, then it could be a valid LV2 identifier + const auto* data = file.toRawUTF8(); + const auto numBytes = file.getNumBytesAsUTF8(); + std::vector vec (numBytes + 1, 0); + std::copy (data, data + numBytes, vec.begin()); + return serd_uri_string_has_scheme (vec.data()); + } + + String getNameOfPluginFromIdentifier (const String& identifier) + { + // We would have to actually load the bundle to get its name, + // and the bundle may contain multiple plugins + return identifier; + } + + bool pluginNeedsRescanning (const PluginDescription&) + { + return true; + } + + bool doesPluginStillExist (const PluginDescription& description) + { + return findPluginByUri (description.fileOrIdentifier) != nullptr; + } + + StringArray searchPathsForPlugins (const FileSearchPath&, bool, bool) + { + world->loadAll(); + + StringArray result; + + for (const auto* plugin : world->getAllPlugins()) + result.add (lv2_host::Plugin { plugin }.getUri().getTyped()); + + return result; + } + + FileSearchPath getDefaultLocationsToSearch() { return {}; } + + const LilvUI* findEmbeddableUi (const lv2_host::Uis* pluginUis, std::true_type) + { + if (pluginUis == nullptr) + return nullptr; + + const std::vector allUis (pluginUis->begin(), pluginUis->end()); + + if (allUis.empty()) + return nullptr; + + constexpr const char* rawUri = + #if JUCE_MAC + LV2_UI__CocoaUI; + #elif JUCE_WINDOWS + LV2_UI__WindowsUI; + #elif JUCE_LINUX || JUCE_BSD + LV2_UI__X11UI; + #else + nullptr; + #endif + + jassert (rawUri != nullptr); + const auto nativeUiUri = world->newUri (rawUri); + + struct UiWithSuitability + { + const LilvUI* ui; + unsigned suitability; + + bool operator< (const UiWithSuitability& other) const noexcept + { + return suitability < other.suitability; + } + + static unsigned uiIsSupported (const char* hostUri, const char* pluginUri) + { + if (strcmp (hostUri, pluginUri) == 0) + return 1; + + return 0; + } + }; + + std::vector uisWithSuitability; + uisWithSuitability.reserve (allUis.size()); + + std::transform (allUis.cbegin(), allUis.cend(), std::back_inserter (uisWithSuitability), [&] (const LilvUI* ui) + { + const LilvNode* type = nullptr; + return UiWithSuitability { ui, lilv_ui_is_supported (ui, UiWithSuitability::uiIsSupported, nativeUiUri.get(), &type) }; + }); + + std::sort (uisWithSuitability.begin(), uisWithSuitability.end()); + + if (uisWithSuitability.back().suitability != 0) + return uisWithSuitability.back().ui; + + return nullptr; + } + + const LilvUI* findEmbeddableUi (const lv2_host::Uis*, std::false_type) + { + return nullptr; + } + + const LilvUI* findEmbeddableUi (const lv2_host::Uis* pluginUis) + { + return findEmbeddableUi (pluginUis, std::integral_constant{}); + } + + static lv2_host::UiDescriptor getUiDescriptor (const LilvUI* ui) + { + if (ui == nullptr) + return {}; + + const auto libraryFile = StringPtr { lilv_file_uri_parse (lilv_node_as_uri (lilv_ui_get_binary_uri (ui)), nullptr) }; + + return lv2_host::UiDescriptor { lv2_host::UiDescriptorArgs{}.withLibraryPath (libraryFile.get()) + .withUiUri (lilv_node_as_uri (lilv_ui_get_uri (ui))) }; + } + + // Returns the name of a missing feature, if any. + template + static std::vector findMissingFeatures (RequiredFeatures&& required, + AvailableFeatures&& available) + { + std::vector result; + + for (const auto* node : required) + { + const auto nodeString = String::fromUTF8 (lilv_node_as_uri (node)); + + if (std::find (std::begin (available), std::end (available), nodeString) == std::end (available)) + result.push_back (nodeString); + } + + return result; + } + + void createPluginInstance (const PluginDescription& desc, + double initialSampleRate, + int initialBufferSize, + PluginCreationCallback callback) + { + const auto* pluginPtr = findPluginByUri (desc.fileOrIdentifier); + + if (pluginPtr == nullptr) + return callback (nullptr, "Unable to locate plugin with the requested URI"); + + const lv2_host::Plugin plugin { pluginPtr }; + + auto symap = std::make_unique(); + + const auto missingFeatures = findMissingFeatures (plugin.getRequiredFeatures(), + lv2_host::FeaturesData::getFeatureUris()); + + if (! missingFeatures.empty()) + { + const auto missingFeaturesString = StringArray (missingFeatures.data(), (int) missingFeatures.size()).joinIntoString (", "); + + return callback (nullptr, "plugin requires missing features: " + missingFeaturesString); + } + + auto stateToApply = [&] + { + if (! plugin.hasFeature (world->newUri (LV2_STATE__loadDefaultState))) + return lv2_host::PluginState{}; + + auto map = symap->getMapFeature(); + return lv2_host::PluginState { lilv_state_new_from_world (world->get(), &map, plugin.getUri().get()) }; + }(); + + auto ports = lv2_host::Ports::getPorts (*world, uris, plugin, *symap); + + if (! ports.hasValue()) + return callback (nullptr, "Plugin has ports of an unsupported type"); + + auto instance = std::make_unique (*world, + std::move (symap), + plugin, + std::move (*ports), + (int32_t) initialBufferSize, + initialSampleRate); + + if (instance->instance == nullptr) + return callback (nullptr, "Plugin was located, but could not be opened"); + + auto potentialPresets = world->findNodes (nullptr, + world->newUri (LV2_CORE__appliesTo).get(), + plugin.getUri().get()); + + const lv2_host::Uis pluginUis { plugin.get() }; + + const auto uiToUse = [&]() -> const LilvUI* + { + const auto bestMatch = findEmbeddableUi (&pluginUis); + + if (bestMatch == nullptr) + return bestMatch; + + const auto uiUri = lilv_ui_get_uri (bestMatch); + lilv_world_load_resource (world->get(), uiUri); + + const auto queryUi = [&] (const char* featureUri) + { + const auto featureUriNode = world->newUri (featureUri); + return world->findNodes (uiUri, featureUriNode.get(), nullptr); + }; + + const auto missingUiFeatures = findMissingFeatures (queryUi (LV2_CORE__requiredFeature), + lv2_host::UiFeaturesData::getFeatureUris()); + + return missingUiFeatures.empty() ? bestMatch : nullptr; + }(); + + auto uiBundleUri = uiToUse != nullptr ? String::fromUTF8 (lilv_node_as_uri (lilv_ui_get_bundle_uri (uiToUse))) + : String(); + + auto wrapped = std::make_unique (world, + plugin, + uris, + std::move (instance), + getDescription (pluginPtr), + findPresetUrisForPlugin (plugin.get()), + std::move (stateToApply), + std::move (uiBundleUri), + getUiDescriptor (uiToUse)); + callback (std::move (wrapped), {}); + } + +private: + struct Free { void operator() (char* ptr) const noexcept { free (ptr); } }; + using StringPtr = std::unique_ptr; + + const LilvPlugin* findPluginByUri (const String& s) + { + return world->getAllPlugins().getByUri (world->newUri (s.toRawUTF8())); + } + + template + void visitParentClasses (const LilvPluginClass* c, Fn&& fn) const + { + if (c == nullptr) + return; + + const lv2_host::PluginClass wrapped { c }; + fn (wrapped); + + const auto parentUri = wrapped.getParentUri(); + + if (parentUri.get() != nullptr) + visitParentClasses (world->getPluginClasses().getByUri (parentUri), fn); + } + + std::vector collectPluginClassUris (const LilvPluginClass* c) const + { + std::vector results; + + visitParentClasses (c, [&results] (const lv2_host::PluginClass& wrapped) + { + results.emplace_back (wrapped.getUri()); + }); + + return results; + } + + PluginDescription getDescription (const LilvPlugin* plugin) + { + if (plugin == nullptr) + return {}; + + const auto wrapped = lv2_host::Plugin { plugin }; + const auto bundle = wrapped.getBundleUri().getTyped(); + const auto bundleFile = File { StringPtr { lilv_file_uri_parse (bundle, nullptr) }.get() }; + + const auto numInputs = wrapped.getNumPortsOfClass (uris.mLV2_CORE__AudioPort, uris.mLV2_CORE__InputPort); + const auto numOutputs = wrapped.getNumPortsOfClass (uris.mLV2_CORE__AudioPort, uris.mLV2_CORE__OutputPort); + + PluginDescription result; + result.name = wrapped.getName().getTyped(); + result.descriptiveName = wrapped.getName().getTyped(); + result.lastFileModTime = bundleFile.getLastModificationTime(); + result.lastInfoUpdateTime = Time::getCurrentTime(); + result.manufacturerName = wrapped.getAuthorName().getTyped(); + result.pluginFormatName = LV2PluginFormat::getFormatName(); + result.numInputChannels = static_cast (numInputs); + result.numOutputChannels = static_cast (numOutputs); + + const auto classPtr = wrapped.getClass(); + const auto classes = collectPluginClassUris (classPtr); + const auto isInstrument = std::any_of (classes.cbegin(), + classes.cend(), + [this] (const lv2_host::NodeUri& uri) + { + return uri.equals (uris.mLV2_CORE__GeneratorPlugin); + }); + + result.category = lv2_host::PluginClass { classPtr }.getLabel().getTyped(); + result.isInstrument = isInstrument; + + // The plugin URI is required to be globally unique, so a hash of it should be too + result.fileOrIdentifier = wrapped.getUri().getTyped(); + + const auto uid = DefaultHashFunctions::generateHash (result.fileOrIdentifier, std::numeric_limits::max());; + result.deprecatedUid = result.uniqueId = uid; + return result; + } + + std::vector findPresetUrisForPlugin (const LilvPlugin* plugin) + { + std::vector presetUris; + + lv2_host::OwningNodes potentialPresets { lilv_plugin_get_related (plugin, world->newUri (LV2_PRESETS__Preset).get()) }; + + for (const auto* potentialPreset : potentialPresets) + presetUris.push_back (lilv_node_as_string (potentialPreset)); + + return presetUris; + } + + TemporaryFile lv2ResourceFolder; + std::shared_ptr world = std::make_shared(); + lv2_host::UsefulUris uris { world->get() }; +}; + +//============================================================================== +LV2PluginFormat::LV2PluginFormat() + : pimpl (std::make_unique()) {} + +LV2PluginFormat::~LV2PluginFormat() = default; + +void LV2PluginFormat::findAllTypesForFile (OwnedArray& results, + const String& fileOrIdentifier) +{ + pimpl->findAllTypesForFile (results, fileOrIdentifier); +} + +bool LV2PluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) +{ + return pimpl->fileMightContainThisPluginType (fileOrIdentifier); +} + +String LV2PluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier) +{ + return pimpl->getNameOfPluginFromIdentifier (fileOrIdentifier); +} + +bool LV2PluginFormat::pluginNeedsRescanning (const PluginDescription& desc) +{ + return pimpl->pluginNeedsRescanning (desc); +} + +bool LV2PluginFormat::doesPluginStillExist (const PluginDescription& desc) +{ + return pimpl->doesPluginStillExist (desc); +} + +bool LV2PluginFormat::canScanForPlugins() const { return true; } +bool LV2PluginFormat::isTrivialToScan() const { return true; } + +StringArray LV2PluginFormat::searchPathsForPlugins (const FileSearchPath& directoriesToSearch, + bool recursive, + bool allowAsync) +{ + return pimpl->searchPathsForPlugins (directoriesToSearch, recursive, allowAsync); +} + +FileSearchPath LV2PluginFormat::getDefaultLocationsToSearch() +{ + return pimpl->getDefaultLocationsToSearch(); +} + +bool LV2PluginFormat::requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const +{ + return false; +} + +void LV2PluginFormat::createPluginInstance (const PluginDescription& desc, + double sampleRate, + int bufferSize, + PluginCreationCallback callback) +{ + pimpl->createPluginInstance (desc, sampleRate, bufferSize, std::move (callback)); +} + +} // namespace juce + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,78 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +namespace juce +{ + +#if JUCE_PLUGINHOST_LV2 || DOXYGEN + +/** + Implements a plugin format for LV2 plugins. + + @tags{Audio} +*/ +class JUCE_API LV2PluginFormat : public AudioPluginFormat +{ +public: + LV2PluginFormat(); + ~LV2PluginFormat() override; + + static String getFormatName() { return "LV2"; } + String getName() const override { return getFormatName(); } + + void findAllTypesForFile (OwnedArray& results, + const String& fileOrIdentifier) override; + + bool fileMightContainThisPluginType (const String& fileOrIdentifier) override; + + String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override; + + bool pluginNeedsRescanning (const PluginDescription&) override; + + bool doesPluginStillExist (const PluginDescription&) override; + + bool canScanForPlugins() const override; + + bool isTrivialToScan() const override; + + StringArray searchPathsForPlugins (const FileSearchPath& directoriesToSearch, + bool recursive, + bool allowPluginsWhichRequireAsynchronousInstantiation = false) override; + + FileSearchPath getDefaultLocationsToSearch() override; + +private: + bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const override; + void createPluginInstance (const PluginDescription&, double, int, PluginCreationCallback) override; + + class Pimpl; + std::unique_ptr pimpl; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LV2PluginFormat) +}; + +#endif + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,272 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "juce_LV2Common.h" + +namespace juce +{ + +class LV2PluginFormatTests : public UnitTest +{ +public: + LV2PluginFormatTests() + : UnitTest ("LV2 Hosting", UnitTestCategories::audioProcessors) + { + } + + void runTest() override + { + using namespace lv2_shared; + + beginTest ("ChannelMapping for well-ordered stereo buses does no mapping"); + { + const AudioProcessor::BusesLayout host { { AudioChannelSet::stereo() }, { AudioChannelSet::stereo() } }; + const ParsedBuses client { { ParsedGroup { "a", { SinglePortInfo { 0, AudioChannelSet::left, false }, + SinglePortInfo { 1, AudioChannelSet::right, false } } } }, + { ParsedGroup { "b", { SinglePortInfo { 2, AudioChannelSet::left, false }, + SinglePortInfo { 3, AudioChannelSet::right, false } } } } }; + const PortToAudioBufferMap map { host, client }; + + expect (map.getChannelForPort (0) == 0); + expect (map.getChannelForPort (1) == 1); + + expect (map.getChannelForPort (2) == 0); + expect (map.getChannelForPort (3) == 1); + + expect (map.getChannelForPort (4) == -1); + } + + beginTest ("ChannelMapping for layout with backwards ports is converted to JUCE order"); + { + const AudioProcessor::BusesLayout host { { AudioChannelSet::stereo() }, { AudioChannelSet::stereo() } }; + const ParsedBuses client { { ParsedGroup { "a", { SinglePortInfo { 0, AudioChannelSet::right, false }, + SinglePortInfo { 1, AudioChannelSet::left, false } } } }, + { ParsedGroup { "b", { SinglePortInfo { 2, AudioChannelSet::right, false }, + SinglePortInfo { 3, AudioChannelSet::left, false } } } } }; + const PortToAudioBufferMap map { host, client }; + + expect (map.getChannelForPort (0) == 1); + expect (map.getChannelForPort (1) == 0); + + expect (map.getChannelForPort (2) == 1); + expect (map.getChannelForPort (3) == 0); + + expect (map.getChannelForPort (4) == -1); + } + + beginTest ("ChannelMapping for layout with multiple buses works as expected"); + { + const AudioProcessor::BusesLayout host { { AudioChannelSet::create5point1(), AudioChannelSet::mono() }, + { AudioChannelSet::mono(), AudioChannelSet::createLCRS(), AudioChannelSet::stereo() } }; + const ParsedBuses client { { ParsedGroup { "a", { SinglePortInfo { 0, AudioChannelSet::right, false }, + SinglePortInfo { 1, AudioChannelSet::left, false }, + SinglePortInfo { 2, AudioChannelSet::LFE, false }, + SinglePortInfo { 3, AudioChannelSet::centre, false }, + SinglePortInfo { 4, AudioChannelSet::rightSurround, false }, + SinglePortInfo { 5, AudioChannelSet::leftSurround, false } } }, + ParsedGroup { "b", { SinglePortInfo { 6, AudioChannelSet::centre, false } } } }, + { ParsedGroup { "c", { SinglePortInfo { 7, AudioChannelSet::centre, false } } }, + ParsedGroup { "d", { SinglePortInfo { 8, AudioChannelSet::surround, false }, + SinglePortInfo { 9, AudioChannelSet::centre, false }, + SinglePortInfo { 10, AudioChannelSet::right, false }, + SinglePortInfo { 11, AudioChannelSet::left, false } } }, + ParsedGroup { "e", { SinglePortInfo { 12, AudioChannelSet::left, false }, + SinglePortInfo { 13, AudioChannelSet::right, false } } } } }; + const PortToAudioBufferMap map { host, client }; + + expect (map.getChannelForPort ( 0) == 1); + expect (map.getChannelForPort ( 1) == 0); + expect (map.getChannelForPort ( 2) == 3); + expect (map.getChannelForPort ( 3) == 2); + expect (map.getChannelForPort ( 4) == 5); + expect (map.getChannelForPort ( 5) == 4); + expect (map.getChannelForPort ( 6) == 6); + + expect (map.getChannelForPort ( 7) == 0); + expect (map.getChannelForPort ( 8) == 4); + expect (map.getChannelForPort ( 9) == 3); + expect (map.getChannelForPort (10) == 2); + expect (map.getChannelForPort (11) == 1); + expect (map.getChannelForPort (12) == 5); + expect (map.getChannelForPort (13) == 6); + + expect (map.getChannelForPort (14) == -1); + } + + beginTest ("Optional client buses may correspond to a disabled host bus"); + { + const ParsedBuses client { { ParsedGroup { "a", { SinglePortInfo { 0, AudioChannelSet::right, true }, + SinglePortInfo { 1, AudioChannelSet::left, true }, + SinglePortInfo { 2, AudioChannelSet::LFE, true }, + SinglePortInfo { 3, AudioChannelSet::centre, true }, + SinglePortInfo { 4, AudioChannelSet::rightSurround, true }, + SinglePortInfo { 5, AudioChannelSet::leftSurround, true } } }, + ParsedGroup { "b", { SinglePortInfo { 6, AudioChannelSet::centre, true } } } }, + { ParsedGroup { "c", { SinglePortInfo { 7, AudioChannelSet::centre, true } } }, + ParsedGroup { "d", { SinglePortInfo { 8, AudioChannelSet::surround, true }, + SinglePortInfo { 9, AudioChannelSet::centre, true }, + SinglePortInfo { 10, AudioChannelSet::right, true }, + SinglePortInfo { 11, AudioChannelSet::left, true } } }, + ParsedGroup { "e", { SinglePortInfo { 12, AudioChannelSet::left, true }, + SinglePortInfo { 13, AudioChannelSet::right, true } } } } }; + + const PortToAudioBufferMap mapA { AudioProcessor::BusesLayout { { AudioChannelSet::disabled(), AudioChannelSet::mono() }, + { AudioChannelSet::mono(), AudioChannelSet::disabled(), AudioChannelSet::stereo() } }, + client }; + + expect (mapA.getChannelForPort ( 0) == -1); + expect (mapA.getChannelForPort ( 1) == -1); + expect (mapA.getChannelForPort ( 2) == -1); + expect (mapA.getChannelForPort ( 3) == -1); + expect (mapA.getChannelForPort ( 4) == -1); + expect (mapA.getChannelForPort ( 5) == -1); + expect (mapA.getChannelForPort ( 6) == 0); + + expect (mapA.getChannelForPort ( 7) == 0); + expect (mapA.getChannelForPort ( 8) == -1); + expect (mapA.getChannelForPort ( 9) == -1); + expect (mapA.getChannelForPort (10) == -1); + expect (mapA.getChannelForPort (11) == -1); + expect (mapA.getChannelForPort (12) == 1); + expect (mapA.getChannelForPort (13) == 2); + + expect (mapA.getChannelForPort (14) == -1); + + const PortToAudioBufferMap mapB { AudioProcessor::BusesLayout { { AudioChannelSet::create5point1(), AudioChannelSet::disabled() }, + { AudioChannelSet::disabled(), AudioChannelSet::disabled(), AudioChannelSet::stereo() } }, + client }; + + expect (mapB.getChannelForPort ( 0) == 1); + expect (mapB.getChannelForPort ( 1) == 0); + expect (mapB.getChannelForPort ( 2) == 3); + expect (mapB.getChannelForPort ( 3) == 2); + expect (mapB.getChannelForPort ( 4) == 5); + expect (mapB.getChannelForPort ( 5) == 4); + expect (mapB.getChannelForPort ( 6) == -1); + + expect (mapB.getChannelForPort ( 7) == -1); + expect (mapB.getChannelForPort ( 8) == -1); + expect (mapB.getChannelForPort ( 9) == -1); + expect (mapB.getChannelForPort (10) == -1); + expect (mapB.getChannelForPort (11) == -1); + expect (mapB.getChannelForPort (12) == 0); + expect (mapB.getChannelForPort (13) == 1); + + expect (mapB.getChannelForPort (14) == -1); + } + + beginTest ("A plugin with only grouped ports will have the same number of buses as groups"); + { + const auto parsed = findStableBusOrder ("foo", + { { "sidechain", { SinglePortInfo { 0, AudioChannelSet::left, false }, + SinglePortInfo { 1, AudioChannelSet::right, false } } }, + { "foo", { SinglePortInfo { 2, AudioChannelSet::centre, false } } } }, + {}); + expect (parsed.size() == 2); + + expect (parsed[0].uid == "foo"); // The main bus should always be first + expect (parsed[0].info.size() == 1); + + expect (parsed[1].uid == "sidechain"); + expect (parsed[1].info.size() == 2); + } + + beginTest ("A plugin with grouped and ungrouped ports will add a bus for each ungrouped port"); + { + const auto parsed = findStableBusOrder ("foo", + { { "sidechain", { SinglePortInfo { 0, AudioChannelSet::left, false }, + SinglePortInfo { 1, AudioChannelSet::right, false } } }, + { "foo", { SinglePortInfo { 2, AudioChannelSet::centre, false } } } }, + { SinglePortInfo { 3, AudioChannelSet::leftSurround, false }, + SinglePortInfo { 4, AudioChannelSet::centre, true }, + SinglePortInfo { 5, AudioChannelSet::rightSurround, false } }); + expect (parsed.size() == 5); + + expect (parsed[0].uid == "foo"); // The main bus should always be first + expect (parsed[0].info.size() == 1); + + expect (parsed[1].uid == "sidechain"); + expect (parsed[1].info.size() == 2); + + expect (parsed[2].uid == ""); + expect (parsed[2].info.size() == 1); + + expect (parsed[3].uid == ""); + expect (parsed[3].info.size() == 1); + + expect (parsed[4].uid == ""); + expect (parsed[4].info.size() == 1); + } + + beginTest ("A plugin with only ungrouped, required ports will have a single bus"); + { + const auto parsed = findStableBusOrder ("foo", + {}, + { SinglePortInfo { 0, AudioChannelSet::leftSurround, false }, + SinglePortInfo { 1, AudioChannelSet::rightSurround, false }, + SinglePortInfo { 2, AudioChannelSet::left, false }, + SinglePortInfo { 3, AudioChannelSet::right, false } }); + + expect (parsed == std::vector { { "", { SinglePortInfo { 0, AudioChannelSet::leftSurround, false }, + SinglePortInfo { 1, AudioChannelSet::rightSurround, false }, + SinglePortInfo { 2, AudioChannelSet::left, false }, + SinglePortInfo { 3, AudioChannelSet::right, false } } } }); + } + + beginTest ("A plugin with only ungrouped, optional ports will have a bus per port"); + { + const auto parsed = findStableBusOrder ("foo", + {}, + { SinglePortInfo { 0, AudioChannelSet::leftSurround, true }, + SinglePortInfo { 1, AudioChannelSet::rightSurround, true }, + SinglePortInfo { 2, AudioChannelSet::left, true }, + SinglePortInfo { 3, AudioChannelSet::right, true } }); + + expect (parsed == std::vector { { "", { SinglePortInfo { 0, AudioChannelSet::leftSurround, true } } }, + { "", { SinglePortInfo { 1, AudioChannelSet::rightSurround, true } } }, + { "", { SinglePortInfo { 2, AudioChannelSet::left, true } } }, + { "", { SinglePortInfo { 3, AudioChannelSet::right, true } } } }); + } + + beginTest ("A plugin with a mix of required and optional ports will have the required ports grouped together on a single bus"); + { + const auto parsed = findStableBusOrder ("foo", + {}, + { SinglePortInfo { 0, AudioChannelSet::leftSurround, true }, + SinglePortInfo { 1, AudioChannelSet::rightSurround, false }, + SinglePortInfo { 2, AudioChannelSet::left, true }, + SinglePortInfo { 3, AudioChannelSet::right, false } }); + + expect (parsed == std::vector { { "", { SinglePortInfo { 1, AudioChannelSet::rightSurround, false }, + SinglePortInfo { 3, AudioChannelSet::right, false } } }, + { "", { SinglePortInfo { 0, AudioChannelSet::leftSurround, true } } }, + { "", { SinglePortInfo { 2, AudioChannelSet::left, true } } } }); + } + } +}; + +static LV2PluginFormatTests lv2PluginFormatTests; + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LV2Resources.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LV2Resources.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LV2Resources.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LV2Resources.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,10235 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +/* + This file is auto-generated by generate_lv2_bundle_sources.py. +*/ + +#pragma once + +#ifndef DOXYGEN + +#include + +namespace juce +{ +namespace lv2 +{ + +struct BundleResource +{ + const char* name; + const char* contents; +}; + +struct Bundle +{ + const char* name; + std::vector contents; + + static std::vector getAllBundles(); +}; + +} +} + +std::vector juce::lv2::Bundle::getAllBundles() +{ + return { +juce::lv2::Bundle +{ +"instance-access", +{ +juce::lv2::BundleResource +{ +"instance-access.ttl", +R"lv2ttl(@prefix ia: . +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Feature ; + rdfs:label "instance access" ; + rdfs:comment "A feature that provides access to a plugin instance." ; + rdfs:seeAlso , + . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"instance-access.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix ia: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Instance Access" ; + doap:shortdesc "Provides access to the LV2_Handle of a plugin." ; + doap:created "2010-10-04" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature which allows plugin UIs to get a direct handle +to an LV2 plugin instance (LV2_Handle), if possible. + +Note that the use of this extension by UIs violates the important principle of +UI/plugin separation, and is potentially a source of many problems. +Accordingly, **use of this extension is highly discouraged**, and plugins +should not expect hosts to support it, since it is often impossible to do so. + +To support this feature the host must pass an LV2_Feature struct to the UI +instantiate method with URI LV2_INSTANCE_ACCESS_URI and data pointed directly +to the LV2_Handle of the plugin instance. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"port-groups", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"port-groups.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix pg: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Port Groups" ; + rdfs:comment "Multi-channel groups of LV2 ports." ; + rdfs:seeAlso . + +pg:Group + a rdfs:Class ; + rdfs:label "Port Group" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:symbol ; + owl:cardinality 1 ; + rdfs:comment "A Group MUST have exactly one string lv2:symbol." + ] ; + rdfs:comment "A set of ports that are logicaly grouped together." . + +pg:InputGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Input Group" ; + rdfs:comment "A group which contains exclusively inputs." . + +pg:OutputGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Output Group" ; + rdfs:comment "A group which contains exclusively outputs." . + +pg:Element + a rdfs:Class ; + rdfs:label "Element" ; + rdfs:comment "An ordered element of a group." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:designation ; + owl:cardinality 1 ; + rdfs:comment "An element MUST have exactly one lv2:designation." + ] ; + rdfs:comment "An element of a group, with a designation and optional index." . + +pg:element + a rdf:Property , + owl:ObjectProperty ; + rdfs:range pg:Element ; + rdfs:label "element" ; + rdfs:comment "An element within a port group." . + +pg:sideChainOf + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "side-chain of" ; + rdfs:comment "Port or group is a side chain of another." . + +pg:subGroupOf + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain pg:Group ; + rdfs:range pg:Group ; + rdfs:label "sub-group of" ; + rdfs:comment "Group is a child of another group." . + +pg:source + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain pg:OutputGroup ; + rdfs:range pg:InputGroup ; + rdfs:label "source" ; + rdfs:comment "Port or group that this group is the output of." . + +pg:mainInput + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Plugin ; + rdfs:range pg:InputGroup ; + rdfs:label "main input" ; + rdfs:comment "Input group that is the primary input of the plugin." . + +pg:mainOutput + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Plugin ; + rdfs:range pg:OutputGroup ; + rdfs:label "main output" ; + rdfs:comment "Output group that is the primary output of the plugin." . + +pg:group + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Port ; + rdfs:range pg:Group ; + rdfs:label "group" ; + rdfs:comment "Group that this port is a part of." . + +pg:DiscreteGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Discrete Group" ; + rdfs:comment "A group of discrete channels." . + +pg:left + a lv2:Channel ; + rdfs:label "left" ; + rdfs:comment "The left channel of a stereo audio group." . + +pg:right + a lv2:Channel ; + rdfs:label "right" ; + rdfs:comment "The right channel of a stereo audio group." . + +pg:center + a lv2:Channel ; + rdfs:label "center" ; + rdfs:comment "The center channel of a discrete audio group." . + +pg:side + a lv2:Channel ; + rdfs:label "side" ; + rdfs:comment "The side channel of a mid-side audio group." . + +pg:centerLeft + a lv2:Channel ; + rdfs:label "center left" ; + rdfs:comment "The center-left channel of a 7.1 wide surround sound group." . + +pg:centerRight + a lv2:Channel ; + rdfs:label "center right" ; + rdfs:comment "The center-right channel of a 7.1 wide surround sound group." . + +pg:sideLeft + a lv2:Channel ; + rdfs:label "side left" ; + rdfs:comment "The side-left channel of a 6.1 or 7.1 surround sound group." . + +pg:sideRight + a lv2:Channel ; + rdfs:label "side right" ; + rdfs:comment "The side-right channel of a 6.1 or 7.1 surround sound group." . + +pg:rearLeft + a lv2:Channel ; + rdfs:label "rear left" ; + rdfs:comment "The rear-left channel of a surround sound group." . + +pg:rearRight + a lv2:Channel ; + rdfs:label "rear right" ; + rdfs:comment "The rear-right channel of a surround sound group." . + +pg:rearCenter + a lv2:Channel ; + rdfs:label "rear center" ; + rdfs:comment "The rear-center channel of a surround sound group." . + +pg:lowFrequencyEffects + a lv2:Channel ; + rdfs:label "low-frequency effects" ; + rdfs:comment "The LFE channel of a *.1 surround sound group." . + +pg:MonoGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Mono" ; + rdfs:comment "A single channel audio group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:center + ] . + +pg:StereoGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Stereo" ; + rdfs:comment "A 2-channel discrete stereo audio group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:right + ] . + +pg:MidSideGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Mid-Side Stereo" ; + rdfs:comment "A 2-channel mid-side stereo audio group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:center + ] , [ + lv2:index 1 ; + lv2:designation pg:side + ] . + +pg:ThreePointZeroGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "3.0 Surround" ; + rdfs:comment "A 3.0 discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:right + ] , [ + lv2:index 2 ; + lv2:designation pg:rearCenter + ] . + +pg:FourPointZeroGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "4.0 Surround" ; + rdfs:comment "A 4.0 (Quadraphonic) discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:rearCenter + ] . + +pg:FivePointZeroGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "5.0 Surround" ; + rdfs:comment "A 5.0 (3-2 stereo) discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:rearRight + ] . + +pg:FivePointOneGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "5.1 Surround" ; + rdfs:comment "A 5.1 (3-2 stereo with sub) discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:rearRight + ] , [ + lv2:index 5 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:SixPointOneGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "6.1 Surround" ; + rdfs:comment "A 6.1 discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:sideLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:sideRight + ] , [ + lv2:index 5 ; + lv2:designation pg:rearCenter + ] , [ + lv2:index 6 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:SevenPointOneGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "7.1 Surround" ; + rdfs:comment "A 7.1 discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:sideLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:sideRight + ] , [ + lv2:index 5 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 6 ; + lv2:designation pg:rearRight + ] , [ + lv2:index 7 ; + lv2:designation pg:lowFreq)lv2ttl" R"lv2ttl(uencyEffects + ] . + +pg:SevenPointOneWideGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "7.1 Surround (Wide)" ; + rdfs:comment "A 7.1 wide discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:centerLeft + ] , [ + lv2:index 2 ; + lv2:designation pg:center + ] , [ + lv2:index 3 ; + lv2:designation pg:centerRight + ] , [ + lv2:index 4 ; + lv2:designation pg:right + ] , [ + lv2:index 5 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 6 ; + lv2:designation pg:rearRight + ] , [ + lv2:index 7 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:letterCode + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Channel ; + rdfs:range rdf:PlainLiteral ; + rdfs:label "ambisonic letter code" ; + rdfs:comment "The YuMa letter code for an Ambisonic channel." . + +pg:harmonicDegree + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Channel ; + rdfs:range xsd:integer ; + rdfs:label "harmonic degree" ; + rdfs:comment "The degree coefficient (l) of the spherical harmonic for an Ambisonic channel." . + +pg:harmonicIndex + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Channel ; + rdfs:range xsd:integer ; + rdfs:label "harmonic index" ; + rdfs:comment "The index coefficient (m) of the spherical harmonic for an Ambisonic channel." . + +pg:ACN0 + a lv2:Channel ; + pg:letterCode "W" ; + pg:harmonicDegree 0 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN0" ; + rdfs:comment "Ambisonic channel 0 (W): degree 0, index 0." . + +pg:ACN1 + a lv2:Channel ; + pg:letterCode "Y" ; + pg:harmonicDegree 1 ; + pg:harmonicIndex -1 ; + rdfs:label "ACN1" ; + rdfs:comment "Ambisonic channel 1 (Y): degree 1, index -1." . + +pg:ACN2 + a lv2:Channel ; + pg:letterCode "Z" ; + pg:harmonicDegree 1 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN2" ; + rdfs:comment "Ambisonic channel 2 (Z): degree 1, index 0." . + +pg:ACN3 + a lv2:Channel ; + pg:letterCode "X" ; + pg:harmonicDegree 1 ; + pg:harmonicIndex 1 ; + rdfs:label "ACN3" ; + rdfs:comment "Ambisonic channel 3 (X): degree 1, index 1." . + +pg:ACN4 + a lv2:Channel ; + pg:letterCode "V" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex -2 ; + rdfs:label "ACN4" ; + rdfs:comment "Ambisonic channel 4 (V): degree 2, index -2." . + +pg:ACN5 + a lv2:Channel ; + pg:letterCode "T" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex -1 ; + rdfs:label "ACN5" ; + rdfs:comment "Ambisonic channel 5 (T): degree 2, index -1." . + +pg:ACN6 + a lv2:Channel ; + pg:letterCode "R" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN6" ; + rdfs:comment "Ambisonic channel 6 (R): degree 2, index 0." . + +pg:ACN7 + a lv2:Channel ; + pg:letterCode "S" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex 1 ; + rdfs:label "ACN7" ; + rdfs:comment "Ambisonic channel 7 (S): degree 2, index 1." . + +pg:ACN8 + a lv2:Channel ; + pg:letterCode "U" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex 2 ; + rdfs:label "ACN8" ; + rdfs:comment "Ambisonic channel 8 (U): degree 2, index 2." . + +pg:ACN9 + a lv2:Channel ; + pg:letterCode "Q" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex -3 ; + rdfs:label "ACN9" ; + rdfs:comment "Ambisonic channel 9 (Q): degree 3, index -3." . + +pg:ACN10 + a lv2:Channel ; + pg:letterCode "O" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex -2 ; + rdfs:label "ACN10" ; + rdfs:comment "Ambisonic channel 10 (O): degree 3, index -2." . + +pg:ACN11 + a lv2:Channel ; + pg:letterCode "M" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex -1 ; + rdfs:label "ACN11" ; + rdfs:comment "Ambisonic channel 11 (M): degree 3, index -1." . + +pg:ACN12 + a lv2:Channel ; + pg:letterCode "K" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN12" ; + rdfs:comment "Ambisonic channel 12 (K): degree 3, index 0." . + +pg:ACN13 + a lv2:Channel ; + pg:letterCode "L" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 1 ; + rdfs:label "ACN13" ; + rdfs:comment "Ambisonic channel 13 (L): degree 3, index 1." . + +pg:ACN14 + a lv2:Channel ; + pg:letterCode "N" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 2 ; + rdfs:label "ACN14" ; + rdfs:comment "Ambisonic channel 14 (N): degree 3, index 2." . + +pg:ACN15 + a lv2:Channel ; + pg:letterCode "P" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 3 ; + rdfs:label "ACN15" ; + rdfs:comment "Ambisonic channel 15 (P): degree 3, index 3." . + +pg:AmbisonicGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Ambisonic Group" ; + rdfs:comment "A group of Ambisonic channels." . + +pg:AmbisonicBH1P0Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH1P0" ; + rdfs:comment "Ambisonic B stream of horizontal order 1 and peripheral order 0." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN3 + ] . + +pg:AmbisonicBH1P1Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH1P1" ; + rdfs:comment "Ambisonic B stream of horizontal order 1 and peripheral order 1." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] . + +pg:AmbisonicBH2P0Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH2P0" ; + rdfs:comment "Ambisonic B stream of horizontal order 2 and peripheral order 0." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN8 + ] . + +pg:AmbisonicBH2P1Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH2P1" ; + rdfs:comment "Ambisonic B stream of horizontal order 2 and peripheral order 1." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN8 + ] . + +pg:AmbisonicBH2P2Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH2P2" ; + rdfs:comment "Ambisonic B stream of horizontal order 2 and peripheral order 2." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN5 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN6 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN7 + ] , [ + lv2:index 8 ; + lv2:designation pg:ACN8 + ] . + +pg:AmbisonicBH3P0Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P0" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 0." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN15 + ] . + +pg:AmbisonicBH3P1Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P1" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 1." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN15 + ] . + +pg:AmbisonicBH3P2Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P2" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 2." ; + pg:e)lv2ttl" R"lv2ttl(lement [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN5 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN6 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN7 + ] , [ + lv2:index 8 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 9 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 10 ; + lv2:designation pg:ACN15 + ] . + +pg:AmbisonicBH3P3Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P3" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 3." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN5 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN6 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN7 + ] , [ + lv2:index 8 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 9 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 10 ; + lv2:designation pg:ACN10 + ] , [ + lv2:index 11 ; + lv2:designation pg:ACN11 + ] , [ + lv2:index 12 ; + lv2:designation pg:ACN12 + ] , [ + lv2:index 13 ; + lv2:designation pg:ACN13 + ] , [ + lv2:index 14 ; + lv2:designation pg:ACN14 + ] , [ + lv2:index 15 ; + lv2:designation pg:ACN15 + ] . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"port-groups.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pg: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Port Groups" ; + doap:shortdesc "Multi-channel groups of LV2 ports." ; + doap:created "2008-00-00" ; + doap:developer , + ; + doap:release [ + doap:revision "1.4" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Replace broken links with detailed Ambisonic channel descriptions." + ] , [ + rdfs:label "Remove incorrect type of pg:letterCode." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] . + +pg:Group + lv2:documentation """ + +A group logically combines ports which should be considered part of the same +stream. For example, two audio ports in a group may form a stereo stream. + +Like ports, groups have a lv2:symbol that is unique within the context of the +plugin, where group symbols and port symbols reside in the same namespace. In +other words, a group on a plugin MUST NOT have the same symbol as any other +group or port on that plugin. This makes it possible to uniquely reference a +port or group on a plugin with a single identifier and no context. + +Group definitions may be shared across plugins for brevity. For example, a +plugin collection may define a single URI for a pg:StereoGroup with the symbol +"input" and use it in many plugins. + +"""^^lv2:Markdown . + +pg:sideChainOf + lv2:documentation """ + +Indicates that this port or group should be considered a "side chain" of some +other port or group. The precise definition of "side chain" depends on the +plugin, but in general this group should be considered a modifier to some other +group, rather than an independent input itself. + +"""^^lv2:Markdown . + +pg:subGroupOf + lv2:documentation """ + +Indicates that this group is a child of another group. This property has no +meaning with respect to plugin execution, but the host may find this +information useful to provide a better user interface. Note that being a +sub-group does not relax the restriction that the group MUST have a unique +symbol with respect to the plugin. + +"""^^lv2:Markdown . + +pg:source + lv2:documentation """ + +Indicates that this port or group should be considered the "result" of some +other port or group. This property only makes sense on groups with outputs +when the source is a group with inputs. This can be used to convey a +relationship between corresponding input and output groups with different +types, for example in a mono to stereo plugin. + +"""^^lv2:Markdown . + +pg:mainInput + lv2:documentation """ + +Indicates that this group should be considered the "main" input, i.e. the +primary task is processing the signal in this group. A plugin MUST NOT have +more than one pg:mainInput property. + +"""^^lv2:Markdown . + +pg:mainOutput + lv2:documentation """ + +Indicates that this group should be considered the "main" output. The main +output group SHOULD have the main input group as a pg:source. + +"""^^lv2:Markdown . + +pg:group + lv2:documentation """ + +Indicates that this port is a part of a group of ports on the plugin. The port +should also have an lv2:designation property to define its designation within +that group. + +"""^^lv2:Markdown . + +pg:DiscreteGroup + lv2:documentation """ + +These groups are divided into channels where each represents a particular +speaker location. The position of sound in one of these groups depends on a +particular speaker configuration. + +"""^^lv2:Markdown . + +pg:AmbisonicGroup + lv2:documentation """ + +These groups are divided into channels which together represent a position in +an abstract n-dimensional space. The position of sound in one of these groups +does not depend on a particular speaker configuration; a decoder can be used to +convert an ambisonic stream for any speaker configuration. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"ui", +{ +juce::lv2::BundleResource +{ +"ui.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 UI" ; + doap:shortdesc "User interfaces for LV2 plugins." ; + doap:created "2006-00-00" ; + doap:developer ; + doap:maintainer ; + doap:release [ + doap:revision "2.22" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add ui:requestValue feature." + ] , [ + rdfs:label "Add ui:scaleFactor, ui:foregroundColor, and ui:backgroundColor properties." + ] , [ + rdfs:label "Deprecate ui:binary." + ] + ] + ] , [ + doap:revision "2.20" ; + doap:created "2015-07-25" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] , [ + rdfs:label "Add missing property labels." + ] + ] + ] , [ + doap:revision "2.18" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add show interface so UIs can gracefully degrade to separate windows if hosts can not use their widget directly." + ] , [ + rdfs:label "Fix identifier typos in documentation." + ] + ] + ] , [ + doap:revision "2.16" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix LV2_UI_INVALID_PORT_INDEX identifier in documentation." + ] + ] + ] , [ + doap:revision "2.14" ; + doap:created "2013-03-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add idle interface so native UIs and foreign toolkits can drive their event loops." + ] , [ + rdfs:label "Add ui:updateRate property." + ] + ] + ] , [ + doap:revision "2.12" ; + doap:created "2012-12-01" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect linker flag in ui:makeSONameResident documentation." + ] + ] + ] , [ + doap:revision "2.10" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add types for WindowsUI, CocoaUI, and Gtk3UI." + ] , [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add missing LV2_SYMBOL_EXPORT declaration for lv2ui_descriptor prototype." + ] + ] + ] , [ + doap:revision "2.8" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add ui:parent and ui:resize." + ] , [ + rdfs:label "Add support for referring to ports by symbol." + ] , [ + rdfs:label "Add ui:portMap for accessing ports by symbol, allowing for UIs to be distributed separately from plugins." + ] , [ + rdfs:label "Add port protocols and a dynamic notification subscription mechanism, for more flexible communication, and audio port metering without control port kludges." + ] , [ + rdfs:label "Add touch feature to notify the host that the user has grabbed a control." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Deprecate ui:makeSONameResident." + ] , [ + rdfs:label "Add Qt4 and X11 widget types." + ] , [ + rdfs:label "Install header to URI-based system path." + ] , [ + rdfs:label "Add pkg-config file." + ] , [ + rdfs:label "Make ui.ttl a valid OWL 2 DL ontology." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] , [ + rdfs:label "Use lv2:Specification to be discovered as an extension." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2010-10-06" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension makes it possible to create user interfaces for LV2 plugins. + +UIs are implemented as an LV2UI_Descriptor loaded via lv2ui_descriptor() in a +shared library, and are distributed in bundles just like plugins. + +UIs are associated with plugins in data: + + :::turtle + @prefix ui: . + + ui:ui . + a ui:X11UI ; + lv2:binary . + +where `http://my.plugin` is the URI of the plugin, `http://my.pluginui` is the +URI of the plugin UI and `myui.so` is the relative URI to the shared object +file. + +While it is possible to have the plugin UI and the plugin in the same shared +object file, it is a good idea to keep them separate so that hosts can avoid +loading the UI code if they do not need it. A UI MUST specify its class in the +RDF data (`ui:X11UI` in the above example). The class defines what type the UI +is, for example what graphics toolkit it uses. Any type of UI class can be +defined separately from this extension. + +It is possible to have multiple UIs for the same plugin, or to have the UI for +a plugin in a different bundle from the actual plugin. This allows plugin UIs +to be written independently. + +Note that the process that loads the shared object file containing the UI code +and the process that loads the shared object file containing the actual plugin +implementation are not necessarily the same process (and not even necessarily +on the same machine). This means that plugin and UI code MUST NOT use +singletons and global variables and expect them to refer to the same objects in +the UI and the actual plugin. The function callback interface defined in this +header is the only method of communication between UIs and plugin instances +(extensions may define more, though this is discouraged unless absolutely +necessary since the significant benefits of network transparency and +serialisability are lost). + +UI functionality may be extended via features, much like plugins: + + :::turtle + lv2:requiredFeature . + lv2:optionalFeature . + +The rules for a UI with a required or optional feature are identical to those +of lv2:Plugin instances: if a UI declares a feature as required, the host is +NOT allowed to load it unless it supports that feature; and if it does support +a feature, it MUST pass an appropriate LV2_Feature struct to the UI's +instantiate() method. This extension defines several standard features for +common functionality. + +UIs written to this specification do not need to be thread-safe. All functions +may only be called in the UI thread. There is only one UI thread (for +too)lv2ttl" R"lv2ttl(lkits, the one the UI main loop runs in). There is no requirement that a +UI actually be a graphical widget. + +Note that UIs are completely separate from plugins. From the plugin's +perspective, control from a UI is indistinguishable from any other control, as +it all occcurs via ports. + +"""^^lv2:Markdown . + +ui:GtkUI + lv2:documentation """ + +The host must guarantee that the Gtk+ 2 library has been initialised and the +Glib main loop is running before the UI is instantiated. Note that this UI +type is not suitable for binary distribution since multiple versions of Gtk can +not be used in the same process. + +"""^^lv2:Markdown . + +ui:Gtk3UI + lv2:documentation """ + +The host must guarantee that the Gtk+ 3 library has been initialised and the +Glib main loop is running before the UI is instantiated. Note that this UI +type is not suitable for binary distribution since multiple versions of Gtk can +not be used in the same process. + +"""^^lv2:Markdown . + +ui:Qt4UI + lv2:documentation """ + +The host must guarantee that the Qt4 library has been initialised and the Qt4 +main loop is running before the UI is instantiated. Note that this UI type is +not suitable for binary distribution since multiple versions of Qt can not be +used in the same process. + +"""^^lv2:Markdown . + +ui:Qt5UI + lv2:documentation """ + +The host must guarantee that the Qt5 library has been initialised and the Qt5 +main loop is running before the UI is instantiated. Note that this UI type is +not suitable for binary distribution since multiple versions of Qt can not be +used in the same process. + +"""^^lv2:Markdown . + +ui:X11UI + lv2:documentation """ + +Note that the LV2UI_Widget for this type of UI is not a pointer, but should be +interpreted directly as an X11 `Window` ID. This is the native UI type on most +POSIX systems. + +"""^^lv2:Markdown . + +ui:WindowsUI + lv2:documentation """ + +Note that the LV2UI_Widget for this type of UI is not a pointer, but should be +interpreted directly as a `HWND`. This is the native UI type on Microsoft +Windows. + +"""^^lv2:Markdown . + +ui:CocoaUI + lv2:documentation """ + +This is the native UI type on Mac OS X. + +"""^^lv2:Markdown . + +ui:binary + lv2:documentation """ + +This property is redundant and deprecated: new UIs should use lv2:binary +instead, however hosts must still support ui:binary. + +"""^^lv2:Markdown . + +ui:makeSONameResident + lv2:documentation """ + +This feature was intended to support UIs that link against toolkit libraries +which may not be unloaded during the lifetime of the host. This is better +achieved by using the appropriate flags when linking the UI, for example `gcc +-Wl,-z,nodelete`. + +"""^^lv2:Markdown . + +ui:noUserResize + lv2:documentation """ + +If a UI has this feature, it indicates that it does not make sense to let the +user resize the main widget, and the host should prevent that. This feature +may not make sense for all UI types. The data pointer for this feature should +always be set to NULL. + +"""^^lv2:Markdown . + +ui:fixedSize + lv2:documentation """ + +If a UI has this feature, it indicates the same thing as ui:noUserResize, and +additionally that the UI will not resize itself on its own. That is, the UI +will always remain the same size. This feature may not make sense for all UI +types. The data pointer for this feature should always be set to NULL. + +"""^^lv2:Markdown . + +ui:scaleFactor + lv2:documentation """ + +HiDPI (High Dots Per Inch) displays have a high resolution on a relatively +small form factor. Many systems use a scale factor to compensate for this, so +for example, a scale factor of 2 means things are drawn twice as large as +normal. + +Hosts can pass this as an option to UIs to communicate this information, so +that the UI can draw at an appropriate scale. + +"""^^lv2:Markdown . + +ui:backgroundColor + lv2:documentation """ + +The background color of the host's UI. The host can pass this as an option so +that UIs can integrate nicely with the host window around it. + +Hosts should pass this as an option to UIs with an integer RGBA32 color value. +If the value is a 32-bit integer, it is guaranteed to be in RGBA32 format, but +the UI must check the value type and not assume this, to allow for other types +of color in the future. + +"""^^lv2:Markdown . + +ui:foregroundColor + lv2:documentation """ + +The foreground color of the host's UI. The host can pass this as an option so +that UIs can integrate nicely with the host window around it. + +Hosts should pass this as an option to UIs with an integer RGBA32 color value. +If the value is a 32-bit integer, it is guaranteed to be in RGBA32 format, but +the UI must check the value type and not assume this, to allow for other types +of color in the future. + +"""^^lv2:Markdown . + +ui:parent + lv2:documentation """ + +This feature can be used to pass a parent that the UI should be a child of. +The format of data pointer of this feature is determined by the UI type, and is +generally the same type as the LV2UI_Widget that the UI would return. For +example, for a ui:X11UI, the parent should be a `Window`. This is particularly +useful for embedding, where the parent often must be known at construction time +for embedding to work correctly. + +UIs should not _require_ this feature unless it is necessary for them to work +at all, but hosts should provide it whenever possible. + +"""^^lv2:Markdown . + +ui:PortNotification + lv2:documentation """ + +This describes which ports the host must send notifications to the UI about. +The port must be specific either by index, using the ui:portIndex property, or +symbol, using the lv2:symbol property. Since port indices are not guaranteed +to be stable, using the symbol is recommended, and the inde MUST NOT be used +except by UIs that are shipped in the same bundle as the corresponding plugin. + +"""^^lv2:Markdown . + +ui:portNotification + lv2:documentation """ + +Specifies that a UI should receive notifications about changes to a particular +port's value via LV2UI_Descriptor::port_event(). + +For example: + + :::turtle + eg:ui + a ui:X11UI ; + ui:portNotification [ + ui:plugin eg:plugin ; + lv2:symbol "gain" ; + ui:protocol ui:floatProtocol + ] . + +"""^^lv2:Markdown . + +ui:notifyType + lv2:documentation """ + +Specifies a particular type that the UI should be notified of. + +This is useful for message-based ports where several types of data can be +present, but only some are interesting to the UI. For example, if UI control +is multiplexed in the same port as MIDI, this property can be used to ensure +that only the relevant events are forwarded to the UI, and not potentially high +frequency MIDI data. + +"""^^lv2:Markdown . + +ui:resize + lv2:documentation """ + +This feature corresponds to the LV2UI_Resize struct, which should be passed +with the URI LV2_UI__resize. This struct may also be provided by the UI as +extension data using the same URI, in which case it is used by the host to +request that the UI change its size. + +"""^^lv2:Markdown . + +ui:portMap + lv2:documentation """ + +This makes it possible to implement and distribute UIs separately from the +plugin binaries they control. + +This feature corresponds to the LV2UI_Port_Index struct, which should be passed +with the URI LV2_UI__portIndex. + +"""^^lv2:Markdown . + +ui:portSubscribe + lv2:documentation """ + +This makes it possible for a UI to explicitly request a particular style of +update from a port at run-time, in a more flexible and powerful way than +listing subscriptions statically allows. + +This feature corresponds to the LV2UI_Port_Subscribe struct, which should be +passed with the URI LV2_UI__portSubscribe. + +"""^^lv2:Markdown . + +ui:touch + lv2:documentation """ + +This is useful for automation, so the host can allow the user to take control +of a port, even if that port would otherwise be automated (much like grabbing a +physical motorised fader). + +It can also be used for MIDI learn or in any other situation where the host +needs to do something with a particular control and it would be convenient for +the user to select it directly from the plugin UI. + +Thi)lv2ttl" R"lv2ttl(s feature corresponds to the LV2UI_Touch struct, which should be passed with +the URI LV2_UI__touch. + +"""^^lv2:Markdown . + +ui:requestValue + lv2:documentation """ + +This allows a plugin UI to request a new parameter value using the host's UI, +for example by showing a dialog or integrating with the host's built-in content +browser. This should only be used for complex parameter types where the plugin +UI is not capable of showing the expected native platform or host interface to +choose a value, such as file path parameters. + +This feature corresponds to the LV2UI_Request_Value struct, which should be +passed with the URI LV2_UI__requestValue. + +"""^^lv2:Markdown . + +ui:idleInterface + lv2:documentation """ + +To support this feature, the UI should list it as a lv2:optionalFeature or +lv2:requiredFeature in its data, and also as lv2:extensionData. When the UI's +extension_data() is called with this URI (LV2_UI__idleInterface), it should +return a pointer to an LV2UI_Idle_Interface. + +To indicate support, the host should pass a feature to instantiate() with this +URI, with NULL for data. + +"""^^lv2:Markdown . + +ui:showInterface + lv2:documentation """ + +This allows UIs to gracefully degrade to separate windows when the host is +unable to embed the UI widget for whatever reason. When the UI's +extension_data() is called with this URI (LV2_UI__showInterface), it should +return a pointer to an LV2UI_Show_Interface. + +"""^^lv2:Markdown . + +ui:PortProtocol + lv2:documentation """ + +A PortProtocol MUST define: + +Port Type +: Which plugin port types the buffer type is valid for. + +Feature Data +: What data (if any) should be passed in the LV2_Feature. + +A PortProtocol for an output port MUST define: + +Update Frequency +: When the host should call port_event(). + +Update Format +: The format of the data in the buffer passed to port_event(). + +Options +: The format of the options passed to subscribe() and unsubscribe(). + +A PortProtocol for an input port MUST define: + +Write Format +: The format of the data in the buffer passed to write_port(). + +Write Effect +: What happens when the UI calls write_port(). + +For an example, see ui:floatProtocol or ui:peakProtocol. + +PortProtocol is a subclass of lv2:Feature, so UIs use lv2:optionalFeature and +lv2:requiredFeature to specify which PortProtocols they want to use. + +"""^^lv2:Markdown . + +ui:floatProtocol + lv2:documentation """ + +A protocol for transferring single floating point values. The rules for this +protocol are: + +Port Type +: lv2:ControlPort + +Feature Data +: None. + +Update Frequency +: The host SHOULD call port_event() as soon as possible when the port value has + changed, but there are no timing guarantees. + +Update Format +: A single float. + +Options +: None. + +Write Format +: A single float. + +Write Effect +: The host SHOULD set the port to the received value as soon as possible, but + there is no guarantee that run() actually sees this value. + +"""^^lv2:Markdown . + +ui:peakProtocol + lv2:documentation """ + +This port protocol defines a way for the host to send continuous peak +measurements of the audio signal at a certain port to the UI. The intended use +is visualisation, for example an animated meter widget that shows the level of +the audio input or output. + +A contiguous sequence of audio samples for which a peak value has been computed +is called a _measurement period_. + +The rules for this protocol are: + +Port Type +: lv2:AudioPort + +Feature Data +: None. + +Update Frequency +: The host SHOULD call port_event() at regular intervals. The measurement + periods used for calls to port_event() for the same port SHOULD be + contiguous (i.e. the measurement period for one call should begin right + after the end of the measurement period for the previous call ends) unless + the UI has removed and re-added the port subscription between those calls. + However, UIs MUST NOT depend on either the regularity of the calls or the + contiguity of the measurement periods; hosts may change the call rate or + skip calls for performance or other reasons. Measurement periods for + different calls to port_event() for the same port MUST NOT overlap. + +Update Format +: A single LV2UI_Peak_Data object. + +Options +: None. + +Write Format +: None. + +Write Effect +: None. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 22 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"ui.ttl", +R"lv2ttl(@prefix lv2: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 UI" ; + rdfs:comment "User interfaces for LV2 plugins." ; + owl:imports ; + rdfs:seeAlso , + . + +ui:UI + a rdfs:Class , + owl:Class ; + rdfs:label "User Interface" ; + rdfs:comment "A UI for an LV2 plugin." . + +ui:GtkUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "GTK2 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Gtk+ 2.0 GtkWidget." . + +ui:Gtk3UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "GTK3 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Gtk+ 3.0 GtkWidget." . + +ui:Qt4UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Qt4 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Qt4 QWidget." . + +ui:Qt5UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Qt5 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Qt5 QWidget." . + +ui:X11UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "X11 UI" ; + rdfs:comment "A UI where the widget is an X11 Window window ID." . + +ui:WindowsUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Windows UI" ; + rdfs:comment "A UI where the widget is a Windows HWND window ID." . + +ui:CocoaUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Cocoa UI" ; + rdfs:comment "A UI where the widget is a pointer to a NSView." . + +ui:ui + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:Plugin ; + rdfs:range ui:UI ; + rdfs:label "user interface" ; + rdfs:comment "Relates a plugin to a UI that applies to it." . + +ui:binary + a rdf:Property , + owl:ObjectProperty ; + owl:sameAs lv2:binary ; + owl:deprecated "true"^^xsd:boolean ; + rdfs:label "binary" ; + rdfs:comment "The shared library that a UI resides in." . + +ui:makeSONameResident + a lv2:Feature ; + owl:deprecated "true"^^xsd:boolean ; + rdfs:label "make SO name resident" ; + rdfs:comment "UI binary must not be unloaded." . + +ui:noUserResize + a lv2:Feature ; + rdfs:label "no user resize" ; + rdfs:comment "Non-resizable UI." . + +ui:fixedSize + a lv2:Feature ; + rdfs:label "fixed size" ; + rdfs:comment "Non-resizable UI that will never resize itself." . + +ui:scaleFactor + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:range xsd:float ; + rdfs:label "scale factor" ; + rdfs:comment "Scale factor for high resolution screens." . + +ui:backgroundColor + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "background color" ; + rdfs:comment """The background color of the host's UI.""" . + +ui:foregroundColor + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "foreground color" ; + rdfs:comment """The foreground color of the host's UI.""" . + +ui:parent + a lv2:Feature ; + rdfs:label "parent" ; + rdfs:comment "The parent for a UI." . + +ui:PortNotification + a rdfs:Class , + owl:Class ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty ui:plugin ; + owl:cardinality 1 ; + rdfs:comment "A PortNotification MUST have exactly one ui:plugin." + ] ; + rdfs:label "Port Notification" ; + rdfs:comment "A description of port updates that a host must send a UI." . + +ui:portNotification + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:UI ; + rdfs:range ui:PortNotification ; + rdfs:label "port notification" ; + rdfs:comment "Specifies a port notification that is required by a UI." . + +ui:plugin + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range lv2:Plugin ; + rdfs:label "plugin" ; + rdfs:comment "The plugin a portNotification applies to." . + +ui:portIndex + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range xsd:decimal ; + rdfs:label "port index" ; + rdfs:comment "The index of the port a portNotification applies to." . + +ui:notifyType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:label "notify type" ; + rdfs:comment "A particular type that the UI should be notified of." . + +ui:resize + a lv2:Feature , + lv2:ExtensionData ; + rdfs:label "resize" ; + rdfs:comment """A feature that control of, and notifications about, a UI's size.""" . + +ui:portMap + a lv2:Feature ; + rdfs:label "port map" ; + rdfs:comment "A feature for accessing the index of a port by symbol." . + +ui:portSubscribe + a lv2:Feature ; + rdfs:label "port subscribe" ; + rdfs:comment "A feature for dynamically subscribing to updates from a port." . + +ui:touch + a lv2:Feature ; + rdfs:label "touch" ; + rdfs:comment "A feature to notify that the user has grabbed a port control." . + +ui:requestValue + a lv2:Feature ; + rdfs:label "request value" ; + rdfs:comment "A feature to request a parameter value from the user via the host." . + +ui:idleInterface + a lv2:Feature , + lv2:ExtensionData ; + rdfs:label "idle interface" ; + rdfs:comment "A feature that provides a callback for the host to drive the UI." . + +ui:showInterface + a lv2:ExtensionData ; + rdfs:label "show interface" ; + rdfs:comment "An interface for showing and hiding a window for a UI." . + +ui:windowTitle + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:string ; + rdfs:label "window title" ; + rdfs:comment "The title for the window shown by LV2UI_Show_Interface." . + +ui:updateRate + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:float ; + rdfs:label "update rate" ; + rdfs:comment "The target rate, in Hz, to send updates to the UI." . + +ui:protocol + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range ui:PortProtocol ; + rdfs:label "protocol" ; + rdfs:comment "The protocol to be used for this notification." . + +ui:PortProtocol + a rdfs:Class ; + rdfs:subClassOf lv2:Feature ; + rdfs:label "Port Protocol" ; + rdfs:comment "A method to communicate port data between a UI and plugin." . + +ui:floatProtocol + a ui:PortProtocol ; + rdfs:label "float protocol" ; + rdfs:comment "A protocol for transferring single floating point values." . + +ui:peakProtocol + a ui:PortProtocol ; + rdfs:label "peak protocol" ; + rdfs:comment "A protocol for sending continuous peak measurements of an audio signal." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"options", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"options.ttl", +R"lv2ttl(@prefix lv2: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Options" ; + rdfs:comment "Runtime options for LV2 plugins and UIs." ; + rdfs:seeAlso , + . + +opts:Option + a rdfs:Class ; + rdfs:label "Option" ; + rdfs:subClassOf rdf:Property ; + rdfs:comment "A value for a static option passed to an instance." . + +opts:interface + a lv2:ExtensionData ; + rdfs:label "interface" ; + rdfs:comment "An interface for dynamically setting and getting options." . + +opts:options + a lv2:Feature ; + rdfs:label "options" ; + rdfs:comment "The feature used to provide options to an instance." . + +opts:requiredOption + a rdf:Property , + owl:ObjectProperty ; + rdfs:range rdf:Property ; + rdfs:label "required option" ; + rdfs:comment "An option required by the instance to function at all." . + +opts:supportedOption + a rdf:Property , + owl:ObjectProperty ; + rdfs:range rdf:Property ; + rdfs:label "supported option" ; + rdfs:comment "An option supported or by the instance." . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"options.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix opts: . +@prefix rdf: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Options" ; + doap:shortdesc "Runtime options for LV2 plugins and UIs." ; + doap:created "2012-08-20" ; + doap:developer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Relax range of opts:requiredOption and opts:supportedOption" + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2013-01-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Set the range of opts:requiredOption and opts:supportedOption to opts:Option." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a facility for options, which are values the host +passes to a plugin or UI at run time. + +There are two facilities for passing options to an instance: opts:options +allows passing options at instantiation time, and the opts:interface interface +allows options to be dynamically set and retrieved after instantiation. + +Note that this extension is only for allowing hosts to configure plugins, and +is not a live control mechanism. For real-time control, use event-based +control via an atom:AtomPort with an atom:Sequence buffer. + +Instances may indicate they require an option with the opts:requiredOption +property, or that they optionally support an option with the +opts:supportedOption property. + +"""^^lv2:Markdown . + +opts:Option + lv2:documentation """ + +It is not required for a property to explicitly be an Option in order to be +used as such. However, properties which are primarily intended for use as +options, or are at least particularly useful as options, should be explicitly +given this type for documentation purposes, and to assist hosts in discovering +option definitions. + +"""^^lv2:Markdown . + +opts:interface + lv2:documentation """ + +An interface (LV2_Options_Interface) for dynamically setting and getting +options. Note that this is intended for use by the host for configuring +plugins only, and is not a live plugin control mechanism. + +The plugin data file should advertise this interface like so: + + :::turtle + @prefix opts: . + + + a lv2:Plugin ; + lv2:extensionData opts:interface . + +"""^^lv2:Markdown . + +opts:options + lv2:documentation """ + +To implement this feature, hosts MUST pass an LV2_Feature to the appropriate +instantiate method with this URI and data pointed to an array of +LV2_Options_Option terminated by an element with both key and value set to +zero. The instance should cast this data pointer to `const +LV2_Options_Option*` and scan the array for any options of interest. The +instance MUST NOT modify the options array in any way. + +Note that requiring this feature may reduce the number of compatible hosts. +Unless some options are strictly required by the instance, this feature SHOULD +be listed as an lv2:optionalFeature. + +"""^^lv2:Markdown . + +opts:requiredOption + lv2:documentation """ + +The host MUST pass a value for the specified option via opts:options during +instantiation. + +Note that use of this property may reduce the number of compatible hosts. +Wherever possible, it is better to list options with opts:supportedOption and +fall back to a reasonable default value if it is not provided. + +"""^^lv2:Markdown . + +opts:supportedOption + lv2:documentation """ + +The host SHOULD provide a value for the specified option if one is known, or +provide the user an opportunity to specify one if possible. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"resize-port", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"resize-port.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix rsz: . + + + a doap:Project ; + doap:name "LV2 Resize Port" ; + doap:shortdesc "Dynamically sized LV2 port buffers." ; + doap:created "2007-00-00" ; + doap:developer ; + doap:release [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature, rsz:resize, which allows plugins to +dynamically resize their output port buffers. + +In addition to the dynamic feature, there are properties which describe the +space required for a particular port buffer which can be used statically in +data files. + +"""^^lv2:Markdown . + +rsz:resize + lv2:documentation """ + +A feature to resize output port buffers in LV2_Plugin_Descriptor::run(). + +To support this feature, the host must pass an LV2_Feature to the plugin's +instantiate method with URI LV2_RESIZE_PORT__resize and a pointer to a +LV2_Resize_Port_Resize structure. This structure provides a resize_port +function which plugins may use to resize output port buffers as necessary. + +"""^^lv2:Markdown . + +rsz:asLargeAs + lv2:documentation """ + +Indicates that a port requires at least as much buffer space as the port with +the given symbol on the same plugin instance. This may be used for any ports, +but is generally most useful to indicate an output port must be at least as +large as some input port (because it will copy from it). If a port is +asLargeAs several ports, it is asLargeAs the largest such port (not the sum of +those ports' sizes). + +The host guarantees that whenever an ObjectPort's run method is called, any +output `O` that is rsz:asLargeAs an input `I` is connected to a buffer large +enough to copy `I`, or `NULL` if the port is lv2:connectionOptional. + +"""^^lv2:Markdown . + +rsz:minimumSize + lv2:documentation """ + +Indicates that a port requires a buffer at least this large, in bytes. Any +host that supports the resize-port feature MUST connect any port with a +minimumSize specified to a buffer at least as large as the value given for this +property. Any host, especially those that do NOT support dynamic port +resizing, SHOULD do so or reduced functionality may result. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"resize-port.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix rsz: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Resize Port" ; + rdfs:comment "Dynamically sized LV2 port buffers." ; + rdfs:seeAlso , + . + +rsz:resize + a lv2:Feature ; + rdfs:label "resize" ; + rdfs:comment "A feature for resizing output port buffers." . + +rsz:asLargeAs + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range lv2:Symbol ; + rdfs:label "as large as" ; + rdfs:comment "Port that this port must have at least as much buffer space as." . + +rsz:minimumSize + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "minimum size" ; + rdfs:comment "Minimum buffer size required by a port, in bytes." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"core", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix doap: . +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 18 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + + + a doap:Project ; + rdfs:seeAlso , + . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix lv2: . +@prefix meta: . +@prefix rdf: . +@prefix rdfs: . + + + rdf:value """ +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. +""" . + + + a doap:Project ; + lv2:symbol "lv2" ; + rdfs:label "LV2" ; + rdfs:comment "The LV2 Plugin Interface Project." ; + doap:name "LV2" ; + doap:license ; + doap:shortdesc "The LV2 Plugin Interface Project." ; + doap:description "LV2 is a plugin standard for audio systems. It defines a minimal yet extensible C API for plugin code and a format for plugin bundles" ; + doap:created "2006-05-10" ; + doap:homepage ; + doap:mailing-list ; + doap:programming-language "C" ; + doap:repository [ + a doap:SVNRepository ; + doap:location + ] ; + doap:developer , + ; + doap:helper meta:larsl , + meta:bmwiedemann , + meta:gabrbedd , + meta:daste , + meta:kfoltman , + meta:paniq ; + doap:release [ + doap:revision "1.18.2" ; + doap:created "2021-01-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "eg-sampler: Save and restore gain parameter value." + ] , [ + rdfs:label "Various code cleanups and infrastructure improvements." + ] + ] + ] , [ + doap:revision "1.18.0" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] , [ + rdfs:label "Separate extended documentation from primary data." + ] + ] + ] , [ + doap:revision "1.16.0" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add core/attributes.h utility header." + ] , [ + rdfs:label "eg-sampler: Add waveform display to UI." + ] , [ + rdfs:label "eg-midigate: Respond to \"all notes off\" MIDI message." + ] , [ + rdfs:label "Simplify use of lv2specgen." + ] , [ + rdfs:label "Add lv2_validate utility." + ] , [ + rdfs:label "Install headers to simpler paths." + ] , [ + rdfs:label "Aggressively deprecate uri-map and event extensions." + ] , [ + rdfs:label "Upgrade build system and fix building with Python 3.7." + ] + ] + ] , [ + doap:revision "1.14.0" ; + doap:created "2016-09-19" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label """eg-scope: Don't feed back UI state updates.""" + ] , [ + rdfs:label "eg-sampler: Fix handling of state file paths." + ] , [ + rdfs:label "eg-sampler: Support thread-safe state restoration." + ] + ] + ] , [ + doap:revision "1.12.0" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "eg-sampler: Support patch:Get, and request initial state from UI." + ] , [ + rdfs:label "eg-sampler: Add gain parameter." + ] , [ + rdfs:label "Fix merging of version histories in specification documentation." + ] , [ + rdfs:label "Improve API documentation." + ] , [ + rdfs:label "Simplify property restrictions by removing redundancy." + ] + ] + ] , [ + doap:revision "1.10.0" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "lv2specgen: Display deprecated warning on classes marked owl:deprecated." + ] , [ + rdfs:label "Fix -Wconversion warnings in headers." + ] , [ + rdfs:label "Upgrade to waf 1.7.16." + ] + ] + ] , [ + doap:revision "1.8.0" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add scope example plugin from Robin Gareus." + ] , [ + rdfs:label "lv2specgen: Fix links to externally defined terms." + ] , [ + rdfs:label "Install lv2specgen for use by other projects." + ] + ] + ] , [ + doap:revision "1.6.0" ; + doap:created "2013-08-09" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix port indices of metronome example." + ] , [ + rdfs:label "Fix lv2specgen usage from command line." + ] , [ + rdfs:label "Upgrade to waf 1.7.11." + ] + ] + ] , [ + doap:revision "1.4.0" ; + doap:created "2013-02-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add metronome example plugin to demonstrate sample accurate tempo sync." + ] , [ + rdfs:label "Generate book-style HTML documentation from example plugins." + ] + ] + ] , [ + doap:revision "1.2.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Move all project metadata for extensions (e.g. change log) to separate files to spare hosts from loading them during discovery." + ] , [ + rdfs:label "Use stricter datatype definitions conformant with the XSD and OWL specifications for better validation." + ] + ] + ] , [ + doap:revision "1.0.0" ; + doap:created "2012-04-16" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label """Initial release as a unified project. Projects can now simply depend on the pkg-config package 'lv2' for all official LV2 APIs.""" + ] , [ + rdfs:label "New extensions: atom, log, parameters, patch, port-groups, port-props, resize-port, state, time, worker." + ] + ] + ] . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"people.ttl", +R"lv2ttl(@prefix foaf: . +@prefix meta: . +@prefix rdfs: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:mbox ; + rdfs:seeAlso . + + + a foaf:Person ; + foaf:name "Steve Harris" ; + foaf:mbox ; + rdfs:seeAlso . + +meta:larsl + a foaf:Person ; + foaf:name "Lars Luthman" ; + foaf:mbox . + +meta:gabrbedd + a foaf:Person ; + foaf:name "Gabriel M. Beddingfield" ; + foaf:mbox . + +meta:daste + a foaf:Person ; + foaf:name """Stefano D'Angelo""" ; + foaf:mbox . + +meta:kfoltman + a foaf:Person ; + foaf:name "Krzysztof Foltman" ; + foaf:mbox . + +meta:paniq + a foaf:Person ; + foaf:name "Leonard Ritter" ; + foaf:mbox . + +meta:harry + a foaf:Person ; + foaf:name "Harry van Haaren" ; + foaf:mbox . + +meta:bmwiedemann + a foaf:Person ; + foaf:name "Bernhard M. Wiedemann" ; + foaf:mbox . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"lv2core.meta.ttl", +R"lv2ttl(@prefix lv2: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2" ; + doap:homepage ; + doap:created "2004-04-21" ; + doap:shortdesc "An extensible open standard for audio plugins" ; + doap:programming-language "C" ; + doap:developer , + ; + doap:maintainer ; + doap:release [ + doap:revision "18.0" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:Markdown datatype." + ] , [ + rdfs:label "Deprecate lv2:reportsLatency." + ] + ] + ] , [ + doap:revision "16.0" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:MIDIPlugin class." + ] , [ + rdfs:label "Rework port restrictions so that presets can be validated." + ] + ] + ] , [ + doap:revision "14.0" ; + doap:created "2016-09-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2_util.h with lv2_features_data() and lv2_features_query()." + ] , [ + rdfs:label "Add lv2:enabled designation." + ] + ] + ] , [ + doap:revision "12.4" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Relax domain of lv2:minimum lv2:maximum and lv2:default so they can be used to describe properties/parameters as well." + ] , [ + rdfs:label "Add extern C and visibility attribute to LV2_SYMBOL_EXPORT." + ] , [ + rdfs:label "Add lv2:isSideChain port property." + ] + ] + ] , [ + doap:revision "12.2" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Clarify lv2_descriptor() and lv2_lib_descriptor() documentation." + ] + ] + ] , [ + doap:revision "12.0" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:prototype for property inheritance." + ] + ] + ] , [ + doap:revision "10.0" ; + doap:created "2013-02-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:EnvelopePlugin class." + ] , [ + rdfs:label "Add lv2:control for designating primary event-based control ports." + ] , [ + rdfs:label "Set range of lv2:designation to lv2:Designation." + ] , [ + rdfs:label "Make lv2:Parameter rdfs:subClassOf rdf:Property." + ] , [ + rdfs:label "Reserve minor version 0 for unstable development plugins." + ] + ] + ] , [ + doap:revision "8.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "8.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix LV2_SYMBOL_EXPORT and lv2_descriptor prototype for Windows." + ] , [ + rdfs:label "Add metadata concept of a designation, a channel or parameter description which can be assigned to ports for more intelligent use by hosts." + ] , [ + rdfs:label "Add new discovery API which allows libraries to read bundle files during discovery, makes library construction/destruction explicit, and adds extensibility to prevent future breakage." + ] , [ + rdfs:label "Relax the range of lv2:index so it can be used for things other than ports." + ] , [ + rdfs:label "Remove lv2:Resource, which turned out to be meaningless." + ] , [ + rdfs:label "Add lv2:CVPort." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "6.0" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Rename core.lv2 and lv2.ttl to lv2core.lv2 and lv2core.ttl to adhere to modern conventions." + ] , [ + rdfs:label "Add lv2:extensionData and lv2:ExtensionData for plugins to indicate that they support some URI for extension_data()." + ] , [ + rdfs:label "Remove lv2config in favour of the simple convention that specifications install headers to standard URI-based paths." + ] , [ + rdfs:label "Switch to the ISC license, a simple BSD-style license (with permission of all contributors to lv2.h and its ancestor, ladspa.h)." + ] , [ + rdfs:label "Make lv2core.ttl a valid OWL 2 DL ontology." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "4.0" ; + doap:created "2011-03-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make doap:license suggested, but not required (for wrappers)." + ] , [ + rdfs:label "Define lv2:binary (MUST be in manifest.ttl)." + ] , [ + rdfs:label "Define lv2:minorVersion and lv2:microVersion (MUST be in manifest.ttl)." + ] , [ + rdfs:label "Define lv2:documentation and use it to document lv2core." + ] , [ + rdfs:label "Add lv2:FunctionPlugin and lv2:ConstantPlugin classes." + ] , [ + rdfs:label "Move lv2:AmplifierPlugin under lv2:DynamicsPlugin." + ] , [ + rdfs:label "Loosen domain of lv2:optionalFeature and lv2:requiredFeature (to allow re-use in extensions)." + ] , [ + rdfs:label "Add generic lv2:Resource and lv2:PluginBase classes." + ] , [ + rdfs:label "Fix definition of lv2:minimum etc. (used for values, not scale points)." + ] , [ + rdfs:label "More precisely define properties with OWL." + ] , [ + rdfs:label "Move project metadata to manifest." + ] , [ + rdfs:label "Add lv2:enumeration port property." + ] , [ + rdfs:label "Define run() pre-roll special case (sample_count == 0)." + ] + ] + ] , [ + doap:revision "3.0" ; + doap:created "2008-11-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Require that serialisations refer to ports by symbol rather than index." + ] , [ + rdfs:label "Minor stylistic changes to lv2.ttl." + ] , [ + rdfs:label "No header changes." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2008-02-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +LV2 is an interface for writing audio plugins in C or compatible languages, +which can be dynamically loaded into many _host_ applications. This core +specification is simple and minimal, but is designed so that _extensions_ can +be defined to add more advanced features, making it possible to implement +nearly any feature. + +LV2 maintains a strong distinction between code and data. Plugin code is in a +shared library, while data is in a companion data file written in +[Turtle](https://www.w3.org/TR/turtle/). Code, data, and any other resources +(such as wav)lv2ttl" R"lv2ttl(eforms) are shipped together in a bundle directory. The code +contains only the executable portions of the plugin. All other data is +provided in the data file(s). This makes plugin data flexible and extensible, +and allows the host to do everything but run the plugin without loading or +executing any code. Among other advantages, this makes hosts more robust +(broken plugins can't crash a host during discovery) and allows generic tools +written in any language to work with LV2 data. The LV2 specification itself is +distributed in a similar way. + +An LV2 plugin library is suitable for dynamic loading (for example with +`dlopen()`) and provides one or more plugin descriptors via `lv2_descriptor()` +or `lv2_lib_descriptor()`. These can be instantiated to create plugin +instances, which can be run directly on data or connected together to perform +advanced signal processing tasks. + +Plugins communicate via _ports_, which can transmit any type of data. Data is +processed by first connecting each port to a buffer, then repeatedly calling +the `run()` method to process blocks of data. + +This core specification defines two types of port, equivalent to those in +[LADSPA](http://www.ladspa.org/), lv2:ControlPort and lv2:AudioPort, as well as +lv2:CVPort which has the same format as an audio port but is interpreted as +non-audible control data. Audio ports contain arrays with one `float` element +per sample, allowing a block of audio to be processed in a single call to +`run()`. Control ports contain single `float` values, which are fixed and +valid for the duration of the call to `run()`. Thus the _control rate_ is +determined by the block size, which is controlled by the host (and not +necessarily constant). + +### Threading Rules + +To faciliate use in multi-threaded programs, LV2 functions are partitioned into +several threading classes: + +| Discovery Class | Instantiation Class | Audio Class | +|----------------------------------|-------------------------------|------------------------------- | +| lv2_descriptor() | LV2_Descriptor::instantiate() | LV2_Descriptor::run() | +| lv2_lib_descriptor() | LV2_Descriptor::cleanup() | LV2_Descriptor::connect_port() | +| LV2_Descriptor::extension_data() | LV2_Descriptor::activate() | | +| | LV2_Descriptor::deactivate() | | + +Hosts MUST guarantee that: + + * A function in any class is never called concurrently with another function + in that class. + + * A _Discovery_ function is never called concurrently with any other fuction + in the same shared object file. + + * An _Instantiation_ function for an instance is never called concurrently + with any other function for that instance. + +Any simultaneous calls that are not explicitly forbidden by these rules are +allowed. For example, a host may call `run()` for two different plugin +instances simultaneously. + +Plugin functions in any class MUST NOT manipulate any state which might affect +other plugins or the host (beyond the contract of that function), for example +by using non-reentrant global functions. + +Extensions to this specification which add new functions MUST declare in which +of these classes the functions belong, define new classes for them, or +otherwise precisely describe their threading rules. + +"""^^lv2:Markdown . + +lv2:Specification + lv2:documentation """ + +An LV2 specification typically contains a vocabulary description, C headers to +define an API, and any other resources that may be useful. Specifications, +like plugins, are distributed and installed as bundles so that hosts may +discover them. + +"""^^lv2:Markdown . + +lv2:Markdown + lv2:documentation """ + +This datatype is typically used for documentation in +[Markdown](https://daringfireball.net/projects/markdown/syntax) syntax. + +Generally, documentation with this datatype should stay as close to readable +plain text as possible, but may use core Markdown syntax for nicer +presentation. Documentation can assume that basic extensions like codehilite +and tables are available. + +"""^^lv2:Markdown . + +lv2:documentation + lv2:documentation """ + +Relates a Resource to extended documentation. + +LV2 specifications are documented using this property with an lv2:Markdown +datatype. + +If the value has no explicit datatype, it is assumed to be a valid XHTML Basic +1.1 fragment suitable for use as the content of the `body` element of a page. + +XHTML Basic is a W3C Recommendation which defines a simplified subset of XHTML +intended to be reasonable to implement with limited resources, for exampe on +embedded devices. See [XHTML Basic, Section +3](http://www.w3.org/TR/xhtml-basic/#s_xhtmlmodules) for a list of valid tags. + +"""^^lv2:Markdown . + +lv2:PluginBase + lv2:documentation """ + +An abstract plugin-like resource that may not actually be an LV2 plugin, for +example that may not have a lv2:binary. This is useful for describing things +that share common structure with a plugin, but are not themselves an actul +plugin, such as presets. + +"""^^lv2:Markdown . + +lv2:Plugin + lv2:documentation """ + +To be discovered by hosts, plugins MUST explicitly have an rdf:type of lv2:Plugin +in their bundle's manifest, for example: + + :::turtle + a lv2:Plugin . + +Plugins should have a doap:name property that is at most a few words in length +using title capitalization, for example Tape Delay Unit. + +"""^^lv2:Markdown . + +lv2:PortBase + lv2:documentation """ + +Similar to lv2:PluginBase, this is an abstract port-like resource that may not +be a fully specified LV2 port. For example, this is used for preset "ports" +which do not specify an index. + +"""^^lv2:Markdown . + +lv2:Port + lv2:documentation """ + +All LV2 port descriptions MUST have a rdf:type that is one of lv2:Port, +lv2:InputPort or lv2:OutputPort. Additionally, there MUST be at least one +other rdf:type which more precisely describes type of the port, for example +lv2:AudioPort. + +Hosts that do not support a specific port class MUST NOT instantiate the +plugin, unless that port has the lv2:connectionOptional property set. + +A port has two identifiers: a (numeric) index, and a (textual) symbol. The +index can be used as an identifier at run-time, but persistent references to +ports (for example in presets or save files) MUST use the symbol. Only the +symbol is guaranteed to refer to the same port on all plugins with a given URI, +that is the index for a port may differ between plugin binaries. + +"""^^lv2:Markdown . + +lv2:AudioPort + lv2:documentation """ + +Ports of this type are connected to a buffer of `float` audio samples, which +the host guarantees have `sample_count` elements in any call to +LV2_Descriptor::run(). + +Audio samples are normalized between -1.0 and 1.0, though there is no +requirement for samples to be strictly within this range. + +"""^^lv2:Markdown . + +lv2:CVPort + lv2:documentation """ + +Ports of this type have the same buffer format as an lv2:AudioPort, except the +buffer represents audio-rate control data rather than audio. Like a +lv2:ControlPort, a CV port SHOULD have properties describing its value, in +particular lv2:minimum, lv2:maximum, and lv2:default. + +Hosts may present CV ports to users as controls in the same way as control +ports. Conceptually, aside from the buffer format, a CV port is the same as a +control port, so hosts can use all the same properties and expectations. + +In particular, this port type does not imply any range, unit, or meaning for +its values. However, if there is no inherent unit to the values, for example +if the port is used to modulate some other value, then plugins SHOULD use a +normalized range, either from -1.0 to 1.0, or from 0.0 to 1.0. + +It is generally safe to connect an audio output to a CV input, but not +vice-versa. Hosts must take care to prevent data from a CVPort port from being +used as audio. + +"""^^lv2:Markdown . + +lv2:project + lv2:documentation """ + +This property provides a way to )lv2ttl" R"lv2ttl(group plugins and/or related resources. A +project may have useful metadata common to all plugins (such as homepage, +author, version history) which would be wasteful to list separately for each +plugin. + +Grouping via projects also allows users to find plugins in hosts by project, +which is often how they are remembered. For this reason, a project that +contains plugins SHOULD always have a doap:name. It is also a good idea for +each plugin and the project itself to have an lv2:symbol property, which allows +nice quasi-global identifiers for plugins, for example `myproj.superamp` which +can be useful for display or fast user entry. + +"""^^lv2:Markdown . + +lv2:prototype + lv2:documentation """ + +This property can be used to include common properties in several +descriptions, serving as a sort of template mechanism. If a plugin has a +prototype, then the host must load all the properties for the prototype as if +they were properties of the plugin. That is, if `:plug lv2:prototype :prot`, +then for each triple `:prot p o`, the triple `:plug p o` should be loaded. + +This facility is useful for distributing data-only plugins that rely on a +common binary, for example those where the internal state is loaded from some +other file. Such plugins can refer to a prototype in a template LV2 bundle +which is installed by the corresponding software. + +"""^^lv2:Markdown . + +lv2:minorVersion + lv2:documentation """ + +This, along with lv2:microVersion, is used to distinguish between different +versions of the same resource, for example to load only the bundle with +the most recent version of a plugin. An LV2 version has a minor and micro +number with the usual semantics: + + * The minor version MUST be incremented when backwards (but not forwards) + compatible additions are made, for example the addition of a port to a + plugin. + + * The micro version is incremented for changes which do not affect + compatibility at all, for example bug fixes or documentation updates. + +Note that there is deliberately no major version: all versions with the same +URI are compatible by definition. Replacing a resource with a newer version of +that resource MUST NOT break anything. If a change violates this rule, then +the URI of the resource (which serves as the major version) MUST be changed. + +Plugins and extensions MUST adhere to at least the following rules: + + * All versions of a plugin with a given URI MUST have the same set of + mandatory (not lv2:connectionOptional) ports with respect to lv2:symbol and + rdf:type. In other words, every port on a particular version is guaranteed + to exist on a future version with same lv2:symbol and at least those + rdf:types. + + * New ports MAY be added without changing the plugin URI if and only if they + are lv2:connectionOptional and the minor version is incremented. + + * The minor version MUST be incremented if the index of any port (identified + by its symbol) is changed. + + * All versions of a specification MUST be compatible in the sense that an + implementation of the new version can interoperate with an implementation + of any previous version. + +Anything that depends on a specific version of a plugin (including referencing +ports by index) MUST refer to the plugin by both URI and version. However, +implementations should be tolerant where possible. + +When hosts discover several installed versions of a resource, they SHOULD warn +the user and load only the most recent version. + +An odd minor _or_ micro version, or minor version zero, indicates that the +resource is a development version. Hosts and tools SHOULD clearly indicate +this wherever appropriate. Minor version zero is a special case for +pre-release development of plugins, or experimental plugins that are not +intended for stable use at all. Hosts SHOULD NOT expect such a plugin to +remain compatible with any future version. Where feasible, hosts SHOULD NOT +expose such plugins to users by default, but may provide an option to display +them. + +"""^^lv2:Markdown . + +lv2:microVersion + lv2:documentation """ + +Releases of plugins and extensions MUST be explicitly versioned. Correct +version numbers MUST always be maintained for any versioned resource that is +published. For example, after a release, if a change is made in the development +version in source control, the micro version MUST be incremented (to an odd +number) to distinguish this modified version from the previous release. + +This property describes half of a resource version. For detailed documentation +on LV2 resource versioning, see lv2:minorVersion. + +"""^^lv2:Markdown . + +lv2:binary + lv2:documentation """ + +The value of this property must be the URI of a shared library object, +typically in the same bundle as the data file which contains this property. +The actual type of the library is platform specific. + +This is a required property of a lv2:Plugin which MUST be included in the +bundle's `manifest.ttl` file. The lv2:binary of a lv2:Plugin is the shared +object containing the lv2_descriptor() or lv2_lib_descriptor() function. This +probably may also be used similarly by extensions to relate other resources to +their implementations (it is not implied that a lv2:binary on an arbitrary +resource is an LV2 plugin library). + +"""^^lv2:Markdown . + +lv2:appliesTo + lv2:documentation """ + +This is primarily intended for discovery purposes: bundles that describe +resources that work with particular plugins (like presets or user interfaces) +SHOULD specify this in their `manifest.ttl` so the host can associate them with +the correct plugin. For example: + + :::turtle + + a ext:Thing ; + lv2:appliesTo ; + rdfs:seeAlso . + +Using this pattern is preferable for large amounts of data, since the host may +choose whether/when to load the data. + +"""^^lv2:Markdown . + +lv2:Symbol + lv2:documentation """ + +The first character of a symbol must be one of `_`, `a-z` or `A-Z`, and +subsequent characters may additionally be `0-9`. This is, among other things, +a valid C identifier, and generally compatible in most contexts which have +restrictions on string identifiers, such as file paths. + +"""^^lv2:Markdown . + +lv2:symbol + lv2:documentation """ + +The value of this property MUST be a valid lv2:Symbol, and MUST NOT have a +language tag. + +A symbol is a unique identifier with respect to the parent, for example a +port's symbol is a unique identifiers with respect to its plugin. The plugin +author MUST change the plugin URI if any port symbol is changed or removed. + +"""^^lv2:Markdown . + +lv2:name + lv2:documentation """ + +Unlike lv2:symbol, this is unrestricted, may be translated, and is not relevant +for compatibility. The name is not necessarily unique and MUST NOT be used as +an identifier. + +"""^^lv2:Markdown . + +lv2:shortName + lv2:documentation """ + +This is the same as lv2:name, with the additional requirement that the value is +shorter than 16 characters. + +"""^^lv2:Markdown . + +lv2:Designation + lv2:documentation """ + +A designation is metadata that describes the meaning or role of something. By +assigning a designation to a port using lv2:designation, the port's content +becomes meaningful and can be used more intelligently by the host. + +"""^^lv2:Markdown . + +lv2:Channel + lv2:documentation """ + +A specific channel, for example the left channel of a stereo stream. A +channel may be audio, or another type such as a MIDI control stream. + +"""^^lv2:Markdown . + +lv2:Parameter + lv2:documentation """ + +A parameter is a designation for a control. + +A parameter defines the meaning of a control, not the method of conveying its +value. For example, a parameter could be controlled via a lv2:ControlPort, +messages, or both. + +A lv2:ControlPort can be associated with a parameter using lv2:designation. + +"""^^lv2:Markdown . + +lv2:designation + lv2:documentation """ + +This property is used to give a port's contents a well-defined meaning. For +example, if a port has the designation `eg:gain`, then the value of that port +re)lv2ttl" R"lv2ttl(presents the `eg:gain` of the plugin instance. + +Ports should be given designations whenever possible, particularly if a +suitable designation is already defined. This allows the host to act more +intelligently and provide a more effective user interface. For example, if the +plugin has a BPM parameter, the host may automatically set that parameter to +the current tempo. + +"""^^lv2:Markdown . + +lv2:freeWheeling + lv2:documentation """ + +If true, this means that all processing is happening as quickly as possible, +not in real-time. When free-wheeling there is no relationship between the +passage of real wall-clock time and the passage of time in the data being +processed. + +"""^^lv2:Markdown . + +lv2:enabled + lv2:documentation """ + +If this value is greater than zero, the plugin processes normally. If this +value is zero, the plugin is expected to bypass all signals unmodified. The +plugin must provide a click-free transition between the enabled and disabled +(bypassed) states. + +Values less than zero are reserved for future use (such as click-free +insertion/removal of latent plugins), and should be treated like zero +(bypassed) by current implementations. + +"""^^lv2:Markdown . + +lv2:control + lv2:documentation """ + +This should be used as the lv2:designation of ports that are used to send +commands and receive responses. Typically this will be an event port that +supports some protocol, for example MIDI or LV2 Atoms. + +"""^^lv2:Markdown . + +lv2:Point + lv2:documentation """ + + * A Point MUST have at least one rdfs:label which is a string. + + * A Point MUST have exactly one rdf:value with a type that is compatible with + the type of the corresponding Port. + +"""^^lv2:Markdown . + +lv2:default + lv2:documentation """ + +The host SHOULD set the port to this value initially, and in any situation +where the port value should be cleared or reset. + +"""^^lv2:Markdown . + +lv2:minimum + lv2:documentation """ + +This is a soft limit: the plugin is required to gracefully accept all values in +the range of a port's data type. + +"""^^lv2:Markdown . + +lv2:maximum + lv2:documentation """ + +This is a soft limit: the plugin is required to gracefully accept all values in +the range of a port's data type. + +"""^^lv2:Markdown . + +lv2:optionalFeature + lv2:documentation """ + +To support this feature, the host MUST pass its URI and any additional data to +the plugin in LV2_Descriptor::instantiate(). + +The plugin MUST NOT fail to instantiate if an optional feature is not supported +by the host. + +"""^^lv2:Markdown . + +lv2:requiredFeature + lv2:documentation """ + +To support this feature, the host MUST pass its URI and any additional data to +the plugin in LV2_Descriptor::instantiate(). + +The host MUST check this property before attempting to instantiate a plugin, +and not attempt to instantiate plugins which require features it does not +support. The plugin MUST fail to instantiate if a required feature is not +supported by the host. Note that these rules are intentionally redundant for +resilience: neither host nor plugin should assume that the other does not +violate them. + +"""^^lv2:Markdown . + +lv2:ExtensionData + lv2:documentation """ + +This is additional data that a plugin may return from +LV2_Descriptor::extension_data(). This is generally used to add APIs to extend +that defined by LV2_Descriptor. + +"""^^lv2:Markdown . + +lv2:extensionData + lv2:documentation """ + +If a plugin has a value for this property, it must be a URI that defines the +extension data. The plugin should return the appropriate data when +LV2_Descriptor::extension_data() is called with that URI as a parameter. + +"""^^lv2:Markdown . + +lv2:isLive + lv2:documentation """ + +This feature is for plugins that have time-sensitive internals, for example +communicating in real time over a socket. It indicates to the host that its +input and output must not be cached or subject to significant latency, and that +calls to LV2_Descriptor::run() should be made at a rate that roughly +corresponds to wall clock time (according to the `sample_count` parameter). + +Note that this feature is not related to hard real-time execution +requirements (see lv2:hardRTCapable). + +"""^^lv2:Markdown . + +lv2:inPlaceBroken + lv2:documentation """ + +This feature indicates that the plugin may not work correctly if the host +elects to use the same data location for both input and output. Plugins that +will fail to work correctly if ANY input port is connected to the same location +as ANY output port MUST require this feature. Doing so should be avoided +whenever possible since it prevents hosts from running the plugin on data +in-place. + +"""^^lv2:Markdown . + +lv2:hardRTCapable + lv2:documentation """ + +This feature indicates that the plugin is capable of running in a hard +real-time environment. This should be the case for most audio processors, +so most plugins are expected to have this feature. + +To support this feature, plugins MUST adhere to the following in all of their +audio class functions (LV2_Descriptor::run() and +LV2_Descriptor::connect_port()): + + * There is no use of `malloc()`, `free()` or any other heap memory management + functions. + + * There is no use of any library functions which do not adhere to these + rules. The plugin may assume that the standard C math library functions + are safe. + + * There is no access to files, devices, pipes, sockets, system calls, or any + other mechanism that might result in the process or thread blocking. + + * The maximum amount of time for a `run()` call is bounded by some expression + of the form `A + B * sample_count`, where `A` and `B` are platform specific + constants. Note that this bound does not depend on input signals or plugin + state. + +"""^^lv2:Markdown . + +lv2:portProperty + lv2:documentation """ + +States that a port has a particular lv2:PortProperty. This may be ignored +without catastrophic effects, though it may be useful, for example to provide a +sensible user interface for the port. + +"""^^lv2:Markdown . + +lv2:connectionOptional + lv2:documentation """ + +This property means that the port does not have to be connected to valid data +by the host. To leave a port unconnected, the host MUST explicitly +connect the port to `NULL`. + +"""^^lv2:Markdown . + +lv2:reportsLatency + lv2:documentation """ + +This property indicates that the port is used to express the processing latency +incurred by the plugin, expressed in samples. The latency may be affected by +the current sample rate, plugin settings, or other factors, and may be changed +by the plugin at any time. Where the latency is frequency dependent the plugin +may choose any appropriate value. If a plugin introduces latency it MUST +provide EXACTLY ONE port with this property set. In fuzzy cases the +value should be the most reasonable one based on user expectation of +input/output alignment. For example, musical delay plugins should not report +their delay as latency, since it is an intentional effect that the host should +not compensate for. + +This property is deprecated, use a lv2:designation of lv2:latency instead, +following the same rules as above: + + :::turtle + + lv2:port [ + a lv2:OutputPort , lv2:ControlPort ; + lv2:designation lv2:latency ; + lv2:symbol "latency" ; + ] + +"""^^lv2:Markdown . + +lv2:toggled + lv2:documentation """ + +Indicates that the data item should be considered a boolean toggle. Data less +than or equal to zero should be considered off or false, and data +above zero should be considered on or true. + +"""^^lv2:Markdown . + +lv2:sampleRate + lv2:documentation """ + +Indicates that any specified bounds should be interpreted as multiples of the +sample rate. For example, a frequency range from 0 Hz to the Nyquist frequency +(half the sample rate) can be specified by using this property with lv2:minimum +0.0 and lv2:maximum 0.5. Hosts that support bounds at all MUST support this +property. + +"""^^lv2:Markdown . + +lv2:integer + lv2:documentation """ + +Indicates that all the reasonable values for a port)lv2ttl" R"lv2ttl( are integers. For such +ports, a user interface should provide a stepped control that only allows +choosing integer values. + +Note that this is only a hint, and that the plugin MUST operate reasonably even +if such a port has a non-integer value. + +"""^^lv2:Markdown . + +lv2:enumeration + lv2:documentation """ + +Indicates that all the rasonable values for a port are defined by +lv2:scalePoint properties. For such ports, a user interface should provide a selector that allows the user to choose any of the scale point values by name. It is recommended to show the value as well if possible. + +Note that this is only a hint, and that the plugin MUST operate reasonably even +if such a port has a value that does not correspond to a scale point. + +"""^^lv2:Markdown . + +lv2:isSideChain + lv2:documentation """ + +Indicates that a port is a sidechain, which affects the output somehow +but should not be considered a part of the main signal chain. Sidechain ports +SHOULD be lv2:connectionOptional, and may be ignored by hosts. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"lv2core.ttl", +R"lv2ttl(@prefix doap: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2" ; + rdfs:comment "An extensible open standard for audio plugins." ; + rdfs:seeAlso , + , + . + +lv2:Specification + a rdfs:Class , + owl:Class ; + rdfs:subClassOf doap:Project ; + rdfs:label "Specification" ; + rdfs:comment "An LV2 specifiation." . + +lv2:Markdown + a rdfs:Datatype ; + owl:onDatatype xsd:string ; + rdfs:label "Markdown" ; + rdfs:comment "A string in Markdown syntax." . + +lv2:documentation + a rdf:Property , + owl:AnnotationProperty ; + rdfs:range rdfs:Literal ; + rdfs:label "documentation" ; + rdfs:comment "Extended documentation." ; + rdfs:seeAlso . + +lv2:PluginBase + a rdfs:Class , + owl:Class ; + rdfs:label "Plugin Base" ; + rdfs:comment "Base class for a plugin-like resource." . + +lv2:Plugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:PluginBase ; + rdfs:label "Plugin" ; + rdfs:comment "An LV2 plugin." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty doap:name ; + owl:someValuesFrom rdf:PlainLiteral ; + rdfs:comment "A plugin MUST have at least one untranslated doap:name." + ] , [ + a owl:Restriction ; + owl:onProperty lv2:port ; + owl:allValuesFrom lv2:Port ; + rdfs:comment "All ports on a plugin MUST be fully specified lv2:Port instances." + ] . + +lv2:PortBase + a rdfs:Class , + owl:Class ; + rdfs:label "Port Base" ; + rdfs:comment "Base class for a port-like resource." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:symbol ; + owl:cardinality 1 ; + rdfs:comment "A port MUST have exactly one lv2:symbol." + ] . + +lv2:Port + a rdfs:Class , + owl:Class ; + rdfs:label "Port" ; + rdfs:comment "An LV2 plugin port." ; + rdfs:subClassOf lv2:PortBase , + [ + a owl:Restriction ; + owl:onProperty lv2:name ; + owl:minCardinality 1 ; + rdfs:comment "A port MUST have at least one lv2:name." + ] . + +lv2:InputPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Input Port" ; + rdfs:comment "A port connected to constant data which is read during `run()`." . + +lv2:OutputPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Output Port" ; + rdfs:comment "A port connected to data which is written during `run()`." . + +lv2:ControlPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Control Port" ; + rdfs:comment "A port connected to a single `float`." . + +lv2:AudioPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Audio Port" ; + rdfs:comment "A port connected to an array of float audio samples." . + +lv2:CVPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "CV Port" ; + rdfs:comment "A port connected to an array of float control values." . + +lv2:port + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:PluginBase ; + rdfs:range lv2:PortBase ; + rdfs:label "port" ; + rdfs:comment "A port (input or output) on this plugin." . + +lv2:project + a rdf:Property , + owl:ObjectProperty ; + rdfs:range doap:Project ; + rdfs:label "project" ; + rdfs:comment "The project this is a part of." . + +lv2:prototype + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "prototype" ; + rdfs:comment "The prototype to inherit properties from." . + +lv2:minorVersion + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "minor version" ; + rdfs:comment "The minor version of this resource." . + +lv2:microVersion + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "micro version" ; + rdfs:comment "The micro version of this resource." . + +lv2:binary + a rdf:Property , + owl:ObjectProperty ; + rdfs:range owl:Thing ; + rdfs:label "binary" ; + rdfs:comment "The binary of this resource." . + +lv2:appliesTo + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:Plugin ; + rdfs:label "applies to" ; + rdfs:comment "The plugin this resource is related to." . + +lv2:index + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:range xsd:unsignedInt ; + rdfs:label "index" ; + rdfs:comment "A non-negative zero-based 32-bit index." . + +lv2:Symbol + a rdfs:Datatype ; + owl:onDatatype xsd:string ; + owl:withRestrictions ( + [ + xsd:pattern "[_a-zA-Z][_a-zA-Z0-9]*" + ] + ) ; + rdfs:label "Symbol" ; + rdfs:comment "A short restricted name used as a strong identifier." . + +lv2:symbol + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "symbol" ; + rdfs:range lv2:Symbol , + rdf:PlainLiteral ; + rdfs:comment "The symbol that identifies this resource in the context of its parent." . + +lv2:name + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "name" ; + rdfs:range xsd:string ; + rdfs:comment "A display name for labeling in a user interface." . + +lv2:shortName + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "short name" ; + rdfs:range xsd:string ; + rdfs:comment "A short display name for labeling in a user interface." . + +lv2:Designation + a rdfs:Class , + owl:Class ; + rdfs:subClassOf rdf:Property ; + rdfs:label "Designation" ; + rdfs:comment "A designation which defines the meaning of some data." . + +lv2:Channel + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Designation ; + rdfs:label "Channel" ; + rdfs:comment "An individual channel, such as left or right." . + +lv2:Parameter + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Designation , + rdf:Property ; + rdfs:label "Parameter" ; + rdfs:comment "A property that is a plugin parameter." . + +lv2:designation + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:range rdf:Property ; + rdfs:label "designation" ; + rdfs:comment "The designation that defines the meaning of this input or output." . + +lv2:latency + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "latency" ; + rdfs:comment "The latency introduced, in frames." . + +lv2:freeWheeling + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "free-wheeling" ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether processing is currently free-wheeling." . + +lv2:enabled + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "enabled" ; + rdfs:range xsd:int ; + rdfs:comment "Whether processing is currently enabled (not bypassed)." . + +lv2:control + a lv2:Channel ; + rdfs:label "control" ; + rdfs:comment "The primary control channel." . + +lv2:Point + a rdfs:Class , + owl:Class ; + rdfs:label "Point" ; + rdfs:comment "An interesting point in a value range." . + +lv2:ScalePoint + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Point ; + rdfs:label "Scale Point" ; + rdfs:comment "A single `float` Point for control inputs." . + +lv2:scalePoint + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:ScalePoint ; + rdfs:label "scale point" ; + rdfs:comment "A scale point of a port or parameter." . + +lv2:default + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "default" ; + rdfs:comment "The default value for this control." . + +lv2:minimum + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "minimum" ; + rdfs:comment "The minimum value for this control." . + +lv2:maximum + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "maximum" ; + rdfs:comment "The maximum value for this control." . + +lv2:Feature + a rdfs:Class , + owl:Class ; + rdfs:label "Feature" ; + rdfs:comment "An additional feature which may be used or required." . + +lv2:optionalFeature + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:Feature ; + rdfs:label "optional feature" ; + rdfs:comment "An optional feature that is supported if available." . + +lv2:requiredFeature + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:Feature ; + rdfs:label "required feature" ; + rdfs:comment "A requir)lv2ttl" R"lv2ttl(ed feature that must be available to run." . + +lv2:ExtensionData + a rdfs:Class , + owl:Class ; + rdfs:label "Extension Data" ; + rdfs:comment "Additional data defined by an extension." . + +lv2:extensionData + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:ExtensionData ; + rdfs:label "extension data" ; + rdfs:comment "Extension data provided by a plugin or other binary." . + +lv2:isLive + a lv2:Feature ; + rdfs:label "is live" ; + rdfs:comment "Plugin has a real-time dependency." . + +lv2:inPlaceBroken + a lv2:Feature ; + rdfs:label "in-place broken" ; + rdfs:comment "Plugin requires separate locations for input and output." . + +lv2:hardRTCapable + a lv2:Feature ; + rdfs:label "hard real-time capable" ; + rdfs:comment "Plugin is capable of running in a hard real-time environment." . + +lv2:PortProperty + a rdfs:Class , + owl:Class ; + rdfs:label "Port Property" ; + rdfs:comment "A particular property that a port has." . + +lv2:portProperty + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:Port ; + rdfs:range lv2:PortProperty ; + rdfs:label "port property" ; + rdfs:comment "A property of this port hosts may find useful." . + +lv2:connectionOptional + a lv2:PortProperty ; + rdfs:label "connection optional" ; + rdfs:comment "The property that this port may be connected to NULL." . + +lv2:reportsLatency + a lv2:PortProperty ; + owl:deprecated "true"^^xsd:boolean ; + rdfs:label "reports latency" ; + rdfs:comment "Control port value is the plugin latency in frames." . + +lv2:toggled + a lv2:PortProperty ; + rdfs:label "toggled" ; + rdfs:comment "Control port value is considered a boolean toggle." . + +lv2:sampleRate + a lv2:PortProperty ; + rdfs:label "sample rate" ; + rdfs:comment "Control port bounds are interpreted as multiples of the sample rate." . + +lv2:integer + a lv2:PortProperty ; + rdfs:label "integer" ; + rdfs:comment "Control port values are treated as integers." . + +lv2:enumeration + a lv2:PortProperty ; + rdfs:label "enumeration" ; + rdfs:comment "Control port scale points represent all useful values." . + +lv2:isSideChain + a lv2:PortProperty ; + rdfs:label "is side-chain" ; + rdfs:comment "Signal for port should not be considered a main input or output." . + +lv2:GeneratorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Generator Plugin" ; + rdfs:comment "A plugin that generates new sound internally." . + +lv2:InstrumentPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Instrument Plugin" ; + rdfs:comment "A plugin intended to be played as a musical instrument." . + +lv2:OscillatorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Oscillator Plugin" ; + rdfs:comment "A plugin that generates output with an oscillator." . + +lv2:UtilityPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Utility Plugin" ; + rdfs:comment "A utility plugin that is not a typical audio effect or generator." . + +lv2:ConverterPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Converter Plugin" ; + rdfs:comment "A plugin that converts its input into a different form." . + +lv2:AnalyserPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Analyser Plugin" ; + rdfs:comment "A plugin that analyses its input and emits some useful information." . + +lv2:MixerPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Mixer Plugin" ; + rdfs:comment "A plugin that mixes some number of inputs into some number of outputs." . + +lv2:SimulatorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Simulator Plugin" ; + rdfs:comment "A plugin that aims to emulate some environmental effect or musical equipment." . + +lv2:DelayPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Delay Plugin" ; + rdfs:comment "An effect that intentionally delays its input as an effect." . + +lv2:ModulatorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Modulator Plugin" ; + rdfs:comment "An effect that modulats its input as an effect." . + +lv2:ReverbPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin , + lv2:SimulatorPlugin , + lv2:DelayPlugin ; + rdfs:label "Reverb Plugin" ; + rdfs:comment "An effect that adds reverberation to its input." . + +lv2:PhaserPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Phaser Plugin" ; + rdfs:comment "An effect that periodically sweeps a filter over its input." . + +lv2:FlangerPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Flanger Plugin" ; + rdfs:comment "An effect that mixes slightly delayed copies of its input." . + +lv2:ChorusPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Chorus Plugin" ; + rdfs:comment "An effect that mixes significantly delayed copies of its input." . + +lv2:FilterPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Filter Plugin" ; + rdfs:comment "An effect that manipulates the frequency spectrum of its input." . + +lv2:LowpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Lowpass Filter Plugin" ; + rdfs:comment "A filter that attenuates frequencies above some cutoff." . + +lv2:BandpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Bandpass Filter Plugin" ; + rdfs:comment "A filter that attenuates frequencies outside of some band." . + +lv2:HighpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Highpass Filter Plugin" ; + rdfs:comment "A filter that attenuates frequencies below some cutoff." . + +lv2:CombPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Comb FilterPlugin" ; + rdfs:comment "A filter that adds a delayed version of its input to itself." . + +lv2:AllpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Allpass Plugin" ; + rdfs:comment "A filter that changes the phase relationship between frequency components." . + +lv2:EQPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Equaliser Plugin" ; + rdfs:comment "A plugin that adjusts the balance between frequency components." . + +lv2:ParaEQPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:EQPlugin ; + rdfs:label "Parametric EQ Plugin" ; + rdfs:comment "A plugin that adjusts the balance between configurable frequency components." . + +lv2:MultiEQPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:EQPlugin ; + rdfs:label "Multiband EQ Plugin" ; + rdfs:comment "A plugin that adjusts the balance between a fixed set of frequency components." . + +lv2:SpatialPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Spatial Plugin" ; + rdfs:comment "A plugin that manipulates the position of audio in space." . + +lv2:SpectralPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Spectral Plugin" ; + rdfs:comment "A plugin that alters the spectral properties of audio." . + +lv2:PitchPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:SpectralPlugin ; + rdfs:label "Pitch Shifter Plugin" ; + rdfs:comment "A plugin that shifts the pitch of its input." . + +lv2:AmplifierPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Amplifier Plugin" ; + rdfs:comment "A plugin that primarily changes the volume of its input." . + +lv2:EnvelopePlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Envelope Plugin" ; + rdfs:comment "A plugin that applies an envelope to its input." . + +lv2:DistortionPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Distortion Plugin" ; + rdfs:comment "A plugin that adds distortion to its input." . + +lv2:WaveshaperPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DistortionPlugin ; + rdfs:label "Waveshaper Plugin" ; + rdfs:comment "An effect that alters t)lv2ttl" R"lv2ttl(he shape of input waveforms." . + +lv2:DynamicsPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Dynamics Plugin" ; + rdfs:comment "A plugin that alters the envelope or dynamic range of its input." . + +lv2:CompressorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Compressor Plugin" ; + rdfs:comment "A plugin that reduces the dynamic range of its input." . + +lv2:ExpanderPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Expander Plugin" ; + rdfs:comment "A plugin that expands the dynamic range of its input." . + +lv2:LimiterPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Limiter Plugin" ; + rdfs:comment "A plugin that limits its input to some maximum level." . + +lv2:GatePlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Gate Plugin" ; + rdfs:comment "A plugin that attenuates signals below some threshold." . + +lv2:FunctionPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Function Plugin" ; + rdfs:comment "A plugin whose output is a mathmatical function of its input." . + +lv2:ConstantPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Constant Plugin" ; + rdfs:comment "A plugin that emits constant values." . + +lv2:MIDIPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "MIDI Plugin" ; + rdfs:comment "A plugin that primarily processes MIDI messages." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"port-props", +{ +juce::lv2::BundleResource +{ +"port-props.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix pprops: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Port Properties" ; + rdfs:comment "Various properties for LV2 plugin ports." ; + rdfs:seeAlso . + +pprops:trigger + a lv2:PortProperty ; + rdfs:label "trigger" ; + rdfs:comment "Port is a momentary trigger." . + +pprops:supportsStrictBounds + a lv2:Feature ; + rdfs:label "supports strict bounds" ; + rdfs:comment "A feature indicating plugin support for strict port bounds." . + +pprops:hasStrictBounds + a lv2:PortProperty ; + rdfs:label "has strict bounds" ; + rdfs:comment "Port has strict bounds which are not internally clamped." . + +pprops:expensive + a lv2:PortProperty ; + rdfs:label "changes are expensive" ; + rdfs:comment "Input port is expensive to change." . + +pprops:causesArtifacts + a lv2:PortProperty ; + rdfs:label "changes cause artifacts" ; + rdfs:comment "Input port causes audible artifacts when changed." . + +pprops:continuousCV + a lv2:PortProperty ; + rdfs:label "smooth modulation signal" ; + rdfs:comment "Port carries a smooth modulation signal." . + +pprops:discreteCV + a lv2:PortProperty ; + rdfs:label "discrete modulation signal" ; + rdfs:comment "Port carries a discrete modulation signal." . + +pprops:logarithmic + a lv2:PortProperty ; + rdfs:label "logarithmic" ; + rdfs:comment "Port value is logarithmic." . + +pprops:notAutomatic + a lv2:PortProperty ; + rdfs:label "not automatic" ; + rdfs:comment "Port that is not intended to be fed with a modulation signal." . + +pprops:notOnGUI + a lv2:PortProperty ; + rdfs:label "not on GUI" ; + rdfs:comment "Port that should not be displayed on a GUI." . + +pprops:displayPriority + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "display priority" ; + rdfs:comment "A priority ranking this port in importance to its plugin." . + +pprops:rangeSteps + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "range steps" ; + rdfs:comment "The number of even steps the range should be divided into." . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"port-props.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pprops: . +@prefix rdf: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Port Properties" ; + doap:created "2009-01-01" ; + doap:shortdesc "Various properties for LV2 plugin ports." ; + doap:maintainer ; + doap:developer ; + doap:release [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This vocabulary defines various properties for plugin ports, which can be used +to better describe how a plugin can be controlled. Using this metadata, hosts +can build better UIs for plugins, and provide more advanced automatic +functionality. + +"""^^lv2:Markdown . + +pprops:trigger + lv2:documentation """ + +Indicates that the data item corresponds to a momentary event that has been +detected (control output ports) or is to be triggered (control input ports). +For input ports, the port needs to be reset to lv2:default value after run() +function of the plugin has returned. If the control port is assigned a GUI +widget by the host, the widget should be of auto-off (momentary, one-shot) type +- for example, a push button if the port is also declared as lv2:toggled, or a +series of push button or auto-clear input box with a "Send" button if the port +is also lv2:integer. + +"""^^lv2:Markdown . + +pprops:supportsStrictBounds + lv2:documentation """ + +Indicates use of host support for pprops:hasStrictBounds port property. A +plugin that specifies it as optional feature can omit value clamping for +hasStrictBounds ports, if the feature is supported by the host. When specified +as required feature, it indicates that the plugin does not do any clamping for +input ports that have a pprops:hasStrictBounds property. + +"""^^lv2:Markdown . + +pprops:hasStrictBounds + lv2:documentation """ + +For hosts that support pprops:supportsStrictBounds, this indicates that the +value of the port should never exceed the port's minimum and maximum control +points. For input ports, it moves the responsibility for limiting the range of +values to host, if it supports pprops:supportsStrictBounds. For output ports, +it indicates that values within specified range are to be expected, and +breaking that should be considered by the host as error in plugin +implementation. + +"""^^lv2:Markdown . + +pprops:expensive + lv2:documentation """ + +Input ports only. Indicates that any changes to the port value may trigger +expensive background calculation (for example, regeneration of lookup tables in +a background thread). Any value changes may have not have immediate effect, or +may cause silence or diminished-quality version of the output until background +processing is finished. Ports having this property are typically not well +suited for connection to outputs of other plugins, and should not be offered as +connection targets or for automation by default. + +"""^^lv2:Markdown . + +pprops:causesArtifacts + lv2:documentation """ + +Input ports only. Indicates that any changes to the port value may produce +slight artifacts to produced audio signals (zipper noise and other results of +signal discontinuities). Connecting ports of this type to continuous signals +is not recommended, and when presenting a list of automation targets, those +ports may be marked as artifact-producing. + +"""^^lv2:Markdown . + +pprops:continuousCV + lv2:documentation """ + +Indicates that the port carries a "smooth" modulation signal. Control input +ports of this type are well-suited for being connected to sources of smooth +signals (knobs with smoothing, modulation rate oscillators, output ports with +continuousCV type, etc.). Typically, the plugin with ports which have this +property will implement appropriate smoothing to avoid audio artifacts. For +output ports, this property suggests the value of the port is likely to change +frequently, and describes a smooth signal (so successive values may be +considered points along a curve). + +"""^^lv2:Markdown . + +pprops:discreteCV + lv2:documentation """ + +Indicates that the port carries a "discrete" modulation signal. Input ports of +this type are well-suited for being connected to sources of discrete signals +(switches, buttons, classifiers, event detectors, etc.). May be combined with +pprops:trigger property. For output ports, this property suggests the value of +the port describe discrete values that should be interpreted as steps (and not +points along a curve). + +"""^^lv2:Markdown . + +pprops:logarithmic + lv2:documentation """ + +Indicates that port value behaviour within specified range (bounds) is a value +using logarithmic scale. The lower and upper bounds must be specified, and +must be of the same sign. + +"""^^lv2:Markdown . + +pprops:notAutomatic + lv2:documentation """ + +Indicates that the port is not primarily intended to be fed with modulation +signals from external sources (other plugins, etc.). It is merely a UI hint +and hosts may allow the user to override it. + +"""^^lv2:Markdown . + +pprops:notOnGUI + lv2:documentation """ + +Indicates that the port is not primarily intended to be represented by a +separate control in the user interface window (or any similar mechanism used +for direct, immediate control of control ports). It is merely a UI hint and +hosts may allow the user to override it. + +"""^^lv2:Markdown . + +pprops:displayPriority + lv2:documentation """ + +Indicates how important a port is to controlling the plugin. If a host can +only display some ports of a plugin, it should prefer ports with a higher +display priority. Priorities do not need to be unique, and are only meaningful +when compared to each other. + +"""^^lv2:Markdown . + +pprops:rangeSteps + lv2:documentation """ + +This value indicates into how many evenly-divided points the (control) port +range should be divided for step-wise control. This may be used for changing +the value with step-based controllers like arrow keys, mouse wheel, rotary +encoders, and so on. + +Note that when used with a pprops:logarithmic port, the steps are logarithmic +too, and port value can be calculated as: + + :::c + value = lower * pow(upper / lower, step / (steps - 1)) + +and the step from value is: + + :::c + step = (steps - 1) * log(value / lower) / log(upper / lower) + +where: + + * `value` is the port value. + + * `step` is the step number (0..steps). + + * `steps` is the number of steps (= value of :rangeSteps property). + + * `lower` and upper are the bounds. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"midi", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 10 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"midi.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix midi: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 MIDI" ; + doap:shortdesc "A normalised definition of raw MIDI." ; + doap:maintainer ; + doap:created "2006-00-00" ; + doap:developer , + ; + doap:release [ + doap:revision "1.10" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect range of midi:chunk." + ] + ] + ] , [ + doap:revision "1.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add midi:binding and midi:channel predicates." + ] , [ + rdfs:label "Add midi:HexByte datatype for status bytes and masks." + ] , [ + rdfs:label "Remove non-standard midi:Tick message type." + ] , [ + rdfs:label "Add C definitions for message types and standard controllers." + ] , [ + rdfs:label "Fix definition of SystemExclusive status byte." + ] + ] + ] , [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add class definitions for various message types." + ] , [ + rdfs:label "Document how to serialise a MidiEvent to a string." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This specification defines a data type for a MIDI message, midi:MidiEvent, +which is normalised for fast and convenient real-time processing. MIDI is the +Musical Instrument Digital Interface, a ubiquitous binary standard for +controlling digital music devices. + +For plugins that process MIDI (or other situations where MIDI is sent via a +generic transport) the main type defined here, midi:MidiEvent, can be mapped to +an integer and used as the type of an LV2 [Atom](atom.html#Atom) or +[Event](event.html#Event). + +This specification also defines a complete vocabulary for the MIDI standard, +except for standard controller numbers. These descriptions are detailed enough +to express any MIDI message as properties. + +"""^^lv2:Markdown . + +midi:MidiEvent + lv2:documentation """ + +A single raw MIDI message (a sequence of bytes). + +This is equivalent to a standard MIDI messages, except with the following +restrictions to simplify handling: + + * Running status is not allowed, every message must have its own status byte. + + * Note On messages with velocity 0 are not allowed. These messages are + equivalent to Note Off in standard MIDI streams, but here only proper Note + Off messages are allowed. + + * "Realtime messages" (status bytes 0xF8 to 0xFF) are allowed, but may not + occur inside other messages like they can in standard MIDI streams. + + * All messages are complete valid MIDI messages. This means, for example, + that only the first byte in each event (the status byte) may have the + eighth bit set, that Note On and Note Off events are always 3 bytes long, + etc. + +Where messages are communicated, the writer is responsible for writing valid +messages, and the reader may assume that all events are valid. + +If a midi:MidiEvent is serialised to a string, the format should be +xsd:hexBinary, for example: + + :::turtle + [] eg:someEvent "901A01"^^midi:MidiEvent . + +"""^^lv2:Markdown . + +midi:statusMask + lv2:documentation """ + +This is a status byte with the lower nibble set to zero. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"midi.ttl", +R"lv2ttl(@prefix atom: . +@prefix ev: . +@prefix lv2: . +@prefix midi: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 MIDI" ; + rdfs:comment "A normalised definition of raw MIDI." ; + rdfs:seeAlso , + . + +midi:ActiveSense + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Active Sense" ; + rdfs:comment "MIDI active sense message." ; + midi:status "FE"^^xsd:hexBinary . + +midi:Aftertouch + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Aftertouch" ; + rdfs:comment "MIDI aftertouch message." ; + midi:statusMask "A0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:noteNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:pressure + ] . + +midi:Bender + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Bender" ; + rdfs:comment "MIDI bender message." ; + midi:statusMask "E0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 , + 1 ; + midi:property midi:benderValue + ] . + +midi:ChannelPressure + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Channel Pressure" ; + rdfs:comment "MIDI channel pressure message." ; + midi:statusMask "D0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:pressure + ] . + +midi:Chunk + a rdfs:Class ; + rdfs:label "Chunk" ; + rdfs:comment "A sequence of contiguous bytes in a MIDI message." . + +midi:Clock + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Clock" ; + rdfs:comment "MIDI clock message." ; + midi:status "F8"^^xsd:hexBinary . + +midi:Continue + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Continue" ; + rdfs:comment "MIDI continue message." ; + midi:status "FB"^^xsd:hexBinary . + +midi:Controller + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Controller" ; + rdfs:comment "MIDI controller change message." ; + midi:statusMask "B0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:controllerNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:controllerValue + ] . + +midi:HexByte + a rdfs:Datatype ; + owl:onDatatype xsd:hexBinary ; + owl:withRestrictions ( + [ + xsd:maxInclusive "FF" + ] + ) ; + rdfs:label "Hex Byte" ; + rdfs:comment "A hexadecimal byte, which has a value <= FF." . + +midi:MidiEvent + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf ev:Event , + atom:Atom ; + owl:onDatatype xsd:hexBinary ; + rdfs:label "MIDI Message" ; + rdfs:comment "A single raw MIDI message." . + +midi:NoteOff + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Note Off" ; + rdfs:comment "MIDI note off message." ; + midi:statusMask "80"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:noteNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:velocity + ] . + +midi:NoteOn + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Note On" ; + rdfs:comment "MIDI note on message." ; + midi:statusMask "90"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:noteNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:velocity + ] . + +midi:ProgramChange + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Program Change" ; + rdfs:comment "MIDI program change message." ; + midi:statusMask "C0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:programNumber + ] . + +midi:QuarterFrame + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Quarter Frame" ; + rdfs:comment "MIDI quarter frame message." ; + midi:status "F1"^^xsd:hexBinary . + +midi:Reset + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Reset" ; + rdfs:comment "MIDI reset message." ; + midi:status "FF"^^xsd:hexBinary . + +midi:SongPosition + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Song Position" ; + rdfs:comment "MIDI song position pointer message." ; + midi:status "F2"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 , + 1 ; + midi:property midi:songPosition + ] . + +midi:SongSelect + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Song Select" ; + rdfs:comment "MIDI song select message." ; + midi:status "F3"^^xsd:hexBinary . + +midi:Start + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Start" ; + rdfs:comment "MIDI start message." ; + midi:status "FA"^^xsd:hexBinary . + +midi:Stop + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Stop" ; + rdfs:comment "MIDI stop message." ; + midi:status "FC"^^xsd:hexBinary . + +midi:SystemCommon + a rdfs:Class ; + rdfs:subClassOf midi:SystemMessage ; + rdfs:label "System Common" ; + rdfs:comment "MIDI system common message." . + +midi:SystemExclusive + a rdfs:Class ; + rdfs:subClassOf midi:SystemMessage ; + rdfs:label "System Exclusive" ; + rdfs:comment "MIDI system exclusive message." ; + midi:status "F0"^^xsd:hexBinary . + +midi:SystemMessage + a rdfs:Class ; + rdfs:subClassOf midi:MidiEvent ; + rdfs:label "System Message" ; + rdfs:comment "MIDI system message." ; + midi:statusMask "F0"^^xsd:hexBinary . + +midi:SystemRealtime + a rdfs:Class ; + rdfs:subClassOf midi:SystemMessage ; + rdfs:label "System Realtime" ; + rdfs:comment "MIDI system realtime message." . + +midi:TuneRequest + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Tune Request" ; + rdfs:comment "MIDI tune request message." ; + midi:status "F6"^^xsd:hexBinary . + +midi:VoiceMessage + a rdfs:Class ; + rdfs:subClassOf midi:MidiEvent ; + rdfs:label "Voice Message" ; + rdfs:comment "MIDI voice message." ; + midi:statusMask "F0"^^xsd:hexBinary . + +midi:benderValue + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "bender value" ; + rdfs:range xsd:short ; + rdfs:comment "MIDI pitch bender message (-8192 to 8192)." . + +midi:binding + a rdf:Property , + owl:ObjectProperty ; + rdfs:range midi:MidiEvent ; + rdfs:label "binding" ; + rdfs:comment "The MIDI event to bind a parameter to." . + +midi:byteNumber + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "byte number" ; + rdfs:domain midi:Chunk ; + rdfs:range xsd:unsignedByte ; + rdfs:comment "The 0-based index of a byte which is part of this chunk." . + +midi:channel + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "MIDI channel" ; + rdfs:range xsd:unsignedByte ; + rdfs:comment "The channel number of a MIDI message." . + +midi:chunk + a rdf:Property , + owl:ObjectProperty ; + rdfs:range midi:Chunk ; + rdfs:label "MIDI chunk" ; + rdfs:comment "A chunk of a MIDI message." . + +midi:controllerNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "MIDI controller number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a controller (0 to 127)." . + +midi:controllerValue + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "MIDI controller value" ; + rdfs:range xsd:byte ; + rdfs:comment "The value of a controller (0 to 127)." . + +midi:noteNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "note number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a note (0 to 127)." . + +midi:pressure + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "key pressure" ; + rdfs:range xsd:byte ; + rdfs:comment "Key pressure (0 to 127)." . + +midi:programNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "program number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a program (0 to 127)." . + +midi:property + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:label "property" ; + rdfs:domain midi:Chunk ; + rdfs:range rdf:Property ; + rdfs:comment "The property this chunk represents." . + +midi:songNumber + a rdf:Property , + owl:)lv2ttl" R"lv2ttl(DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "song number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a song (0 to 127)." . + +midi:songPosition + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "song position" ; + rdfs:range xsd:short ; + rdfs:comment "Song position in MIDI beats (16th notes) (-8192 to 8192)." . + +midi:status + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "status byte" ; + rdfs:range midi:HexByte ; + rdfs:comment "The exact status byte for a message of this type." . + +midi:statusMask + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "status mask" ; + rdfs:range midi:HexByte ; + rdfs:comment "The status byte for a message of this type on channel 1." . + +midi:velocity + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "velocity" ; + rdfs:range midi:HexByte ; + rdfs:comment "The velocity of a note message (0 to 127)." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"atom", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"atom.meta.ttl", +R"lv2ttl(@prefix atom: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Atom" ; + doap:shortdesc "A generic value container and several data types." ; + doap:license ; + doap:created "2007-00-00" ; + doap:developer ; + doap:release [ + doap:revision "2.2" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2_atom_object_get_typed() for easy type-safe access to object properties." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Deprecate Blank and Resource in favour of just Object." + ] , [ + rdfs:label "Add lv2_atom_forge_is_object_type() and lv2_atom_forge_is_blank() to ease backwards compatibility." + ] , [ + rdfs:label "Add lv2_atom_forge_key() for terser object writing." + ] , [ + rdfs:label "Add lv2_atom_sequence_clear() and lv2_atom_sequence_append_event() helper functions." + ] + ] + ] , [ + doap:revision "1.8" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make lv2_atom_*_is_end() arguments const." + ] + ] + ] , [ + doap:revision "1.6" ; + doap:created "2013-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix crash in forge.h when pushing atoms to a full buffer." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2013-01-27" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix lv2_atom_sequence_end()." + ] , [ + rdfs:label "Remove atom:stringType in favour of owl:onDatatype so generic tools can understand and validate atom literals." + ] , [ + rdfs:label "Improve atom documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix implicit conversions in forge.h that are invalid in C++11." + ] , [ + rdfs:label "Fix lv2_atom_object_next() on 32-bit platforms." + ] , [ + rdfs:label "Add lv2_atom_object_body_get()." + ] , [ + rdfs:label "Fix outdated documentation in forge.h." + ] , [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add LV2_ATOM_CONTENTS_CONST and LV2_ATOM_BODY_CONST." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +An atom:Atom is a simple generic data container for holding any type of Plain +Old Data (POD). An Atom can contain simple primitive types like integers, +floating point numbers, and strings; as well as structured data like lists and +dictionary-like Objects. Since Atoms are POD, they can be easily copied +(for example, with `memcpy()`) anywhere and are suitable for use in real-time +code. + +Every atom starts with an LV2_Atom header, followed by the contents. This +allows code to process atoms without requiring special code for every type of +data. For example, plugins that mutually understand a type can be used +together in a host that does not understand that type, because the host is only +required to copy atoms, not interpret their contents. Similarly, plugins (such +as routers, delays, or data structures) can meaningfully process atoms of a +type unknown to them. + +Atoms should be used anywhere values of various types must be stored or +transmitted. An atom:AtomPort can be used to transmit atoms via ports. An +atom:AtomPort that contains a atom:Sequence can be used for sample accurate +communication of events, such as MIDI. + +### Serialisation + +Each Atom type defines a binary format for use at runtime, but also a +serialisation that is natural to express in Turtle format. Thus, this +specification defines a powerful real-time appropriate data model, as well as a +portable way to serialise any data in that model. This is particularly useful +for inter-process communication, saving/restoring state, and describing values +in plugin data files. + +### Custom Atom Types + +While it is possible to define new Atom types for any binary format, the +standard types defined here are powerful enough to describe almost anything. +Implementations SHOULD build structures out of the types provided here, rather +than define new binary formats (for example, using atom:Object rather than a +new C `struct` type). Host and tool implementations have support for +serialising all standard types, so new binary formats are an implementation +burden which harms interoperabilty. In particular, plugins SHOULD NOT expect +UI communication or state saving with custom binary types to work. In general, +new Atom types should only be defined where absolutely necessary due to +performance reasons and serialisation is not a concern. + +"""^^lv2:Markdown . + +atom:Atom + lv2:documentation """ + +An LV2_Atom has a 32-bit `size` and `type`, followed by a body of `size` bytes. +Atoms MUST be 64-bit aligned. + +All concrete Atom types (subclasses of this class) MUST define a precise binary +layout for their body. + +The `type` field is the URI of an Atom type mapped to an integer. +Implementations SHOULD gracefully pass through, or ignore, atoms with unknown +types. + +All atoms are POD by definition except references, which as a special case have +`type` 0. An Atom MUST NOT contain a Reference. It is safe to copy any +non-reference Atom with a simple `memcpy`, even if the implementation does not +understand `type`. Though this extension reserves the type 0 for references, +the details of reference handling are currently unspecified. A future revision +of this extension, or a different extension, may define how to use non-POD data +and references. Implementations MUST NOT send references to another +implementation unless the receiver is explicitly known to support references +(e.g. by supporting a feature). + +The special case of a null atom with both `type` and `size` 0 is not considered +a reference. + +"""^^lv2:Markdown . + +atom:Chunk + lv2:documentation """ + +This type is used to indicate a certain amount of space is available. For +example, output ports with a variably sized type are connected to a Chunk so +the plugin knows the size of the buffer available for writing. + +The use of a Chunk should be constrained to a local scope, since +interpreting it is impossible without context. However, if serialised to RDF, +a Chunk may be represented directly as an xsd:base64Binary string, for example: + + :::turtle + [] eg:someChunk "vu/erQ=="^^xsd:base64Binary . + +"""^^lv2:Markdown . + +atom:String + lv2:documentation """ + +The body of an LV2_Atom_String is a C string in UTF-8 encoding, i.e. an array +of bytes (`uint8_t`) terminated with a NULL byte (`'\\0'`). + +This type is for free-form strings, but SHOULD NOT be used for typed data or +text in any language. Use atom:Literal unless translating the string does not +make sense and the string has no meaningful datatype. + +"""^^lv2:Markdown . + +atom:Literal + lv2:documentation """ + +This type is compatible with rdfs:Literal and is capable of )lv2ttl" R"lv2ttl(expressing a +string in any language or a value of any type. A Literal has a +`datatype` and `lang` followed by string data in UTF-8 +encoding. The length of the string data in bytes is `size - +sizeof(LV2_Atom_Literal)`, including the terminating NULL character. The +`lang` field SHOULD be a URI of the form +`http://lexvo.org/id/iso639-3/LANG` or +`http://lexvo.org/id/iso639-1/LANG` where LANG is a 3-character ISO 693-3 +language code, or a 2-character ISO 693-1 language code, respectively. + +A Literal may have a `datatype` or a `lang`, but never both. + +For example, a Literal can be Hello in English: + + :::c + void set_to_hello_in_english(LV2_Atom_Literal* lit) { + lit->atom.type = map(expand("atom:Literal")); + lit->atom.size = 14; + lit->body.datatype = 0; + lit->body.lang = map("http://lexvo.org/id/iso639-1/en"); + memcpy(LV2_ATOM_CONTENTS(LV2_Atom_Literal, lit), + "Hello", + sizeof("Hello")); // Assumes enough space + } + +or a Turtle string: + + :::c + void set_to_turtle_string(LV2_Atom_Literal* lit, const char* ttl) { + lit->atom.type = map(expand("atom:Literal")); + lit->atom.size = 64; + lit->body.datatype = map("http://www.w3.org/2008/turtle#turtle"); + lit->body.lang = 0; + memcpy(LV2_ATOM_CONTENTS(LV2_Atom_Literal, lit), + ttl, + strlen(ttl) + 1); // Assumes enough space + } + +"""^^lv2:Markdown . + +atom:Path + lv2:documentation """ + +A Path is a URI reference with only a path component: no scheme, authority, +query, or fragment. In particular, paths to files in the same bundle may be +cleanly written in Turtle files as a relative URI. However, implementations +may assume any binary Path (e.g. in an event payload) is a valid file path +which can passed to system functions like fopen() directly, without any +character encoding or escape expansion required. + +Any implemenation that creates a Path atom to transmit to another is +responsible for ensuring it is valid. A Path SHOULD always be absolute, unless +there is some mechanism in place that defines a base path. Since this is not +the case for plugin instances, effectively any Path sent to or received from a +plugin instance MUST be absolute. + +"""^^lv2:Markdown . + +atom:URI + lv2:documentation """ + +This is useful when a URI is needed but mapping is inappropriate, for example +with temporary or relative URIs. Since the ability to distinguish URIs from +plain strings is often necessary, URIs MUST NOT be transmitted as atom:String. + +This is not strictly a URI, since UTF-8 is allowed. Escaping and related +issues are the host's responsibility. + +"""^^lv2:Markdown . + +atom:URID + lv2:documentation """ + +A URID is typically generated with the LV2_URID_Map provided by the host . + +"""^^lv2:Markdown . + +atom:Vector + lv2:documentation """ + +A homogeneous series of atom bodies with equivalent type and size. + +An LV2_Atom_Vector is a 32-bit `child_size` and `child_type` followed by `size +/ child_size` atom bodies. + +For example, an atom:Vector containing 42 elements of type atom:Float: + + :::c + struct VectorOf42Floats { + uint32_t size; // sizeof(LV2_Atom_Vector_Body) + (42 * sizeof(float); + uint32_t type; // map(expand("atom:Vector")) + uint32_t child_size; // sizeof(float) + uint32_t child_type; // map(expand("atom:Float")) + float elems[42]; + }; + +Note that it is possible to construct a valid Atom for each element of the +vector, even by an implementation which does not understand `child_type`. + +If serialised to RDF, a Vector SHOULD have the form: + + :::turtle + eg:someVector + a atom:Vector ; + atom:childType atom:Int ; + rdf:value ( + "1"^^xsd:int + "2"^^xsd:int + "3"^^xsd:int + "4"^^xsd:int + ) . + +"""^^lv2:Markdown . + +atom:Tuple + lv2:documentation """ + +The body of a Tuple is simply a series of complete atoms, each aligned to +64 bits. + +If serialised to RDF, a Tuple SHOULD have the form: + + :::turtle + eg:someVector + a atom:Tuple ; + rdf:value ( + "1"^^xsd:int + "3.5"^^xsd:float + "etc" + ) . + +"""^^lv2:Markdown . + +atom:Property + lv2:documentation """ + +An LV2_Atom_Property has a URID `key` and `context`, and an Atom `value`. This +corresponds to an RDF Property, where the key is the predicate +and the value is the object. + +The `context` field can be used to specify a different context for each +property, where this is useful. Otherwise, it may be 0. + +Properties generally only exist as part of an atom:Object. Accordingly, +they will typically be represented directly as properties in RDF (see +atom:Object). If this is not possible, they may be expressed as partial +reified statements, for example: + + :::turtle + eg:someProperty + rdf:predicate eg:theKey ; + rdf:object eg:theValue . + +"""^^lv2:Markdown . + +atom:Object + lv2:documentation """ + +An Object is an atom with a set of properties. This corresponds to an +RDF Resource, and can be thought of as a dictionary with URID keys. + +An LV2_Atom_Object body has a uint32_t `id` and `type`, followed by a series of +atom:Property bodies (LV2_Atom_Property_Body). The LV2_Atom_Object_Body::otype +field is equivalent to a property with key rdf:type, but is included in the +structure to allow for fast dispatching. + +Code SHOULD check for objects using lv2_atom_forge_is_object() or +lv2_atom_forge_is_blank() if a forge is available, rather than checking the +atom type directly. This will correctly handle the deprecated atom:Resource +and atom:Blank types. + +When serialised to RDF, an Object is represented as a resource, for example: + + :::turtle + eg:someObject + eg:firstPropertyKey "first property value" ; + eg:secondPropertyKey "first loser" ; + eg:andSoOn "and so on" . + +"""^^lv2:Markdown . + +atom:Resource + lv2:documentation """ + +This class is deprecated. Use atom:Object directly instead. + +An atom:Object where the id field is a URID, that is, an Object +with a URI. + +"""^^lv2:Markdown . + +atom:Blank + lv2:documentation """ + +This class is deprecated. Use atom:Object with ID 0 instead. + +An atom:Object where the LV2_Atom_Object::id is a blank node ID (NOT a URI). +The ID of a Blank is valid only within the context the Blank appears in. For +ports this is the context of the associated run() call, i.e. all ports share +the same context so outputs can contain IDs that correspond to IDs of blanks in +the input. + +"""^^lv2:Markdown . + +atom:Sound + lv2:documentation """ + +The format of a atom:Sound is the same as the buffer format for lv2:AudioPort +(except the size may be arbitrary). An atom:Sound inherently depends on the +sample rate, which is assumed to be known from context. Because of this, +directly serialising an atom:Sound is probably a bad idea, use a standard +format like WAV instead. + +"""^^lv2:Markdown . + +atom:Event + lv2:documentation """ + +An Event is typically an element of an atom:Sequence. Note that this is not an Atom type since it begins with a timestamp, not an atom header. + +"""^^lv2:Markdown . + +atom:Sequence + lv2:documentation """ + +A flat sequence of atom:Event, that is, a series of time-stamped Atoms. + +LV2_Atom_Sequence_Body.unit describes the time unit for the contained atoms. +If the unit is known from context (e.g. run() stamps are always audio frames), +this field may be zero. Otherwise, it SHOULD be either units:frame or +units:beat, in which case ev.time.frames or ev.time.beats is valid, +respectively. + +If serialised to RDF, a Sequence has a similar form to atom:Vector, but for +brevity the elements may be assumed to be atom:Event, for example: + + :::turtle + eg:someSequence + a atom:Sequence ; + rdf:value ( + [ + atom:frameTime 1 ; + rdf:value "901A01"^^midi:MidiEvent + ] [ + atom:frame)lv2ttl" R"lv2ttl(Time 3 ; + rdf:value "902B02"^^midi:MidiEvent + ] + ) . + +"""^^lv2:Markdown . + +atom:AtomPort + lv2:documentation """ + +Ports of this type are connected to an LV2_Atom with a type specified by +atom:bufferType. + +Output ports with a variably sized type MUST be initialised by the host before +every run() to an atom:Chunk with size set to the available space. The plugin +reads this size to know how much space is available for writing. In all cases, +the plugin MUST write a complete atom (including header) to outputs. However, +to be robust, hosts SHOULD initialise output ports to a safe sentinel (e.g. the +null Atom) before calling run(). + +"""^^lv2:Markdown . + +atom:bufferType + lv2:documentation """ + +Indicates that an AtomPort may be connected to a certain Atom type. A port MAY +support several buffer types. The host MUST NOT connect a port to an Atom with +a type not explicitly listed with this property. The value of this property +MUST be a sub-class of atom:Atom. For example, an input port that is connected +directly to an LV2_Atom_Double value is described like so: + + :::turtle + + lv2:port [ + a lv2:InputPort , atom:AtomPort ; + atom:bufferType atom:Double ; + ] . + +This property only describes the types a port may be directly connected to. It +says nothing about the expected contents of containers. For that, use +atom:supports. + +"""^^lv2:Markdown . + +atom:supports + lv2:documentation """ + +This property is defined loosely, it may be used to indicate that anything +supports an Atom type, wherever that may be useful. It applies +recursively where collections are involved. + +In particular, this property can be used to describe which event types are +expected by a port. For example, a port that receives MIDI events is described +like so: + + :::turtle + + lv2:port [ + a lv2:InputPort , atom:AtomPort ; + atom:bufferType atom:Sequence ; + atom:supports midi:MidiEvent ; + ] . + +"""^^lv2:Markdown . + +atom:eventTransfer + lv2:documentation """ + +Transfer of individual events in a port buffer. Useful as the `format` for a +LV2UI_Write_Function. + +This protocol applies to ports which contain events, usually in an +atom:Sequence. The host must transfer each individual event to the recipient. +The format of the received data is an LV2_Atom, there is no timestamp header. + +"""^^lv2:Markdown . + +atom:atomTransfer + lv2:documentation """ + +Transfer of the complete atom in a port buffer. Useful as the `format` for a +LV2UI_Write_Function. + +This protocol applies to atom ports. The host must transfer the complete atom +contained in the port, including header. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"atom.ttl", +R"lv2ttl(@prefix atom: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . +@prefix units: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:seeAlso , + , + , + ; + rdfs:label "LV2 Atom" ; + rdfs:comment "A generic value container and several data types." . + +atom:cType + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "C type" ; + rdfs:comment "The C type that describes the binary representation of an Atom type." ; + rdfs:domain rdfs:Class ; + rdfs:range lv2:Symbol . + +atom:Atom + a rdfs:Class ; + rdfs:label "Atom" ; + rdfs:comment "Abstract base class for all atoms." ; + atom:cType "LV2_Atom" . + +atom:Chunk + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Chunk" ; + rdfs:comment "A chunk of memory with undefined contents." ; + owl:onDatatype xsd:base64Binary . + +atom:Number + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Number" ; + rdfs:comment "Base class for numeric types." . + +atom:Int + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Int" ; + rdfs:comment "A native `int32_t`." ; + atom:cType "LV2_Atom_Int" ; + owl:onDatatype xsd:int . + +atom:Long + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Long" ; + rdfs:comment "A native `int64_t`." ; + atom:cType "LV2_Atom_Long" ; + owl:onDatatype xsd:long . + +atom:Float + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Float" ; + rdfs:comment "A native `float`." ; + atom:cType "LV2_Atom_Float" ; + owl:onDatatype xsd:float . + +atom:Double + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Double" ; + rdfs:comment "A native `double`." ; + atom:cType "LV2_Atom_Double" ; + owl:onDatatype xsd:double . + +atom:Bool + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Bool" ; + rdfs:comment "An atom:Int where 0 is false and any other value is true." ; + atom:cType "LV2_Atom_Bool" ; + owl:onDatatype xsd:boolean . + +atom:String + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Atom ; + rdfs:label "String" ; + rdfs:comment "A UTF-8 string." ; + atom:cType "LV2_Atom_String" ; + owl:onDatatype xsd:string . + +atom:Literal + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Literal" ; + rdfs:comment "A UTF-8 string literal with optional datatype or language." ; + atom:cType "LV2_Atom_Literal" . + +atom:Path + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:URI ; + owl:onDatatype atom:URI ; + rdfs:label "Path" ; + rdfs:comment "A local file path." . + +atom:URI + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:String ; + owl:onDatatype xsd:anyURI ; + rdfs:label "URI" ; + rdfs:comment "A URI string." . + +atom:URID + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "URID" ; + rdfs:comment "An unsigned 32-bit integer ID for a URI." ; + atom:cType "LV2_Atom_URID" . + +atom:Vector + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Vector" ; + rdfs:comment "A homogeneous sequence of atom bodies with equivalent type and size." ; + atom:cType "LV2_Atom_Vector" . + +atom:Tuple + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Tuple" ; + rdfs:comment "A sequence of atoms with varying type and size." . + +atom:Property + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Property" ; + rdfs:comment "A property of an atom:Object." ; + atom:cType "LV2_Atom_Property" . + +atom:Object + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Object" ; + rdfs:comment "A collection of properties." ; + atom:cType "LV2_Atom_Object" . + +atom:Resource + a rdfs:Class ; + rdfs:subClassOf atom:Object ; + rdfs:label "Resource" ; + rdfs:comment "A named collection of properties with a URI." ; + owl:deprecated "true"^^xsd:boolean ; + atom:cType "LV2_Atom_Object" . + +atom:Blank + a rdfs:Class ; + rdfs:subClassOf atom:Object ; + rdfs:label "Blank" ; + rdfs:comment "An anonymous collection of properties without a URI." ; + owl:deprecated "true"^^xsd:boolean ; + atom:cType "LV2_Atom_Object" . + +atom:Sound + a rdfs:Class ; + rdfs:subClassOf atom:Vector ; + rdfs:label "Sound" ; + rdfs:comment "A atom:Vector of atom:Float which represents an audio waveform." ; + atom:cType "LV2_Atom_Vector" . + +atom:frameTime + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:range xsd:decimal ; + rdfs:label "frame time" ; + rdfs:comment "A time stamp in audio frames." . + +atom:beatTime + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:range xsd:decimal ; + rdfs:label "beat time" ; + rdfs:comment "A time stamp in beats." . + +atom:Event + a rdfs:Class ; + rdfs:label "Event" ; + atom:cType "LV2_Atom_Event" ; + rdfs:comment "An atom with a time stamp prefix in a sequence." . + +atom:Sequence + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Sequence" ; + atom:cType "LV2_Atom_Sequence" ; + rdfs:comment "A sequence of events." . + +atom:AtomPort + a rdfs:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Atom Port" ; + rdfs:comment "A port which contains an atom:Atom." . + +atom:bufferType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain atom:AtomPort ; + rdfs:range rdfs:Class ; + rdfs:label "buffer type" ; + rdfs:comment "An atom type that a port may be connected to." . + +atom:childType + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "child type" ; + rdfs:comment "The type of children in a container." . + +atom:supports + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "supports" ; + rdfs:comment "A supported atom type." ; + rdfs:range rdfs:Class . + +atom:eventTransfer + a ui:PortProtocol ; + rdfs:label "event transfer" ; + rdfs:comment "A port protocol for transferring events." . + +atom:atomTransfer + a ui:PortProtocol ; + rdfs:label "atom transfer" ; + rdfs:comment "A port protocol for transferring atoms." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"buf-size", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"buf-size.meta.ttl", +R"lv2ttl(@prefix bufsz: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Buf Size" ; + doap:shortdesc "Access to, and restrictions on, buffer sizes." ; + doap:created "2012-08-07" ; + doap:developer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2015-09-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add bufsz:nominalBlockLength option." + ] , [ + rdfs:label "Add bufsz:coarseBlockLength feature." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-12-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix typo in bufsz:sequenceSize label." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a facility for plugins to get information about the +block length (the sample_count parameter of LV2_Descriptor::run) and port +buffer sizes, as well as several features which can be used to restrict the +block length. + +This extension defines features and properties but has no special purpose +API of its own. The host provides all the relevant information to the plugin +as [options](options.html). + +To require restrictions on the block length, plugins can require additional +features: bufsz:boundedBlockLength, bufsz:powerOf2BlockLength, and +bufsz:fixedBlockLength. These features are data-only, that is they merely +indicate a restriction and do not carry any data or API. + +"""^^lv2:Markdown . + +bufsz:boundedBlockLength + lv2:documentation """ + +A feature that indicates the host will provide both the bufsz:minBlockLength +and bufsz:maxBlockLength options to the plugin. Plugins that copy data from +audio inputs can require this feature to ensure they know how much space is +required for auxiliary buffers. Note the minimum may be zero, this feature is +mainly useful to ensure a maximum is available. + +All hosts SHOULD support this feature, since it is simple to support and +necessary for any plugins that may need to copy the input. + +"""^^lv2:Markdown . + +bufsz:fixedBlockLength + lv2:documentation """ + +A feature that indicates the host will always call LV2_Descriptor::run() with +the same value for sample_count. This length MUST be provided as the value of +both the bufsz:minBlockLength and bufsz:maxBlockLength options. + +Note that requiring this feature may severely limit the number of hosts capable +of running the plugin. + +"""^^lv2:Markdown . + +bufsz:powerOf2BlockLength + lv2:documentation """ + +A feature that indicates the host will always call LV2_Descriptor::run() with a +power of two sample_count. Note that this feature does not guarantee the value +is the same each call, to guarantee a fixed power of two block length plugins +must require both this feature and bufsz:fixedBlockLength. + +Note that requiring this feature may severely limit the number of hosts capable +of running the plugin. + +"""^^lv2:Markdown . + +bufsz:coarseBlockLength + lv2:documentation """ + +A feature that indicates the plugin prefers coarse, regular block lengths. For +example, plugins that do not implement sample-accurate control use this feature +to indicate that the host should not split the run cycle because controls have +changed. + +Note that this feature is merely a hint, and does not guarantee a fixed block +length. The run cycle may be split for other reasons, and the blocksize itself +may change anytime. + +"""^^lv2:Markdown . + +bufsz:maxBlockLength + lv2:documentation """ + +The maximum block length the host will ever request the plugin to process at +once, that is, the maximum `sample_count` parameter that will ever be passed to +LV2_Descriptor::run(). + +"""^^lv2:Markdown . + +bufsz:minBlockLength + lv2:documentation """ + +The minimum block length the host will ever request the plugin to process at +once, that is, the minimum `sample_count` parameter that will ever be passed to +LV2_Descriptor::run(). + +"""^^lv2:Markdown . + +bufsz:nominalBlockLength + lv2:documentation """ + +The typical block length the host will request the plugin to process at once, +that is, the typical `sample_count` parameter that will be passed to +LV2_Descriptor::run(). This will usually be equivalent, or close to, the +maximum block length, but there are no strong guarantees about this value +whatsoever. Plugins may use this length for optimization purposes, but MUST +NOT assume the host will always process blocks of this length. In particular, +the host MAY process longer blocks. + +"""^^lv2:Markdown . + +bufsz:sequenceSize + lv2:documentation """ + +This should be provided as an option by hosts that support event ports +(including but not limited to MIDI), so plugins have the ability to allocate +auxiliary buffers large enough to copy the input. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"buf-size.ttl", +R"lv2ttl(@prefix bufsz: . +@prefix lv2: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Buf Size" ; + rdfs:comment "Access to, and restrictions on, buffer sizes." ; + rdfs:seeAlso , + . + +bufsz:boundedBlockLength + a lv2:Feature ; + rdfs:label "bounded block length" ; + rdfs:comment "Block length has lower and upper bounds." . + +bufsz:fixedBlockLength + a lv2:Feature ; + rdfs:label "fixed block length" ; + rdfs:comment "Block length never changes." . + +bufsz:powerOf2BlockLength + a lv2:Feature ; + rdfs:label "power of 2 block length" ; + rdfs:comment "Block length is a power of 2." . + +bufsz:coarseBlockLength + a lv2:Feature ; + rdfs:label "coarse block length" ; + rdfs:comment "Plugin prefers coarse block length without buffer splitting." . + +bufsz:maxBlockLength + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "maximum block length" ; + rdfs:comment "Block length has an upper bound." ; + rdfs:range xsd:nonNegativeInteger . + +bufsz:minBlockLength + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "minimum block length" ; + rdfs:comment "Block length has a lower bound." ; + rdfs:range xsd:nonNegativeInteger . + +bufsz:nominalBlockLength + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "nominal block length" ; + rdfs:comment "Typical block length that will most often be processed." ; + rdfs:range xsd:nonNegativeInteger . + +bufsz:sequenceSize + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "sequence size" ; + rdfs:comment "The maximum size of a sequence, in bytes." ; + rdfs:range xsd:nonNegativeInteger . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"morph", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"morph.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix morph: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Morph" ; + doap:shortdesc "Ports that can dynamically change type." ; + doap:created "2012-05-22" ; + doap:developer ; + doap:release [ + doap:revision "1.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines two port types: morph:MorphPort, which has a +host-configurable type, and morph:AutoMorphPort, which may automatically change +type when a MorphPort's type is changed. These ports always have a default +type and work normally work in hosts that are unaware of this extension. Thus, +this extension provides a backwards compatibility mechanism which allows +plugins to use new port types but gracefully fall back to a default type in +hosts that do not support them. + +This extension only defines port types and properties for describing morph +ports. The actual run-time switching is done via the opts:interface API. + +"""^^lv2:Markdown . + +morph:MorphPort + lv2:documentation """ + +Ports of this type MUST have another type which defines the default buffer +format (for example lv2:ControlPort) but can be dynamically changed to a +different type in hosts that support opts:interface. + +The host may change the type of a MorphPort by setting its morph:currentType +with LV2_Options_Interface::set(). If the plugin has any morph:AutoMorphPort +ports, the host MUST check their types after changing any port type since they +may have changed. + +"""^^lv2:Markdown . + +morph:AutoMorphPort + lv2:documentation """ + +Ports of this type MUST have another type which defines the default buffer +format (for example, lv2:ControlPort) but may dynamically change types based on +the configured types of any morph:MorphPort ports on the same plugin instance. + +The type of a port may only change in response to a host call to +LV2_Options_Interface::set(). Whenever any port type on the instance changes, +the host MUST check the type of all morph:AutoMorphPort ports with +LV2_Options_Interface::get() before calling run() again, since they may have +changed. If the type of any port is zero, it means the current configuration +is invalid and the plugin may not be run (unless that port is +lv2:connectionOptional and connected to NULL). + +This is mainly useful for outputs whose type depends on the type of +corresponding inputs. + +"""^^lv2:Markdown . + +morph:supportsType + lv2:documentation """ + +Indicates that a port supports being switched to a certain type. A MorphPort +MUST list each type it supports being switched to in the plugin data using this +property. + +"""^^lv2:Markdown . + +morph:currentType + lv2:documentation """ + +The currently active type of the port. This is for dynamic use as an option +and SHOULD NOT be listed in the static plugin data. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"morph.ttl", +R"lv2ttl(@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix morph: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Morph" ; + rdfs:comment "Ports that can dynamically change type." ; + rdfs:seeAlso , + . + +morph:MorphPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Morph Port" ; + rdfs:comment "A port which can be switched to another type." . + +morph:AutoMorphPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Auto Morph Port" ; + rdfs:comment "A port that can change its type based on that of another." . + +morph:supportsType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain morph:MorphPort ; + rdfs:label "supports type" ; + rdfs:comment "A type that a port supports being switched to." . + +morph:currentType + a rdf:Property , + opts:Option , + owl:ObjectProperty ; + rdfs:domain morph:MorphPort ; + rdfs:label "current type" ; + rdfs:comment "The currently active type of the port." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"state", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 8 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"state.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix state: . + + + a owl:Ontology ; + rdfs:label "LV2 State" ; + rdfs:comment "An interface for LV2 plugins to save and restore state." ; + rdfs:seeAlso , + . + +state:interface + a lv2:ExtensionData ; + rdfs:label "interface" ; + rdfs:comment "A plugin interface for saving and restoring state." . + +state:State + a rdfs:Class ; + rdfs:label "State" ; + rdfs:comment "LV2 plugin state." . + +state:loadDefaultState + a lv2:Feature ; + rdfs:label "load default state" ; + rdfs:comment "A feature indicating that the plugin has default state." . + +state:state + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "state" ; + rdfs:range state:State ; + rdfs:comment "The state of an LV2 plugin instance." . + +state:mapPath + a lv2:Feature ; + rdfs:label "map path" ; + rdfs:comment "A feature for mapping between absolute and abstract file paths." . + +state:makePath + a lv2:Feature ; + rdfs:label "make path" ; + rdfs:comment "A feature for creating new files and directories." . + +state:threadSafeRestore + a lv2:Feature ; + rdfs:label "thread-safe restore" ; + rdfs:comment "A feature indicating support for thread-safe state restoration." . + +state:freePath + a lv2:Feature ; + rdfs:label "free path" ; + rdfs:comment "A feature for freeing paths allocated by the host." . + +state:StateChanged + a rdfs:Class ; + rdfs:label "State Changed" ; + rdfs:comment "A notification that the internal state of the plugin has changed." . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"state.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix state: . + + + a doap:Project ; + doap:created "2010-11-09" ; + doap:name "LV2 State" ; + doap:shortdesc "An interface for LV2 plugins to save and restore state." ; + doap:license ; + doap:developer , + ; + doap:maintainer ; + doap:release [ + doap:revision "2.8" ; + doap:created "2021-01-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix state:StateChanged URI in metadata and documentation." + ] + ] + ] , [ + doap:revision "2.6" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add state:freePath feature." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add state:StateChanged for notification events." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2016-07-31" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add LV2_STATE_ERR_NO_SPACE status flag." + ] , [ + rdfs:label "Add state:threadSafeRestore feature for dropout-free state restoration." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2013-01-16" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add state:loadDefaultState feature so plugins can have their default state loaded without hard-coding default state as a special case." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a simple mechanism that allows hosts to save and restore +a plugin instance's state. The goal is for an instance's state to be +completely described by port values and a simple dictionary. + +The state defined here is conceptually a key:value dictionary, with URI keys +and values of any type. For performance reasons the key and value type are +actually a "URID", a URI mapped to an integer. A single key:value pair is +called a "property". + +This state model is simple yet has many benefits: + + * Both fast and extensible thanks to URID keys. + + * No limitations on possible value types. + + * Easy to serialise in almost any format. + + * Easy to store in a typical "map" or "dictionary" data structure. + + * Elegantly described in Turtle, so state can be described in LV2 data files + (including presets). + + * Does not impose any file formats, data structures, or file system + requirements. + + * Suitable for portable persistent state as well as fast in-memory snapshots. + + * Keys _may_ be well-defined and used meaningfully across several + implementations. + + * State _may_ be dynamic, but plugins are not required to have a dynamic + dictionary data structure available. + +To implement state, the plugin provides a state:interface to the host. To save +or restore, the host calls LV2_State_Interface::save() or +LV2_State_Interface::restore(), passing a callback to be used for handling a +single property. The host is free to implement property storage and retrieval +in any way. + +Since value types are defined by URI, any type is possible. However, a set of +standard types is defined by the [LV2 Atom](atom.html) extension. Use of these +types is recommended. Hosts MUST implement at least +[atom:String](atom.html#String), which is simply a C string. + +### Referring to Files + +Plugins may need to refer to existing files (such as loaded samples) in their +state. This is done by storing the file's path as a property just like any +other value. However, there are some rules which MUST be followed when storing +paths, see state:mapPath for details. Plugins MUST use the type +[atom:Path](atom.html#Path) for all paths in their state. + +Plugins are strongly encouraged to avoid creating files, instead storing all +state as properties. However, occasionally the ability to create files is +necessary. To make this possible, the host can provide the feature +state:makePath which allocates paths for plugin-created files. Plugins MUST +NOT create files in any other locations. + +### Plugin Code Example + + :::c + + /* Namespace for this plugin's keys. This SHOULD be something that could be + published as a document, even if that document does not exist right now. + */ + #define NS_MY "http://example.org/myplugin/schema#" + + #define DEFAULT_GREETING "Hello" + + LV2_Handle + my_instantiate(...) + { + MyPlugin* plugin = ...; + plugin->uris.atom_String = map_uri(LV2_ATOM__String); + plugin->uris.my_greeting = map_uri(NS_MY "greeting"); + plugin->state.greeting = strdup(DEFAULT_GREETING); + return plugin; + } + + LV2_State_Status + my_save(LV2_Handle instance, + LV2_State_Store_Function store, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature *const * features) + { + MyPlugin* plugin = (MyPlugin*)instance; + const char* greeting = plugin->state.greeting; + + store(handle, + plugin->uris.my_greeting, + greeting, + strlen(greeting) + 1, // Careful! Need space for terminator + plugin->uris.atom_String, + LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE); + + return LV2_STATE_SUCCESS; + } + + LV2_State_Status + my_restore(LV2_Handle instance, + LV2_State_Retrieve_Function retrieve, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature *const * features) + { + MyPlugin* plugin = (MyPlugin*)instance; + + size_t size; + uint32_t type; + uint32_t flags; + const char* greeting = retrieve( + handle, plugin->uris.my_greeting, &size, &type, &flags); + + if (greeting) { + free(plugin->state->greeting); + plugin->state->greeting = strdup(greeting); + } else { + plugin->state->greeting = strdup(DEFAULT_GREETING); + } + + return LV2_STATE_SUCCESS; + } + + const void* + my_extension_data(const char* uri) + { + static const LV2_State_Interface state_iface = { my_save, my_restore }; + if (!strcmp(uri, LV2_STATE__interface)) { + return &state_iface; + } + } + +### Host Code Example + + :::c + LV2_State_Status + store_callback(LV2_State_Handle handle, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags) + { + if ((flags & LV2_STATE_IS_POD)) { + // We only care about POD since we're keeping sta)lv2ttl" R"lv2ttl(te in memory only. + // Disk or network use would also require LV2_STATE_IS_PORTABLE. + Map* state_map = (Map*)handle; + state_map->insert(key, Value(copy(value), size, type)); + return LV2_STATE_SUCCESS;; + } else { + return LV2_STATE_ERR_BAD_FLAGS; // Non-POD events are unsupported + } + } + + Map + get_plugin_state(LV2_Handle instance) + { + LV2_State* state = instance.extension_data(LV2_STATE__interface); + + // Request a fast/native/POD save, since we're just copying in memory + Map state_map; + state.save(instance, store_callback, &state_map, + LV2_STATE_IS_POD|LV2_STATE_IS_NATIVE); + + return state_map; + } + +### Extensions to this Specification + +It is likely that other interfaces for working with plugin state will be +developed as needed. This is encouraged, however everything SHOULD work within +the state _model_ defined here. That is, **do not complicate the state +model**. Implementations can assume the following: + + * The current port values and state dictionary completely describe a plugin + instance, at least well enough that saving and restoring will yield an + "identical" instance from the user's perspective. + + * Hosts are not expected to save and/or restore any other attributes of a + plugin instance. + +### The "Property Principle" + +The main benefit of this meaningful state model is that it can double as a +plugin control/query mechanism. For plugins that require more advanced control +than simple control ports, instead of defining a set of commands, define +properties whose values can be set appropriately. This provides both a way to +control and save that state "for free", since there is no need to define +commands _and_ a set of properties for storing their effects. In particular, +this is a good way for UIs to achieve more advanced control of plugins. + +This "property principle" is summed up in the phrase: "Don't stop; set playing +to false". + +This extension does not define a dynamic mechanism for state access and +manipulation. The [LV2 Patch](patch.html) extension defines a generic set of +messages which can be used to access or manipulate properties, and the [LV2 +Atom](atom.html) extension defines a port type and data container capable of +transmitting those messages. + +"""^^lv2:Markdown . + +state:interface + lv2:documentation """ + +A structure (LV2_State_Interface) which contains functions to be called by the +host to save and restore state. In order to support this extension, the plugin +must return a valid LV2_State_Interface from LV2_Descriptor::extension_data() +when it is called with URI LV2_STATE__interface. + +The plugin data file should describe this like so: + + :::turtle + @prefix state: . + + + a lv2:Plugin ; + lv2:extensionData state:interface . + +"""^^lv2:Markdown . + +state:State + lv2:documentation """ + +This type should be used wherever instance state is described. The properties +of a resource with this type correspond directly to the properties of the state +dictionary (except the property that states it has this type). + +"""^^lv2:Markdown . + +state:loadDefaultState + lv2:documentation """ + +This feature indicates that the plugin has default state listed with the +state:state property which should be loaded by the host before running the +plugin. Requiring this feature allows plugins to implement a single state +loading mechanism which works for initialisation as well as restoration, +without having to hard-code default state. + +To support this feature, the host MUST restore the default state after +instantiating the plugin but before calling run(). + +"""^^lv2:Markdown . + +state:state + lv2:documentation """ + +This property may be used anywhere a state needs to be described, for example: + + :::turtle + @prefix eg: . + + + state:state [ + eg:somekey "some value" ; + eg:someotherkey "some other value" ; + eg:favourite-number 2 + ] . + +"""^^lv2:Markdown . + +state:mapPath + lv2:documentation """ + +This feature maps absolute paths to/from abstract paths which are stored +in state. To support this feature a host must pass an LV2_Feature with URI +LV2_STATE__mapPath and data pointed to an LV2_State_Map_Path to the plugin's +LV2_State_Interface methods. + +The plugin MUST map _all_ paths stored in its state (including those inside any +files). This is necessary so that hosts can handle file system references +correctly, for example to share common files, or bundle state for distribution +or archival. + +For example, a plugin may write a path to a state file like so: + + :::c + void write_path(LV2_State_Map_Path* map_path, FILE* myfile, const char* path) + { + char* abstract_path = map_path->abstract_path(map_path->handle, path); + fprintf(myfile, "%s", abstract_path); + free(abstract_path); + } + +Then, later reload the path like so: + + :::c + char* read_path(LV2_State_Map_Path* map_path, FILE* myfile) + { + /* Obviously this is not production quality code! */ + char abstract_path[1024]; + fscanf(myfile, "%s", abstract_path); + return map_path->absolute_path(map_path->handle, abstract_path); + } + +"""^^lv2:Markdown . + +state:makePath + lv2:documentation """ + +This feature allows plugins to create new files and/or directories. To support +this feature the host passes an LV2_Feature with URI LV2_STATE__makePath and +data pointed to an LV2_State_Make_Path to the plugin. The host may make this +feature available only during save by passing it to +LV2_State_Interface::save(), or available any time by passing it to +LV2_Descriptor::instantiate(). If passed to LV2_State_Interface::save(), the +feature MUST NOT be used beyond the scope of that call. + +The plugin is guaranteed a hierarchical namespace unique to that plugin +instance, and may expect the returned path to have the requested path as a +suffix. There is one such namespace, even if the feature is passed to both +LV2_Descriptor::instantiate() and LV2_State_Interface::save(). Beyond this, +the plugin MUST NOT make any assumptions about the returned paths. + +Like any other paths, the plugin MUST map these paths using state:mapPath +before storing them in state. The plugin MUST NOT assume these paths will be +available across a save/restore otherwise, that is, only mapped paths saved to +state are persistent, any other created paths are temporary. + +For example, a plugin may create a file in a subdirectory like so: + + :::c + char* save_myfile(LV2_State_Make_Path* make_path) + { + char* path = make_path->path(make_path->handle, "foo/bar/myfile.txt"); + FILE* myfile = fopen(path, 'w'); + fprintf(myfile, "I am some data"); + fclose(myfile); + return path; + } + +"""^^lv2:Markdown . + +state:threadSafeRestore + lv2:documentation """ + +If a plugin supports this feature, its LV2_State_Interface::restore method is +thread-safe and may be called concurrently with audio class functions. + +To support this feature, the host MUST pass a +[work:schedule](worker.html#schedule) feature to the restore method, which will +be used to complete the state restoration. The usual mechanics of the worker +apply: the host will call the plugin's work method, which emits a response +which is later applied in the audio thread. + +The host is not required to block audio processing while restore() and work() +load the state, so this feature allows state to be restored without dropouts. + +"""^^lv2:Markdown . + +state:freePath + lv2:documentation """ + +This feature provides a function that can be used by plugins to free paths that +were allocated by the host via other state features (state:mapPath and +state:makePath). + +"""^^lv2:Markdown . + +state:StateChanged + lv2:documentation """ + +A notification that the internal state of the plugin has been changed in a way +that the host can not otherwise know about. + +This is a one-way)lv2ttl" R"lv2ttl( notification, intended to be used as the type of an +[Object](atom.html#Object) sent from plugins when necessary. + +Plugins SHOULD emit such an event whenever a change has occurred that would +result in a different state being saved, but not when the host explicity makes +a change which it knows is likely to have that effect, such as changing a +parameter. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"time", +{ +juce::lv2::BundleResource +{ +"time.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix time: . + + + a doap:Project ; + doap:name "LV2 Time" ; + doap:shortdesc "A vocabulary for describing musical time." ; + doap:created "2011-10-05" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Clarify time:beat origin." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2016-07-31" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Define LV2_TIME_PREFIX." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This is a vocabulary for describing a position in time and the speed of time +passage, in both real and musical terms. + +In addition to real time (based on seconds), two units of time are used: +_frames_ and _beats_. A frame is a numbered quantum of time. Frame time is +related to real-time by the _frame rate_ or _sample rate_, +time:framesPerSecond. A beat is a single pulse of musical time. Beat time is +related to real-time by the _tempo_, time:beatsPerMinute. + +Musical time additionally has a _meter_ which describes passage of time in +terms of musical _bars_. A bar is a higher level grouping of beats. The meter +describes how many beats are in one bar. + +"""^^lv2:Markdown . + +time:Position + lv2:documentation """ + +A point in time and/or the speed at which time is passing. A position is both +a point and a speed, which precisely defines a time within a timeline. + +"""^^lv2:Markdown . + +time:Rate + lv2:documentation """ + +The rate of passage of time in terms of one unit with respect to another. + +"""^^lv2:Markdown . + +time:beat + lv2:documentation """ + +This is not the beat within a bar like time:barBeat, but relative to the same +origin as time:bar and monotonically increases unless the transport is +repositioned. + +"""^^lv2:Markdown . + +time:beatUnit + lv2:documentation """ + +Beat unit, the note value that counts as one beat. This is the bottom number +in a time signature: 2 for half note, 4 for quarter note, and so on. + +"""^^lv2:Markdown . + +time:speed + lv2:documentation """ + +The rate of the progress of time as a fraction of normal speed. For example, a +rate of 0.0 is stopped, 1.0 is rolling at normal speed, 0.5 is rolling at half +speed, -1.0 is reverse, and so on. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"time.ttl", +R"lv2ttl(@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix time: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Time" ; + rdfs:comment "A vocabulary for describing musical time." ; + rdfs:seeAlso , + . + +time:Time + a rdfs:Class , + owl:Class ; + rdfs:subClassOf time:Position ; + rdfs:label "Time" ; + rdfs:comment "A point in time in some unit/dimension." . + +time:Position + a rdfs:Class , + owl:Class ; + rdfs:label "Position" ; + rdfs:comment "A point in time and/or the speed at which time is passing." . + +time:Rate + a rdfs:Class , + owl:Class ; + rdfs:subClassOf time:Position ; + rdfs:label "Rate" ; + rdfs:comment "The rate of passage of time." . + +time:position + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:range time:Position ; + rdfs:label "position" ; + rdfs:comment "A musical position." . + +time:barBeat + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:float ; + rdfs:label "beat within bar" ; + rdfs:comment "The beat number within the bar, from 0 to time:beatsPerBar." . + +time:bar + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:long ; + rdfs:label "bar" ; + rdfs:comment "A musical bar or measure." . + +time:beat + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:double ; + rdfs:label "beat" ; + rdfs:comment "The global running beat number." . + +time:beatUnit + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "beat unit" ; + rdfs:comment "The note value that counts as one beat." . + +time:beatsPerBar + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "beats per bar" ; + rdfs:comment "The number of beats in one bar." . + +time:beatsPerMinute + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "beats per minute" ; + rdfs:comment "Tempo in beats per minute." . + +time:frame + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:long ; + rdfs:label "frame" ; + rdfs:comment "A time stamp in audio frames." . + +time:framesPerSecond + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "frames per second" ; + rdfs:comment "Frame rate in frames per second." . + +time:speed + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "speed" ; + rdfs:comment "The rate of the progress of time as a fraction of normal speed." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"units", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 5 ; + lv2:microVersion 12 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"units.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix units: . + + + a doap:Project ; + doap:name "LV2 Units" ; + doap:shortdesc "Units for LV2 values." ; + doap:created "2007-02-06" ; + doap:homepage ; + doap:license ; + doap:release [ + doap:revision "5.12" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix outdated port description in documentation." + ] , [ + rdfs:label "Remove overly restrictive domain from units:unit." + ] + ] + ] , [ + doap:revision "5.10" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix non-existent port type in examples." + ] , [ + rdfs:label "Add lv2:Parameter to domain of units:unit." + ] + ] + ] , [ + doap:revision "5.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Remove units:name in favour of rdfs:label." + ] , [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "5.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add unit for audio frames." + ] , [ + rdfs:label "Add header of URI defines." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "5.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make units.ttl a valid OWL 2 DL ontology." + ] , [ + rdfs:label "Define used but undefined resources (units:name, units:render, units:symbol, units:Conversion, units:conversion, units:prefixConversion, units:to, and units:factor)." + ] , [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "5.2" ; + doap:created "2010-10-05" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] + ] + ] , [ + doap:revision "5.0" ; + doap:created "2010-10-05" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] , [ + rdfs:label "Define used but undefined resources (units:name, units:render, units:symbol, units:Conversion, units:conversion, units:prefixConversion, units:to, and units:factor)." + ] , [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] ; + doap:developer ; + doap:maintainer ; + lv2:documentation """ + +This is a vocabulary for units typically used for control values in audio +processing. + +For example, to say that a gain control is in decibels: + + :::turtle + @prefix units: . + @prefix eg: . + + eg:plugin lv2:port [ + a lv2:ControlPort , lv2:InputPort ; + lv2:index 0 ; + lv2:symbol "gain" ; + lv2:name "Gain" ; + units:unit units:db + ] . + +Using the same form, plugins may also specify one-off units inline, to give +better display hints to hosts: + + :::turtle + eg:plugin lv2:port [ + a lv2:ControlPort , lv2:InputPort ; + lv2:index 0 ; + lv2:symbol "frob" ; + lv2:name "frob level" ; + units:unit [ + a units:Unit ; + rdfs:label "frobnication" ; + units:symbol "fr" ; + units:render "%f f" + ] + ] . + +It is also possible to define conversions between various units, which makes it +possible for hosts to automatically convert between units where possible. The +units defined in this extension include conversion definitions where it makes +sense to do so. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"units.ttl", +R"lv2ttl(@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix units: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Units" ; + rdfs:comment "Units for LV2 values." ; + rdfs:seeAlso , + . + +units:Unit + a rdfs:Class , + owl:Class ; + rdfs:label "Unit" ; + rdfs:comment "A unit for a control value." . + +units:unit + a rdf:Property , + owl:ObjectProperty ; + rdfs:range units:Unit ; + rdfs:label "unit" ; + rdfs:comment "The unit used by the value of a port or parameter." . + +units:render + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "unit format string" ; + rdfs:domain units:Unit ; + rdfs:range xsd:string ; + rdfs:comment """A printf format string for rendering a value (e.g., "%f dB").""" . + +units:symbol + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "unit symbol" ; + rdfs:domain units:Unit ; + rdfs:range xsd:string ; + rdfs:comment """The abbreviated symbol for this unit (e.g., "dB").""" . + +units:Conversion + a rdfs:Class , + owl:Class ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty units:to ; + owl:cardinality 1 ; + rdfs:comment "A conversion MUST have exactly 1 units:to property." + ] ; + rdfs:label "Conversion" ; + rdfs:comment "A conversion from one unit to another." . + +units:conversion + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain units:Unit ; + rdfs:range units:Conversion ; + rdfs:label "conversion" ; + rdfs:comment "A conversion from this unit to another." . + +units:prefixConversion + a rdf:Property , + owl:ObjectProperty ; + rdfs:subPropertyOf units:conversion ; + rdfs:domain units:Unit ; + rdfs:range units:Conversion ; + rdfs:label "prefix conversion" ; + rdfs:comment "A conversion from this unit to another with the same base but a different prefix." . + +units:to + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain units:Conversion ; + rdfs:range units:Unit ; + rdfs:label "conversion target" ; + rdfs:comment "The target unit this conversion converts to." . + +units:factor + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain units:Conversion ; + rdfs:label "conversion factor" ; + rdfs:comment "The factor to multiply the source value by in order to convert to the target unit." . + +units:s + a units:Unit ; + units:conversion [ + units:factor 0.0166666666 ; + units:to units:min + ] ; + rdfs:label "seconds" ; + rdfs:comment "Seconds, the SI base unit for time." ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:ms + ] ; + units:render "%f s" ; + units:symbol "s" . + +units:ms + a units:Unit ; + rdfs:label "milliseconds" ; + rdfs:comment "Milliseconds (thousandths of seconds)." ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:s + ] ; + units:render "%f ms" ; + units:symbol "ms" . + +units:min + a units:Unit ; + units:conversion [ + units:factor 60.0 ; + units:to units:s + ] ; + rdfs:label "minutes" ; + rdfs:comment "Minutes (60s of seconds and 60ths of an hour)." ; + units:render "%f mins" ; + units:symbol "min" . + +units:bar + a units:Unit ; + rdfs:label "bars" ; + rdfs:comment "Musical bars or measures." ; + units:render "%f bars" ; + units:symbol "bars" . + +units:beat + a units:Unit ; + rdfs:label "beats" ; + rdfs:comment "Musical beats." ; + units:render "%f beats" ; + units:symbol "beats" . + +units:frame + a units:Unit ; + rdfs:label "audio frames" ; + rdfs:comment "Audio frames or samples." ; + units:render "%f frames" ; + units:symbol "frames" . + +units:m + a units:Unit ; + units:conversion [ + units:factor 39.37 ; + units:to units:inch + ] ; + rdfs:label "metres" ; + rdfs:comment "Metres, the SI base unit for length." ; + units:prefixConversion [ + units:factor 100 ; + units:to units:cm + ] , [ + units:factor 1000 ; + units:to units:mm + ] , [ + units:factor 0.001 ; + units:to units:km + ] ; + units:render "%f m" ; + units:symbol "m" . + +units:cm + a units:Unit ; + units:conversion [ + units:factor 0.3937 ; + units:to units:inch + ] ; + rdfs:label "centimetres" ; + rdfs:comment "Centimetres (hundredths of metres)." ; + units:prefixConversion [ + units:factor 0.01 ; + units:to units:m + ] , [ + units:factor 10 ; + units:to units:mm + ] , [ + units:factor 0.00001 ; + units:to units:km + ] ; + units:render "%f cm" ; + units:symbol "cm" . + +units:mm + a units:Unit ; + units:conversion [ + units:factor 0.03937 ; + units:to units:inch + ] ; + rdfs:label "millimetres" ; + rdfs:comment "Millimetres (thousandths of metres)." ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:m + ] , [ + units:factor 0.1 ; + units:to units:cm + ] , [ + units:factor 0.000001 ; + units:to units:km + ] ; + units:render "%f mm" ; + units:symbol "mm" . + +units:km + a units:Unit ; + units:conversion [ + units:factor 0.62138818 ; + units:to units:mile + ] ; + rdfs:label "kilometres" ; + rdfs:comment "Kilometres (thousands of metres)." ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:m + ] , [ + units:factor 100000 ; + units:to units:cm + ] , [ + units:factor 1000000 ; + units:to units:mm + ] ; + units:render "%f km" ; + units:symbol "km" . + +units:inch + a units:Unit ; + units:conversion [ + units:factor 0.0254 ; + units:to units:m + ] ; + rdfs:label "inches" ; + rdfs:comment "An inch, defined as exactly 0.0254 metres." ; + units:render "%f\"" ; + units:symbol "in" . + +units:mile + a units:Unit ; + units:conversion [ + units:factor 1609.344 ; + units:to units:m + ] ; + rdfs:label "miles" ; + rdfs:comment "A mile, defined as exactly 1609.344 metres." ; + units:render "%f mi" ; + units:symbol "mi" . + +units:db + a units:Unit ; + rdfs:label "decibels" ; + rdfs:comment "Decibels, a logarithmic relative unit where 0 is unity." ; + units:render "%f dB" ; + units:symbol "dB" . + +units:pc + a units:Unit ; + units:conversion [ + units:factor 0.01 ; + units:to units:coef + ] ; + rdfs:label "percent" ; + rdfs:comment "Percentage, a ratio as a fraction of 100." ; + units:render "%f%%" ; + units:symbol "%" . + +units:coef + a units:Unit ; + units:conversion [ + units:factor 100 ; + units:to units:pc + ] ; + rdfs:label "coefficient" ; + rdfs:comment "A scale coefficient where 1 is unity, or 100 percent." ; + units:render "* %f" ; + units:symbol "" . + +units:hz + a units:Unit ; + rdfs:label "hertz" ; + rdfs:comment "Hertz, or inverse seconds, the SI derived unit for frequency." ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:khz + ] , [ + units:factor 0.000001 ; + units:to units:mhz + ] ; + units:render "%f Hz" ; + units:symbol "Hz" . + +units:khz + a units:Unit ; + rdfs:label "kilohertz" ; + rdfs:comment "Kilohertz (thousands of Hertz)." ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:hz + ] , [ + units:factor 0.001 ; + units:to units:mhz + ] ; + units:render "%f kHz" ; + units:symbol "kHz" . + +units:mhz + a units:Unit ; + rdfs:label "megahertz" ; + rdfs:comment "Megahertz (millions of Hertz)." ; + units:prefixConversion [ + units:factor 1000000 ; + units:to units:hz + ] , [ + units:factor 0.001 ; + units:to units:khz + ] ; + units:render "%f MHz" ; + units:symbol "MHz" . + +units:bpm + a units:Unit ; + rdfs:label "beats per minute" ; + rdfs:comment "Beats Per Minute (BPM), the standard unit for musical tempo." ; + units:prefixConversion [ + units:factor 0.0166666666 ; + units:to units:hz + ] ; + units:render "%f BPM" ; + units:symbol "BPM" . + +units:oct + a units:Unit ; + units:conversion [ + units:factor 12.0 ; + units:to units:semitone12TET + ] ; + rdfs:label "octaves" ; + rdfs:comment "Octaves, relative musical pitch where +1 octave doubles the frequency." ; + units:render "%f octaves" ; + units:symbol "oct" . + +units:cent + a units:Unit ; + units:conversion [ + units:factor 0.01 ; + units:to units:semitone12TET + ] ; + rdfs:label "cents" ; + rdfs:comment "Cents (hundredths of semitones)." ; + units:render "%f ct" ; + units:symbol "ct" . + +units:semitone12TET + a units:Unit ; + units:conversion [ + units:factor 0.083333333 ; + units:to units:oct + ] ; + rdfs:label "semitones" ; + rdfs:comment "A semiton)lv2ttl" R"lv2ttl(e in the 12-tone equal temperament scale." ; + units:render "%f semi" ; + units:symbol "semi" . + +units:degree + a units:Unit ; + rdfs:label "degrees" ; + rdfs:comment "An angle where 360 degrees is one full rotation." ; + units:render "%f deg" ; + units:symbol "deg" . + +units:midiNote + a units:Unit ; + rdfs:label "MIDI note" ; + rdfs:comment "A MIDI note number." ; + units:render "MIDI note %d" ; + units:symbol "note" . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"patch", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 8 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"patch.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix patch: . +@prefix rdfs: . + + + a doap:Project ; + doap:created "2012-02-09" ; + doap:license ; + doap:developer ; + doap:name "LV2 Patch" ; + doap:shortdesc "A protocol for accessing and manipulating properties." ; + doap:release [ + doap:revision "2.8" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect type of patch:sequenceNumber." + ] + ] + ] , [ + doap:revision "2.6" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add patch:accept property." + ] , [ + rdfs:label "Add patch:context property." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Define patch:Get with no subject to implicitly apply to reciever. This can be used by UIs to get an initial description of a plugin." + ] , [ + rdfs:label "Add patch:Copy method." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add patch:sequenceNumber for associating replies with requests." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2013-01-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make patch:Set a compact message for setting one property." + ] , [ + rdfs:label "Add patch:readable and patch:writable for describing available properties." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This is a vocabulary for messages that access and manipulate properties. +It can be used as a dynamic control interface for plugins, +or anything else with a property-based model. + +The key underlying concept here is to control things by manipulating arbitrary properties, +rather than by calling application-specific methods. +This allows implementations to understand what messages do +(at least in a mechanical sense), +which makes things like caching, proxying, or undo relatively straightforward to implement. +Note, however, that this is only conceptual: +there is no requirement to implement a general property store. +Typically, a plugin will understand a fixed set of properties that represent its parameters or other internal state, and ignore everything else. + +This protocol is syntax-agnostic, +and [homoiconic](https://en.wikipedia.org/wiki/Homoiconicity) +in the sense that the messages use the same format as the data they manipulate. +In particular, messages can be serialised as a binary [Object](atom.html#Object) for realtime plugin control, +or as Turtle for saving to a file, +sending over a network, +printing for debugging purposes, +and so on. + +This specification only defines a semantic protocol, +there is no corresponding API. +It can be used with the [Atom](atom.html) extension to control plugins which support message-based parameters as defined by the [Parameters](parameters.html) extension. + +For example, if a plugin defines a `eg:volume` parameter, it can be controlled by the host by sending a patch:Set message to the plugin instance: + + :::turtle + [ + a patch:Set ; + patch:property eg:volume ; + patch:value 11.0 ; + ] + +Similarly, the host could get the current value for this parameter by sending a patch:Get message: + + :::turtle + [ + a patch:Get ; + patch:property eg:volume ; + ] + +The plugin would then respond with the same patch:Set message as above. +In this case, the plugin instance is implicitly the patch:subject, +but a specific subject can also be given for deeper control. + +"""^^lv2:Markdown . + +patch:Copy + lv2:documentation """ + +After this, the destination has the same description as the subject, +and the subject is unchanged. + +It is an error if the subject does not exist, +or if the destination already exists. + +Multiple subjects may be given if the destination is a container, +but the semantics of this case are application-defined. + +"""^^lv2:Markdown . + +patch:Get + lv2:documentation """ + +If a patch:property is given, +then the receiver should respond with a patch:Set message that gives only that property. + +Otherwise, it should respond with a [concise bounded description](http://www.w3.org/Submission/CBD/) in a patch:Put message, +that is, a description that recursively includes any blank node values. + +If a patch:subject is given, then the response should have the same subject. +If no subject is given, then the receiver is implicitly the subject. + +If a patch:request node or a patch:sequenceNumber is given, +then the response should be a patch:Response and have the same property. +If neither is given, then the receiver can respond with a simple patch:Put message. +For example: + + :::turtle + [] + a patch:Get ; + patch:subject eg:something . + +Could result in: + + :::turtle + [] + a patch:Put ; + patch:subject eg:something ; + patch:body [ + eg:name "Something" ; + eg:ratio 1.6180339887 ; + ] . + +"""^^lv2:Markdown . + +patch:Insert + lv2:documentation """ + +If the subject does not exist, it is created. If the subject does already +exist, it is added to. + +This request only adds properties, it never removes them. The user must take +care that multiple values are not set for properties which should only have +one. + +"""^^lv2:Markdown . + +patch:Message + lv2:documentation """ + +This is an abstract base class for all patch messages. Concrete messages are +either a patch:Request or a patch:Response. + +"""^^lv2:Markdown . + +patch:Move + lv2:documentation """ + +After this, the destination has the description that the subject had, and the +subject no longer exists. + +It is an error if the subject does not exist, or if the destination already +exists. + +"""^^lv2:Markdown . + +patch:Patch + lv2:documentation """ + +This method always has at least one subject, and exactly one patch:add and +patch:remove property. The value of patch:add and patch:remove are nodes which +have the properties to add or remove from the subject(s), respectively. The +special value patch:wildcard may be used as the value of a remove property to +remove all properties with the given predicate. For example: + + :::turtle + [] + a patch:Patch ; + patch:subject ; + patch:add [ + eg:name "New name" ; + eg:age 42 ; + ] ; + patch:remove [ + eg:name "Old name" ; + eg:age patch:wildcard ; # Remove all old eg:age properties + ] . + +"""^^lv2:Markdown . + +patch:Put + lv2:documentation """ + +If the subject does not already exist, it is created. If the subject does +already exist, the patch:body is considered an updated version of it, and the +previous version is replaced. + + :::turtle + [] + a patch:Put ; + patch:subject ; + patch:body [ + eg:name "New name" ; + eg:age 42 ; + ] . + +"""^^lv2:Markdown . + +patch:Request + a rdfs:Class ; + rdfs:label "Request" ; + rdfs:subClassOf)lv2ttl" R"lv2ttl( patch:Message ; + lv2:documentation """ + +A request may have a patch:subject property, which specifies the resource that +the request applies to. The subject may be omitted in contexts where it is +implicit, for example if the recipient is the subject. + +"""^^lv2:Markdown . + +patch:Set + lv2:documentation """ + +This is equivalent to a patch:Patch which removes _all_ pre-existing values for +the property before setting the new value. For example: + + :::turtle + [] + a patch:Set ; + patch:subject ; + patch:property eg:name ; + patch:value "New name" . + +Which is equivalent to: + + :::turtle + [] + a patch:Patch ; + patch:subject ; + patch:add [ + eg:name "New name" ; + ] ; + patch:remove [ + eg:name patch:wildcard ; + ] . + +"""^^lv2:Markdown . + +patch:body + lv2:documentation """ + +The details of this property's value depend on the type of message it is a part +of. + +"""^^lv2:Markdown . + +patch:context + lv2:documentation """ + +For example, a plugin may have a special context for ephemeral properties which +are only relevant during the lifetime of the instance and should not be saved +in state. + +The specific uses for contexts are application specific. However, the context +MUST be a URI, and can be interpreted as the ID of a data model where +properties should be stored. Implementations MAY have special support for +contexts, for example by storing in a quad store or serializing to a format +that supports multiple RDF graphs such as TriG. + +"""^^lv2:Markdown . + +patch:readable + lv2:documentation """ + +See the similar patch:writable property for details. + +"""^^lv2:Markdown . + +patch:request + lv2:documentation """ + +This can be used if referring directly to the URI or blank node ID of the +request is possible. Otherwise, use patch:sequenceNumber. + +"""^^lv2:Markdown . + +patch:sequenceNumber + lv2:documentation """ + +This property is used to associate replies with requests when it is not +feasible to refer to request URIs with patch:request. A patch:Response with a +given sequence number is the reply to the previously send patch:Request with +the same sequence number. + +The special sequence number 0 means that no reply is desired. + +"""^^lv2:Markdown . + +patch:wildcard + lv2:documentation """ + +This makes it possible to describe the removal of all values for a given +property. + +"""^^lv2:Markdown . + +patch:writable + lv2:documentation """ + +This is used to list properties that can be changed, for example to allow user +interfaces to present appropriate controls. For example: + + :::turtle + @prefix eg: . + @prefix rdf: . + @prefix rdfs: . + @prefix xsd: . + + eg:title + a rdf:Property ; + rdfs:label "title" ; + rdfs:range xsd:string . + + eg:plugin + patch:writable eg:title . + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"patch.ttl", +R"lv2ttl(@prefix foaf: . +@prefix owl: . +@prefix patch: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:seeAlso , + ; + rdfs:label "LV2 Patch" ; + rdfs:comment "A protocol for accessing and manipulating properties." . + +patch:Ack + a rdfs:Class ; + rdfs:subClassOf patch:Response ; + rdfs:label "Ack" ; + rdfs:comment "An acknowledgement that a request was successful." . + +patch:Copy + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Copy" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty patch:subject + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:destination + ] ; + rdfs:comment "A request to copy the patch:subject to the patch:destination." . + +patch:Delete + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Delete" ; + rdfs:comment "Request that the patch:subject or subjects be deleted." . + +patch:Error + a rdfs:Class ; + rdfs:subClassOf patch:Response ; + rdfs:label "Error" ; + rdfs:comment "A response indicating an error processing a request." . + +patch:Get + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Get" ; + rdfs:comment "A request for a description of the patch:subject." . + +patch:Insert + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Insert" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:subject + ] ; + rdfs:comment "A request to insert a patch:body into the patch:subject." . + +patch:Message + a rdfs:Class ; + rdfs:label "Patch Message" ; + rdfs:comment "A patch message." . + +patch:Move + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Move" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:subject + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:destination + ] ; + rdfs:comment "A request to move the patch:subject to the patch:destination." . + +patch:Patch + a rdfs:Class ; + rdfs:subClassOf patch:Request , + [ + a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty patch:subject + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:add + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:remove + ] ; + rdfs:label "Patch" ; + rdfs:comment "A request to add and/or remove properties of the patch:subject." . + +patch:Put + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Put" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:subject + ] ; + rdfs:comment "A request to put the patch:body as the patch:subject." . + +patch:Request + a rdfs:Class ; + rdfs:label "Request" ; + rdfs:subClassOf patch:Message ; + rdfs:comment "A patch request message." . + +patch:Response + a rdfs:Class ; + rdfs:subClassOf patch:Message ; + rdfs:label "Response" ; + rdfs:comment "A response to a patch:Request." . + +patch:Set + a rdfs:Class ; + rdfs:label "Set" ; + rdfs:subClassOf patch:Request , + [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:property + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:value + ] ; + rdfs:comment "A compact request to set a property to a value." . + +patch:accept + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "accept" ; + rdfs:domain patch:Request ; + rdfs:range rdfs:Class ; + rdfs:comment "An accepted type for a response." . + +patch:add + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Patch ; + rdfs:range rdfs:Resource ; + rdfs:label "add" ; + rdfs:comment "The properties to add to the subject." . + +patch:body + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Message ; + rdfs:label "body" ; + rdfs:comment "The body of a message." . + +patch:context + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain patch:Message ; + rdfs:label "context" ; + rdfs:comment "The context of properties in this message." . + +patch:destination + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Message ; + rdfs:label "destination" ; + rdfs:comment "The destination to move the patch:subject to." . + +patch:property + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "property" ; + rdfs:domain patch:Message ; + rdfs:range rdf:Property ; + rdfs:comment "The property for a patch:Set or patch:Get message." . + +patch:readable + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "readable" ; + rdfs:range rdf:Property ; + rdfs:comment "A property that can be read with a patch:Get message." . + +patch:remove + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:label "remove" ; + rdfs:domain patch:Patch ; + rdfs:range rdfs:Resource ; + rdfs:comment "The properties to remove from the subject." . + +patch:request + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:label "request" ; + rdfs:domain patch:Response ; + rdfs:range patch:Request ; + rdfs:comment "The request this is a response to." . + +patch:sequenceNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "sequence number" ; + rdfs:domain patch:Message ; + rdfs:range xsd:int ; + rdfs:comment "The sequence number of a request or response." . + +patch:subject + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Message ; + rdfs:label "subject" ; + rdfs:comment "The subject this message applies to." . + +patch:value + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "value" ; + rdfs:domain patch:Set ; + rdfs:range rdf:Property ; + rdfs:comment "The value of a property in a patch:Set message." . + +patch:wildcard + a rdfs:Resource ; + rdfs:label "wildcard" ; + rdfs:comment "A wildcard that matches any resource." . + +patch:writable + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "writable" ; + rdfs:range rdf:Property ; + rdfs:comment "A property that can be set with a patch:Set or patch:Patch message." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"parameters", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"parameters.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix param: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Parameters" ; + doap:release [ + doap:revision "1.4" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add range to parameters so hosts know how to control them." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add param:sampleRate." + ] , [ + rdfs:label "Add parameters.h of URI defines for convenience." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + doap:created "2009-00-00" ; + doap:shortdesc "Common parameters for audio processing." ; + doap:maintainer ; + doap:developer ; + lv2:documentation """ + +This is a vocabulary for parameters that are common in audio processing +software. A parameter is purely a metadata concept, unrelated to any +particular code mechanism. Parameters are used to assign meaning to controls +(for example, using lv2:designation for ports) so they can be used more +intelligently or presented to the user more efficiently. + +"""^^lv2:Markdown . + +param:wetDryRatio + a lv2:Parameter ; + rdfs:label "wet/dry ratio" ; + lv2:documentation """ + +The ratio between processed and bypass components in output signal. The dry +and wet percentages can be calculated from the following equations: + + :::c + dry = (wetDryRatio.maximum - wetDryRatio.value) / wetDryRatio.maximum + wet = wetDryRatio.value / wetDryRatio.maximum + +Typically, maximum value of 1 or 100 and minimum value of 0 should be used. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"parameters.ttl", +R"lv2ttl(@prefix atom: . +@prefix lv2: . +@prefix owl: . +@prefix param: . +@prefix pg: . +@prefix rdf: . +@prefix rdfs: . +@prefix units: . + + + a owl:Ontology ; + rdfs:label "LV2 Parameters" ; + rdfs:comment "Common parameters for audio processing." ; + rdfs:seeAlso . + +param:ControlGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Control Group" ; + rdfs:comment "A group representing a set of associated controls." . + +param:amplitude + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "amplitude" ; + rdfs:comment "An amplitude as a factor, where 0 is silent and 1 is unity." . + +param:attack + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "attack" ; + rdfs:comment "The duration of an envelope attack stage." . + +param:cutoffFrequency + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "cutoff frequency" ; + rdfs:comment "The cutoff frequency, typically in Hz, for a filter." . + +param:decay + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "decay" ; + rdfs:comment "The duration of an envelope decay stage." . + +param:delay + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "delay" ; + rdfs:comment "The duration of an envelope delay stage." . + +param:frequency + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "frequency" ; + rdfs:comment "A frequency, typically in Hz." . + +param:hold + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "hold" ; + rdfs:comment "The duration of an envelope hold stage." . + +param:pulseWidth + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "pulse width" ; + rdfs:comment "The width of a pulse of a rectangular waveform." . + +param:ratio + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "ratio" ; + rdfs:comment "Compression ratio." . + +param:release + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "release" ; + rdfs:comment "The duration of an envelope release stage." . + +param:resonance + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "resonance" ; + rdfs:comment "The resonance of a filter." . + +param:sustain + a lv2:Parameter ; + rdfs:label "sustain" ; + rdfs:range atom:Float ; + rdfs:comment "The level of an envelope sustain stage as a factor." . + +param:threshold + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "threshold" ; + rdfs:comment "Compression threshold." . + +param:waveform + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "waveform" ; + rdfs:comment """The waveform "fader" for oscillators or modulators that have several.""" . + +param:gain + a lv2:Parameter ; + rdfs:range atom:Float ; + lv2:default 0.0 ; + lv2:minimum -20.0 ; + lv2:maximum 20.0 ; + units:unit units:db ; + rdfs:label "gain" ; + rdfs:comment "Gain in decibels." . + +param:wetDryRatio + a lv2:Parameter ; + rdfs:label "wet/dry ratio" ; + rdfs:comment "The ratio between processed and bypassed levels in the output." . + +param:wetLevel + a lv2:Parameter ; + rdfs:label "wet level" ; + rdfs:comment "The level of the processed component of a signal." . + +param:dryLevel + a lv2:Parameter ; + rdfs:label "dry level" ; + rdfs:comment "The level of the unprocessed component of a signal." . + +param:bypass + a lv2:Parameter ; + rdfs:label "bypass" ; + rdfs:comment "A boolean parameter that disables processing if true." . + +param:sampleRate + a lv2:Parameter ; + rdfs:label "sample rate" ; + rdfs:comment "A sample rate in Hz." . + +param:EnvelopeControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Envelope Controls" ; + rdfs:comment "Typical controls for a DAHDSR envelope." ; + pg:element [ + lv2:index 0 ; + lv2:designation param:delay + ] , [ + lv2:index 1 ; + lv2:designation param:attack + ] , [ + lv2:index 2 ; + lv2:designation param:hold + ] , [ + lv2:index 3 ; + lv2:designation param:decay + ] , [ + lv2:index 4 ; + lv2:designation param:sustain + ] , [ + lv2:index 5 ; + lv2:designation param:release + ] . + +param:OscillatorControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Oscillator Controls" ; + rdfs:comment "Typical controls for an oscillator." ; + pg:element [ + lv2:designation param:frequency + ] , [ + lv2:designation param:amplitude + ] , [ + lv2:designation param:waveform + ] , [ + lv2:designation param:pulseWidth + ] . + +param:FilterControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Filter Controls" ; + rdfs:comment "Typical controls for a filter." ; + pg:element [ + lv2:designation param:cutoffFrequency + ] , [ + lv2:designation param:resonance + ] . + +param:CompressorControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Compressor Controls" ; + rdfs:comment "Typical controls for a compressor." ; + pg:element [ + lv2:designation param:threshold + ] , [ + lv2:designation param:ratio + ] . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"urid", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"urid.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix urid: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 URID" ; + doap:shortdesc "Features for mapping URIs to and from integers." ; + doap:created "2011-07-22" ; + doap:developer ; + doap:maintainer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix typo in urid:unmap documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add feature struct names." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a simple mechanism for plugins to map URIs to and from +integers. This is usually used for performance reasons, for example for +processing events with URI types in real-time audio code). Typically, plugins +map URIs to integers for things they "understand" at instantiation time, and +store those values for use in the audio thread without doing any string +comparison. This allows for the extensibility of RDF but with the performance +of integers. + +This extension is intended as an improved and simplified replacement for the +[uri-map](uri-map.html) extension, since the `map` context parameter there has +proven problematic. This extension is functionally equivalent to the uri-map +extension with a NULL context. New implementations are encouraged to use this +extension for URI mapping. + +"""^^lv2:Markdown . + +urid:map + lv2:documentation """ + +To support this feature, the host must pass an LV2_Feature to +LV2_Descriptor::instantiate() with URI LV2_URID__map and data pointed to an +instance of LV2_URID_Map. + +"""^^lv2:Markdown . + +urid:unmap + lv2:documentation """ + +To support this feature, the host must pass an LV2_Feature to +LV2_Descriptor::instantiate() with URI LV2_URID__unmap and data pointed to an +instance of LV2_URID_Unmap. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"urid.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix rdfs: . +@prefix urid: . + + + a owl:Ontology ; + rdfs:label "LV2 URID" ; + rdfs:comment "Features for mapping URIs to and from integers." ; + rdfs:seeAlso , + . + +urid:map + a lv2:Feature ; + rdfs:label "map" ; + rdfs:comment "A feature to map URI strings to integer URIDs." . + +urid:unmap + a lv2:Feature ; + rdfs:label "unmap" ; + rdfs:comment "A feature to unmap URIDs back to strings." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"uri-map", +{ +juce::lv2::BundleResource +{ +"uri-map.meta.ttl", +R"lv2ttl(@prefix lv2: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix rdfs: . + + + a doap:Project ; + doap:maintainer ; + doap:created "2008-00-00" ; + doap:developer , + ; + doap:license ; + doap:name "LV2 URI Map" ; + doap:shortdesc "A feature for mapping URIs to integers." ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Deprecate uri-map in favour of urid." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Mark up documentation in HTML using lv2:documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-18" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension is deprecated. New implementations +should use [LV2 URID](urid.html) instead. + +This extension defines a simple mechanism for plugins to map URIs to integers, +usually for performance reasons (e.g. processing events typed by URIs in real +time). The expected use case is for plugins to map URIs to integers for things +they 'understand' at instantiation time, and store those values for use in the +audio thread without doing any string comparison. This allows the +extensibility of RDF with the performance of integers (or centrally defined +enumerations). + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"uri-map.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix umap: . + + + a lv2:Feature ; + owl:deprecated true ; + rdfs:label "LV2 URI Map" ; + rdfs:comment "A feature for mapping URIs to integers." ; + rdfs:seeAlso , + . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"log", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"log.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix log: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Log" ; + doap:shortdesc "A feature for writing log messages." ; + doap:created "2012-01-12" ; + doap:developer ; + doap:release [ + doap:revision "2.4" ; + doap:created "2016-07-30" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2_log_logger_set_map() for changing the URI map of an existing logger." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add missing include string.h to logger.h for memset." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2013-01-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add logger convenience API." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature, log:log, which allows plugins to print log +messages with an API similar to the standard C `printf` function. This allows, +for example, plugin logs to be nicely presented to the user in a graphical user +interface. + +Different log levels are defined by URI and passed as an LV2_URID. This +extensions defines standard levels which are expected to be understood by all +implementations and should be sufficient in most cases, but advanced +implementations may define and use additional levels to suit their needs. + +"""^^lv2:Markdown . + +log:Entry + a rdfs:Class ; + rdfs:label "Log Entry" ; + lv2:documentation """ + +Subclasses of this are passed as the `type` parameter to LV2_Log_Log methods to +describe the nature of the log entry. + +"""^^lv2:Markdown . + +log:Error + lv2:documentation """ + +An error should only be posted when a serious unexpected error occurs, and +should be actively shown to the user by the host. + +"""^^lv2:Markdown . + +log:Note + lv2:documentation """ + +A note records some useful piece of information, but may be ignored. The host +should provide passive access to note entries to the user. + +"""^^lv2:Markdown . + +log:Warning + lv2:documentation """ + +A warning should be posted when an unexpected, but non-critical, error occurs. +The host should provide passive access to warnings entries to the user, but may +also choose to actively show them. + +"""^^lv2:Markdown . + +log:Trace + lv2:documentation """ + +A trace should not be displayed during normal operation, but the host may +implement an option to display them for debugging purposes. + +This entry type is special in that one may be posted in a real-time thread. It +is assumed that if debug tracing is enabled, real-time performance is not a +concern. However, the host MUST guarantee that posting a trace _is_ real-time +safe if debug tracing is not enabled (for example, by simply ignoring the call +as early as possible). + +"""^^lv2:Markdown . + +log:log + lv2:documentation """ + +A feature which plugins may use to log messages. To support this feature, +the host must pass an LV2_Feature to LV2_Descriptor::instantiate() with URI +LV2_LOG__log and data pointed to an instance of LV2_Log_Log. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"log.ttl", +R"lv2ttl(@prefix log: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Log" ; + rdfs:comment "A feature for writing log messages." ; + rdfs:seeAlso , + . + +log:Entry + a rdfs:Class ; + rdfs:label "Entry" ; + rdfs:comment "A log entry." . + +log:Error + a rdfs:Class ; + rdfs:label "Error" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "An error message." . + +log:Note + a rdfs:Class ; + rdfs:label "Note" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "An informative message." . + +log:Warning + a rdfs:Class ; + rdfs:label "Warning" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "A warning message." . + +log:Trace + a rdfs:Class ; + rdfs:label "Trace" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "A debugging trace message." . + +log:log + a lv2:Feature ; + rdfs:label "log" ; + rdfs:comment "Logging feature." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"dynmanifest", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"dynmanifest.ttl", +R"lv2ttl(@prefix dman: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Dyn Manifest" ; + rdfs:comment "Support for dynamic manifest data generation." ; + rdfs:seeAlso , + . + +dman:DynManifest + a rdfs:Class ; + rdfs:label "Dynamic Manifest" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:binary ; + owl:minCardinality 1 ; + rdfs:comment "A DynManifest MUST have at least one lv2:binary." + ] ; + rdfs:comment "Dynamic manifest for an LV2 binary." . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"dynmanifest.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix dman: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Dynamic Manifest" ; + doap:homepage ; + doap:created "2009-06-13" ; + doap:shortdesc "Support for dynamic manifest data generation." ; + doap:programming-language "C" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-04-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +The LV2 API, on its own, cannot be used to write plugin libraries where data is +dynamically generated at runtime, since LV2 requires needed information to be +provided in one or more static data (RDF) files. This API addresses this +limitation by extending the LV2 API. + +To detect that a plugin library implements a dynamic manifest generator, the +host checks its static manifest for a description like: + + :::turtle + + a dman:DynManifest ; + lv2:binary . + +To load the data, the host loads the library (`mydynmanifest.so` in this +example) as usual and fetches the dynamic Turtle data from it using this API. + +The host is allowed to request regeneration of the dynamic manifest multiple +times, and the plugin library is expected to provide updated data if/when +possible. All data and references provided via this API before the last +regeneration of the dynamic manifest is to be considered invalid by the host, +including plugin descriptors whose URIs were discovered using this API. + +### Accessing Data + +To access data using this API, the host must: + + 1. Call lv2_dyn_manifest_open(). + + 2. Create a `FILE` for functions to write data to (for example with `tmpfile()`). + + 3. Get a list of exposed subject URIs using lv2_dyn_manifest_get_subjects(). + + 4. Call lv2_dyn_manifest_get_data() for each URI of interest to write the + related data to the file. + + 5. Call lv2_dyn_manifest_close(). + + 6. Parse the content of the file(s). + + 7. Remove the file(s). + +Each call to the above mentioned dynamic manifest functions MUST write a +complete, valid Turtle document (including all needed prefix definitions) to +the output FILE. + +Each call to lv2_dyn_manifest_open() causes the (re)generation of the dynamic +manifest data, and invalidates all data fetched before the call. + +In case the plugin library uses this same API to access other dynamic +manifests, it MUST implement some mechanism to avoid potentially endless loops +(such as A loads B, B loads A, etc.) and, in case such a loop is detected, the +operation MUST fail. For this purpose, use of a static boolean flag is +suggested. + +### Threading Rules + +All of the functions defined by this specification belong to the Discovery +class. + + +"""^^lv2:Markdown . + +dman:DynManifest + lv2:documentation """ + +There MUST NOT be any instances of dman:DynManifest in the generated manifest. + +All relative URIs in the generated data MUST be relative to the base path that +would be used to parse a normal LV2 manifest (the bundle path). + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"worker", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"worker.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix work: . + + + a doap:Project ; + doap:name "LV2 Worker" ; + doap:shortdesc "Support for doing non-realtime work in plugins." ; + doap:created "2012-03-22" ; + doap:developer ; + doap:release [ + doap:revision "1.2" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension allows plugins to schedule work that must be performed in +another thread. Plugins can use this interface to safely perform work that is +not real-time safe, and receive the result in the run context. The details of +threading are managed by the host, allowing plugins to be simple and portable +while using resources more efficiently. + +This interface is designed to gracefully support single-threaded synchronous +execution, which allows the same code to work with sample accuracy for offline +rendering. For example, a sampler plugin may schedule a sample to be loaded +from disk in another thread. During live execution, the host will call the +plugin's work method from another thread, and deliver the result to the audio +thread when it is finished. However, during offline export, the +scheduled load would be executed immediately in the same thread. This +enables reproducible offline rendering, where any changes affect the output +immediately regardless of how long the work takes to execute. + +"""^^lv2:Markdown . + +work:interface + lv2:documentation """ + +The work interface provided by a plugin, LV2_Worker_Interface. + + :::turtle + + @prefix work: . + + + a lv2:Plugin ; + lv2:extensionData work:interface . + +"""^^lv2:Markdown . + +work:schedule + lv2:documentation """ + +The work scheduling feature provided by a host, LV2_Worker_Schedule. + +If the host passes this feature to LV2_Descriptor::instantiate, the plugin MAY +use it to schedule work in the audio thread, and MUST NOT call it in any other +context. Hosts MAY pass this feature to other functions as well, in which case +the plugin MAY use it to schedule work in the calling context. The plugin MUST +NOT assume any relationship between different schedule features. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"worker.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix work: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Worker" ; + rdfs:comment "Support for doing non-realtime work in plugins." ; + owl:imports ; + rdfs:seeAlso , + . + +work:interface + a lv2:ExtensionData ; + rdfs:label "work interface" ; + rdfs:comment "The work interface provided by a plugin." . + +work:schedule + a lv2:Feature ; + rdfs:label "work schedule" ; + rdfs:comment "The work scheduling feature provided by a host." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"presets", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 8 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"presets.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix pset: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Presets" ; + rdfs:comment "Presets for LV2 plugins." ; + rdfs:seeAlso . + +pset:Bank + a rdfs:Class ; + rdfs:label "Bank" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty rdfs:label ; + owl:someValuesFrom xsd:string ; + rdfs:comment "A Bank MUST have at least one string rdfs:label." + ] ; + rdfs:comment "A bank of presets." . + +pset:Preset + a rdfs:Class ; + rdfs:subClassOf lv2:PluginBase ; + rdfs:label "Preset" ; + rdfs:comment "A preset for an LV2 plugin." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty rdfs:label ; + owl:someValuesFrom xsd:string ; + rdfs:comment "A Preset MUST have at least one string rdfs:label." + ] . + +pset:bank + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain pset:Preset ; + rdfs:range pset:Bank ; + rdfs:label "bank" ; + rdfs:comment "The bank this preset belongs to." . + +pset:value + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:PortBase ; + rdfs:label "value" ; + rdfs:comment "The value of a port in a preset." . + +pset:preset + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:PluginBase ; + rdfs:range pset:Preset ; + rdfs:label "preset" ; + rdfs:comment "The preset currently applied to a plugin instance." . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"presets.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pset: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Presets" ; + doap:shortdesc "Presets for LV2 plugins." ; + doap:created "2009-00-00" ; + doap:developer ; + doap:release [ + doap:revision "2.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add preset banks." + ] + ] + ] , [ + doap:revision "2.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add pset:preset property for describing the preset currently applied to a plugin instance." + ] , [ + rdfs:label "Remove pset:appliesTo property, use lv2:appliesTo instead." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This is a vocabulary for LV2 plugin presets, that is, named sets of control +values and possibly other state. The structure of a pset:Preset is +deliberately identical to that of an lv2:Plugin, and can be thought of as a +plugin template or overlay. + +Presets may be defined in any bundle, including the plugin's bundle, separate +third party preset bundles, or user preset bundles saved by hosts. Since +preset data tends to be large, it is recommended that plugins describe presets +in a separate file(s) to avoid slowing down hosts. The `manifest.ttl` of a +bundle containing presets should list them like so: + + :::turtle + eg:mypreset + a pset:Preset ; + lv2:appliesTo eg:myplugin ; + rdfs:seeAlso . + +"""^^lv2:Markdown . + +pset:Preset + lv2:documentation """ + +The structure of a Preset deliberately mirrors that of a plugin, so existing +predicates can be used to describe any data associated with the preset. For +example: + + :::turtle + @prefix eg: . + + eg:mypreset + a pset:Preset ; + rdfs:label "One louder" ; + lv2:appliesTo eg:myplugin ; + lv2:port [ + lv2:symbol "volume1" ; + pset:value 11.0 + ] , [ + lv2:symbol "volume2" ; + pset:value 11.0 + ] . + +A Preset SHOULD have at least one lv2:appliesTo property. Each Port on a +Preset MUST have at least a lv2:symbol property and a pset:value property. + +Hosts SHOULD save user presets to a bundle in the user-local LV2 directory (for +example `~/.lv2`) with a name like `_.preset.lv2` +(for example `LV2_Amp_At_Eleven.preset.lv2`), where names are transformed to be +valid LV2 symbols for maximum compatibility. + +"""^^lv2:Markdown . + +pset:value + lv2:documentation """ + +This property is used in a similar way to lv2:default. + +"""^^lv2:Markdown . + +pset:preset + lv2:documentation """ + +Specifies the preset currently applied to a plugin instance. This property may +be useful for saving state, or notifying a plugin instance at run-time about a +preset change. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"event", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 12 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"event.ttl", +R"lv2ttl(@prefix ev: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . + + + a owl:Ontology ; + owl:deprecated true ; + rdfs:label "LV2 Event" ; + rdfs:comment "A port-based real-time generic event interface." ; + rdfs:seeAlso , + , + . + +ev:EventPort + a rdfs:Class ; + rdfs:label "Event Port" ; + rdfs:subClassOf lv2:Port ; + rdfs:comment "An LV2 event port." . + +ev:Event + a rdfs:Class ; + rdfs:label "Event" ; + rdfs:comment "A single generic time-stamped event." . + +ev:TimeStamp + a rdfs:Class ; + rdfs:label "Event Time Stamp" ; + rdfs:comment "The time stamp of an Event." . + +ev:FrameStamp + a rdfs:Class ; + rdfs:subClassOf ev:TimeStamp ; + rdfs:label "Audio Frame Time Stamp" ; + rdfs:comment "The default time stamp unit for an event." . + +ev:generic + a lv2:PortProperty ; + rdfs:label "generic event port" ; + rdfs:comment "Port works with generic events." . + +ev:supportsEvent + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort ; + rdfs:range rdfs:Class ; + rdfs:label "supports event type" ; + rdfs:comment "An event type supported by this port." . + +ev:inheritsEvent + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:OutputPort ; + rdfs:range lv2:Port ; + rdfs:label "inherits event type" ; + rdfs:comment "Output port inherits event types from an input port." . + +ev:supportsTimeStamp + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:InputPort ; + rdfs:range rdfs:Class ; + rdfs:label "supports time stamp type" ; + rdfs:comment "A time stamp type suported by this input port." . + +ev:generatesTimeStamp + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:OutputPort ; + rdfs:range rdfs:Class ; + rdfs:label "generates time stamp type" ; + rdfs:comment "A time stamp type generated by this input port." . + +ev:inheritsTimeStamp + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:OutputPort ; + rdfs:range lv2:Port ; + rdfs:label "inherits time stamp type" ; + rdfs:comment "Output port inherits time stamp types from an input port." . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"event.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix ev: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Event" ; + doap:shortdesc "A port-based real-time generic event interface." ; + doap:created "2008-00-00" ; + doap:developer , + ; + doap:release [ + doap:revision "1.12" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Minor documentation improvements." + ] + ] + ] , [ + doap:revision "1.10" ; + doap:created "2013-01-13" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect return type in lv2_event_get()." + ] + ] + ] , [ + doap:revision "1.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make event iterator gracefully handle optional ports." + ] , [ + rdfs:label "Remove asserts from event-helper.h." + ] , [ + rdfs:label "Use more precise domain and range for EventPort properties." + ] , [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix bug in lv2_event_reserve()." + ] , [ + rdfs:label "Fix incorrect ranges of some properties." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] , [ + rdfs:label "Use lv2:Specification to be discovered as an extension." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-11-24" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension is deprecated. New implementations +should use LV2 Atom instead. + +This extension defines a generic time-stamped event port type, which can be +used to create plugins that read and write real-time events, such as MIDI, +OSC, or any other type of event payload. The type(s) of event supported by +a port is defined in the data file for a plugin, for example: + + :::turtle + + lv2:port [ + a ev:EventPort, lv2:InputPort ; + lv2:index 0 ; + ev:supportsEvent ; + lv2:symbol "midi_input" ; + lv2:name "MIDI input" ; + ] . + +"""^^lv2:Markdown . + +ev:EventPort + lv2:documentation """ + +Ports of this type will be connected to a struct of type LV2_Event_Buffer, +defined in event.h. These ports contain a sequence of generic events (possibly +several types mixed in a single stream), the specific types of which are +defined by some URI in another LV2 extension. + +"""^^lv2:Markdown . + +ev:Event + a rdfs:Class ; + rdfs:label "Event" ; + lv2:documentation """ + +An ev:EventPort contains an LV2_Event_Buffer which contains a sequence of these +events. The binary format of LV2 events is defined by the LV2_Event struct in +event.h. + +Specific event types (such as MIDI or OSC) are defined by extensions, and +should be rdfs:subClassOf this class. + +"""^^lv2:Markdown . + +ev:TimeStamp + lv2:documentation """ + +This defines the meaning of the 'frames' and 'subframes' fields of an LV2_Event +(both unsigned 32-bit integers). + +"""^^lv2:Markdown . + +ev:FrameStamp + lv2:documentation """ + +The default time stamp unit for an LV2 event: the frames field represents audio +frames (in the sample rate passed to intantiate), and the subframes field is +1/UINT32_MAX of a frame. + +"""^^lv2:Markdown . + +ev:generic + lv2:documentation """ + +Indicates that this port does something meaningful for any event type. This is +useful for things like event mixers, delays, serialisers, and so on. + +If this property is set, hosts should consider the port suitable for any type +of event. Otherwise, hosts should consider the port 'appropriate' only for the +specific event types listed with :supportsEvent. Note that plugins must +gracefully handle unknown event types whether or not this property is present. + +"""^^lv2:Markdown . + +ev:supportsEvent + lv2:documentation """ + +Indicates that this port supports or "understands" a certain event type. + +For input ports, this means the plugin understands and does something useful +with events of this type. For output ports, this means the plugin may generate +events of this type. If the plugin never actually generates events of this +type, but might pass them through from an input, this property should not be +set (use ev:inheritsEvent for that). + +Plugins with event input ports must always gracefully handle any type of event, +even if it does not 'support' it. This property should always be set for event +types the plugin understands/generates so hosts can discover plugins +appropriate for a given scenario (for example, plugins with a MIDI input). +Hosts are not expected to consider event ports suitable for some type of event +if the relevant :supportsEvent property is not set, unless the ev:generic +property for that port is also set. + + +"""^^lv2:Markdown . + +ev:inheritsEvent + lv2:documentation """ + +Indicates that this output port might pass through events that arrived at some +other input port (or generate an event of the same type as events arriving at +that input). The host must always check the stamp type of all outputs when +connecting an input, but this property should be set whenever it applies. + + +"""^^lv2:Markdown . + +ev:supportsTimeStamp + lv2:documentation """ + +Indicates that this port supports or "understands" a certain time stamp type. +Meaningful only for input ports, the host must never connect a port to an event +buffer with a time stamp type that isn't supported by the port. + +"""^^lv2:Markdown . + +ev:generatesTimeStamp + lv2:documentation """ + +Indicates that this port may output a certain time stamp type, regardless of +the time stamp type of any input ports. + +If the port outputs stamps based on what type inputs are connected to, this +property should not be set (use the ev:inheritsTimeStamp property for that). +Hosts MUST check the time_stamp value of any output port buffers after a call +to connect_port on ANY event input port on the plugin. + +If the plugin changes the stamp_type field of an output event buffer during a +call to run(), the plugin must call the stamp_type_changed function provided by +the host in the LV2_Event_Feature struct, if it is non-NULL. + +"""^^lv2:Markdown . + +ev:inheritsTimeStamp + lv2:documentation """ + +Indicates that this port follows the time stamp type of an input port. + +This property is not necessary, but it should be set for outputs that base +their output type on an input port so the host can make more sense of the +pl)lv2ttl" R"lv2ttl(ugin and provide a more sensible interface. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"data-access", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"data-access.ttl", +R"lv2ttl(@prefix da: . +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Feature ; + rdfs:label "data access" ; + rdfs:comment "A feature that provides access to plugin extension data." ; + rdfs:seeAlso , + . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"data-access.meta.ttl", +R"lv2ttl(@prefix da: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + rdfs:seeAlso ; + doap:license ; + doap:name "LV2 Data Access" ; + doap:shortdesc "Provides access to plugin extension data." ; + doap:created "2008-00-00" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature, LV2_Extension_Data_Feature, which provides +access to LV2_Descriptor::extension_data() for plugin UIs or other potentially +remote users of a plugin. + +Note that the use of this extension by UIs violates the important principle of +UI/plugin separation, and is potentially a source of many problems. +Accordingly, **use of this extension is highly discouraged**, and plugins +should not expect hosts to support it, since it is often impossible to do so. + +To support this feature the host must pass an LV2_Feature struct to +LV2_Descriptor::extension_data() with URI LV2_DATA_ACCESS_URI and data pointed +to an instance of LV2_Extension_Data_Feature. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} + +}; +} + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,100 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "juce_lv2_config.h" + +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wc99-extensions", + "-Wcast-align", + "-Wconversion", + "-Wdeprecated-declarations", + "-Wextra-semi", + "-Wfloat-conversion", + "-Wimplicit-float-conversion", + "-Wimplicit-int-conversion", + "-Wmicrosoft-include", + "-Wmissing-field-initializers", + "-Wnullability-extension", + "-Wnullable-to-nonnull-conversion", + "-Wparentheses", + "-Wpedantic", + "-Wredundant-decls", + "-Wshorten-64-to-32", + "-Wsign-conversion", + "-Wswitch-enum", + "-Wunused-parameter", + "-Wzero-as-null-pointer-constant") +JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4100 4200 4244 4267 4389 4702 4706 4800 4996 6308 28182 28183 6385 6386 6387 6011 6282 6323 6330 6001 6031) + +extern "C" +{ + +#define is_windows_path serd_is_windows_path + +#include "serd/src/base64.c" +#include "serd/src/byte_source.c" +#include "serd/src/env.c" +#include "serd/src/n3.c" +#undef TRY +#include "serd/src/node.c" +#include "serd/src/reader.c" +#include "serd/src/string.c" +#include "serd/src/system.c" +#include "serd/src/uri.c" +#include "serd/src/writer.c" + +#undef is_windows_path + +#include "sord/src/sord.c" +#include "sord/src/syntax.c" + +#include "lilv/src/collections.c" +#include "lilv/src/filesystem.c" +#include "lilv/src/instance.c" +#include "lilv/src/lib.c" +#include "lilv/src/node.c" +#include "lilv/src/plugin.c" +#include "lilv/src/pluginclass.c" +#include "lilv/src/port.c" +#include "lilv/src/query.c" +#include "lilv/src/scalepoint.c" +#include "lilv/src/state.c" +#include "lilv/src/ui.c" +#include "lilv/src/util.c" +#include "lilv/src/world.c" +#include "lilv/src/zix/tree.c" + +#undef NS_RDF +#undef NS_XSD +#undef USTR + +#define read_object sratom_read_object +#define read_literal sratom_read_literal + +#pragma push_macro ("nil") +#undef nil +#include "LV2_SDK/sratom/src/sratom.c" +#pragma pop_macro ("nil") + +} // extern "C" diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VST3Common.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VST3Common.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VST3Common.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VST3Common.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,6 +23,8 @@ ============================================================================== */ +#pragma once + #ifndef DOXYGEN namespace juce @@ -43,7 +45,7 @@ return Steinberg::kNotImplemented; \ } -static bool doUIDsMatch (const Steinberg::TUID a, const Steinberg::TUID b) noexcept +inline bool doUIDsMatch (const Steinberg::TUID a, const Steinberg::TUID b) noexcept { return std::memcmp (a, b, sizeof (Steinberg::TUID)) == 0; } @@ -211,7 +213,7 @@ case AudioChannelSet::centreSurround: return Steinberg::Vst::kSpeakerCs; case AudioChannelSet::leftSurroundSide: return Steinberg::Vst::kSpeakerSl; case AudioChannelSet::rightSurroundSide: return Steinberg::Vst::kSpeakerSr; - case AudioChannelSet::topMiddle: return (1ull << 11); /* kSpeakerTm */ + case AudioChannelSet::topMiddle: return Steinberg::Vst::kSpeakerTc; /* kSpeakerTm */ case AudioChannelSet::topFrontLeft: return Steinberg::Vst::kSpeakerTfl; case AudioChannelSet::topFrontCentre: return Steinberg::Vst::kSpeakerTfc; case AudioChannelSet::topFrontRight: return Steinberg::Vst::kSpeakerTfr; @@ -221,8 +223,8 @@ case AudioChannelSet::LFE2: return Steinberg::Vst::kSpeakerLfe2; case AudioChannelSet::leftSurroundRear: return Steinberg::Vst::kSpeakerLcs; case AudioChannelSet::rightSurroundRear: return Steinberg::Vst::kSpeakerRcs; - case AudioChannelSet::wideLeft: return Steinberg::Vst::kSpeakerPl; - case AudioChannelSet::wideRight: return Steinberg::Vst::kSpeakerPr; + case AudioChannelSet::proximityLeft: return Steinberg::Vst::kSpeakerPl; + case AudioChannelSet::proximityRight: return Steinberg::Vst::kSpeakerPr; case AudioChannelSet::ambisonicACN0: return Steinberg::Vst::kSpeakerACN0; case AudioChannelSet::ambisonicACN1: return Steinberg::Vst::kSpeakerACN1; case AudioChannelSet::ambisonicACN2: return Steinberg::Vst::kSpeakerACN2; @@ -272,10 +274,9 @@ case AudioChannelSet::ambisonicACN33: case AudioChannelSet::ambisonicACN34: case AudioChannelSet::ambisonicACN35: - case AudioChannelSet::proximityLeft: - case AudioChannelSet::proximityRight: + case AudioChannelSet::wideLeft: + case AudioChannelSet::wideRight: case AudioChannelSet::unknown: - default: break; } @@ -330,14 +331,13 @@ case Steinberg::Vst::kSpeakerBfl: return AudioChannelSet::bottomFrontLeft; case Steinberg::Vst::kSpeakerBfc: return AudioChannelSet::bottomFrontCentre; case Steinberg::Vst::kSpeakerBfr: return AudioChannelSet::bottomFrontRight; - case Steinberg::Vst::kSpeakerPl: return AudioChannelSet::wideLeft; - case Steinberg::Vst::kSpeakerPr: return AudioChannelSet::wideRight; + case Steinberg::Vst::kSpeakerPl: return AudioChannelSet::proximityLeft; + case Steinberg::Vst::kSpeakerPr: return AudioChannelSet::proximityRight; case Steinberg::Vst::kSpeakerBsl: return AudioChannelSet::bottomSideLeft; case Steinberg::Vst::kSpeakerBsr: return AudioChannelSet::bottomSideRight; case Steinberg::Vst::kSpeakerBrl: return AudioChannelSet::bottomRearLeft; case Steinberg::Vst::kSpeakerBrc: return AudioChannelSet::bottomRearCentre; case Steinberg::Vst::kSpeakerBrr: return AudioChannelSet::bottomRearRight; - default: break; } auto channelType = BigInteger (static_cast (type)).findNextSetBit (0); @@ -348,42 +348,125 @@ return static_cast (static_cast (AudioChannelSet::discreteChannel0) + 6 + (channelType - 33)); } +namespace detail +{ + struct LayoutPair + { + Steinberg::Vst::SpeakerArrangement arrangement; + std::initializer_list channelOrder; + }; + + using namespace Steinberg::Vst::SpeakerArr; + using X = AudioChannelSet; + + /* Maps VST3 layouts to the equivalent JUCE channels, in VST3 order. + + The channel types are taken from the equivalent JUCE AudioChannelSet, and then reordered to + match the VST3 speaker positions. + */ + const LayoutPair layoutTable[] + { + { kEmpty, {} }, + { kMono, { X::centre } }, + { kStereo, { X::left, X::right } }, + { k30Cine, { X::left, X::right, X::centre } }, + { k30Music, { X::left, X::right, X::surround } }, + { k40Cine, { X::left, X::right, X::centre, X::surround } }, + { k50, { X::left, X::right, X::centre, X::leftSurround, X::rightSurround } }, + { k51, { X::left, X::right, X::centre, X::LFE, X::leftSurround, X::rightSurround } }, + { k60Cine, { X::left, X::right, X::centre, X::leftSurround, X::rightSurround, X::centreSurround } }, + { k61Cine, { X::left, X::right, X::centre, X::LFE, X::leftSurround, X::rightSurround, X::centreSurround } }, + { k60Music, { X::left, X::right, X::leftSurround, X::rightSurround, X::leftSurroundSide, X::rightSurroundSide } }, + { k61Music, { X::left, X::right, X::LFE, X::leftSurround, X::rightSurround, X::leftSurroundSide, X::rightSurroundSide } }, + { k70Music, { X::left, X::right, X::centre, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide } }, + { k70Cine, { X::left, X::right, X::centre, X::leftSurround, X::rightSurround, X::leftCentre, X::rightCentre } }, + { k71Music, { X::left, X::right, X::centre, X::LFE, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide } }, + { k71Cine, { X::left, X::right, X::centre, X::LFE, X::leftSurround, X::rightSurround, X::leftCentre, X::rightCentre } }, + { k40Music, { X::left, X::right, X::leftSurround, X::rightSurround } }, + + { k51_4, { X::left, X::right, X::centre, X::LFE, X::leftSurround, X::rightSurround, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight } }, + { k50_4, { X::left, X::right, X::centre, X::leftSurround, X::rightSurround, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight } }, + { k71_2, { X::left, X::right, X::centre, X::LFE, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide, X::topSideLeft, X::topSideRight } }, + { k70_2, { X::left, X::right, X::centre, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide, X::topSideLeft, X::topSideRight } }, + { k71_4, { X::left, X::right, X::centre, X::LFE, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight } }, + { k70_4, { X::left, X::right, X::centre, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight } }, + { k71_6, { X::left, X::right, X::centre, X::LFE, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight, X::topSideLeft, X::topSideRight } }, + { k70_6, { X::left, X::right, X::centre, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight, X::topSideLeft, X::topSideRight } }, + + // The VST3 layout uses 'left/right' and 'left-of-center/right-of-center', but the JUCE layout uses 'left/right' and 'wide-left/wide-right'. + { k91_6, { X::wideLeft, X::wideRight, X::centre, X::LFE, X::leftSurroundRear, X::rightSurroundRear, X::left, X::right, X::leftSurroundSide, X::rightSurroundSide, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight, X::topSideLeft, X::topSideRight } }, + { k90_6, { X::wideLeft, X::wideRight, X::centre, X::leftSurroundRear, X::rightSurroundRear, X::left, X::right, X::leftSurroundSide, X::rightSurroundSide, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight, X::topSideLeft, X::topSideRight } }, + }; + + #if JUCE_DEBUG + static std::once_flag layoutTableCheckedFlag; + #endif +} + +inline bool isLayoutTableValid() +{ + for (const auto& item : detail::layoutTable) + if ((size_t) countNumberOfBits (item.arrangement) != item.channelOrder.size()) + return false; + + std::set arrangements; + + for (const auto& item : detail::layoutTable) + arrangements.insert (item.arrangement); + + if (arrangements.size() != (size_t) numElementsInArray (detail::layoutTable)) + return false; // There's a duplicate speaker arrangement + + return std::all_of (std::begin (detail::layoutTable), std::end (detail::layoutTable), [] (const auto& item) + { + return std::set (item.channelOrder).size() == item.channelOrder.size(); + }); +} + +static Array getSpeakerOrder (Steinberg::Vst::SpeakerArrangement arr) +{ + using namespace Steinberg::Vst; + using namespace Steinberg::Vst::SpeakerArr; + + #if JUCE_DEBUG + std::call_once (detail::layoutTableCheckedFlag, [] { jassert (isLayoutTableValid()); }); + #endif + + // Check if this is a layout with a hard-coded conversion + const auto arrangementMatches = [arr] (const auto& layoutPair) { return layoutPair.arrangement == arr; }; + const auto iter = std::find_if (std::begin (detail::layoutTable), std::end (detail::layoutTable), arrangementMatches); + + if (iter != std::end (detail::layoutTable)) + return iter->channelOrder; + + // There's no hard-coded conversion, so assume that the channels are in the same orders in both layouts. + const auto channels = getChannelCount (arr); + Array result; + result.ensureStorageAllocated (channels); + + for (auto i = 0; i < channels; ++i) + result.add (getChannelType (arr, getSpeaker (arr, i))); + + return result; +} + static Steinberg::Vst::SpeakerArrangement getVst3SpeakerArrangement (const AudioChannelSet& channels) noexcept { using namespace Steinberg::Vst::SpeakerArr; - if (channels == AudioChannelSet::disabled()) return kEmpty; - if (channels == AudioChannelSet::mono()) return kMono; - if (channels == AudioChannelSet::stereo()) return kStereo; - if (channels == AudioChannelSet::createLCR()) return k30Cine; - if (channels == AudioChannelSet::createLRS()) return k30Music; - if (channels == AudioChannelSet::createLCRS()) return k40Cine; - if (channels == AudioChannelSet::create5point0()) return k50; - if (channels == AudioChannelSet::create5point1()) return k51; - if (channels == AudioChannelSet::create6point0()) return k60Cine; - if (channels == AudioChannelSet::create6point1()) return k61Cine; - if (channels == AudioChannelSet::create6point0Music()) return k60Music; - if (channels == AudioChannelSet::create6point1Music()) return k61Music; - if (channels == AudioChannelSet::create7point0()) return k70Music; - if (channels == AudioChannelSet::create7point0SDDS()) return k70Cine; - if (channels == AudioChannelSet::create7point1()) return k71CineSideFill; - if (channels == AudioChannelSet::create7point1SDDS()) return k71Cine; - if (channels == AudioChannelSet::ambisonic()) return kAmbi1stOrderACN; - if (channels == AudioChannelSet::quadraphonic()) return k40Music; - if (channels == AudioChannelSet::create5point1point4()) return k51_4; - if (channels == AudioChannelSet::create7point0point2()) return k71_2 & ~(Steinberg::Vst::kSpeakerLfe); - if (channels == AudioChannelSet::create7point1point2()) return k71_2; - if (channels == AudioChannelSet::create7point0point4()) return k71_4 & ~(Steinberg::Vst::kSpeakerLfe); - if (channels == AudioChannelSet::create7point1point4()) return k71_4; - if (channels == AudioChannelSet::create7point1point6()) return k71_6; - if (channels == AudioChannelSet::create9point1point6()) return k91_6; - if (channels == AudioChannelSet::ambisonic (0)) return (1ull << 20); - if (channels == AudioChannelSet::ambisonic (1)) return (1ull << 20) | (1ull << 21) | (1ull << 22) | (1ull << 23); - #if VST_VERSION >= 0x030608 - if (channels == AudioChannelSet::ambisonic (2)) return kAmbi2cdOrderACN; - if (channels == AudioChannelSet::ambisonic (3)) return kAmbi3rdOrderACN; + #if JUCE_DEBUG + std::call_once (detail::layoutTableCheckedFlag, [] { jassert (isLayoutTableValid()); }); #endif + const auto channelSetMatches = [&channels] (const auto& layoutPair) + { + return AudioChannelSet::channelSetWithChannels (layoutPair.channelOrder) == channels; + }; + const auto iter = std::find_if (std::begin (detail::layoutTable), std::end (detail::layoutTable), channelSetMatches); + + if (iter != std::end (detail::layoutTable)) + return iter->arrangement; + Steinberg::Vst::SpeakerArrangement result = 0; for (const auto& type : channels.getChannelTypes()) @@ -392,59 +475,590 @@ return result; } -static AudioChannelSet getChannelSetForSpeakerArrangement (Steinberg::Vst::SpeakerArrangement arr) noexcept +inline AudioChannelSet getChannelSetForSpeakerArrangement (Steinberg::Vst::SpeakerArrangement arr) noexcept { using namespace Steinberg::Vst::SpeakerArr; - switch (arr) - { - case kEmpty: return AudioChannelSet::disabled(); - case kMono: return AudioChannelSet::mono(); - case kStereo: return AudioChannelSet::stereo(); - case k30Cine: return AudioChannelSet::createLCR(); - case k30Music: return AudioChannelSet::createLRS(); - case k40Cine: return AudioChannelSet::createLCRS(); - case k50: return AudioChannelSet::create5point0(); - case k51: return AudioChannelSet::create5point1(); - case k60Cine: return AudioChannelSet::create6point0(); - case k61Cine: return AudioChannelSet::create6point1(); - case k60Music: return AudioChannelSet::create6point0Music(); - case k61Music: return AudioChannelSet::create6point1Music(); - case k70Music: return AudioChannelSet::create7point0(); - case k70Cine: return AudioChannelSet::create7point0SDDS(); - case k71CineSideFill: return AudioChannelSet::create7point1(); - case k71Cine: return AudioChannelSet::create7point1SDDS(); - case k40Music: return AudioChannelSet::quadraphonic(); - case k71_2: return AudioChannelSet::create7point1point2(); - case k71_2 & ~(Steinberg::Vst::kSpeakerLfe): return AudioChannelSet::create7point0point2(); - case k71_4: return AudioChannelSet::create7point1point4(); - case k71_4 & ~(Steinberg::Vst::kSpeakerLfe): return AudioChannelSet::create7point0point4(); - case k71_6: return AudioChannelSet::create7point1point6(); - case (1 << 20): return AudioChannelSet::ambisonic (0); - case kAmbi1stOrderACN: return AudioChannelSet::ambisonic (1); - #if VST_VERSION >= 0x030608 - case kAmbi2cdOrderACN: return AudioChannelSet::ambisonic (2); - case kAmbi3rdOrderACN: return AudioChannelSet::ambisonic (3); - #endif - } - - AudioChannelSet result; - - BigInteger vstChannels (static_cast (arr)); - for (auto bit = vstChannels.findNextSetBit (0); bit != -1; bit = vstChannels.findNextSetBit (bit + 1)) - { - AudioChannelSet::ChannelType channelType = getChannelType (arr, 1ull << static_cast (bit)); - if (channelType != AudioChannelSet::unknown) - result.addChannel (channelType); - } + const auto result = AudioChannelSet::channelSetWithChannels (getSpeakerOrder (arr)); // VST3 <-> JUCE layout conversion error: report this bug to the JUCE forum - jassert (result.size() == vstChannels.countNumberOfSetBits()); + jassert (result.size() == getChannelCount (arr)); return result; } //============================================================================== +/* + Provides fast remapping of the channels on a single bus, from VST3 order to JUCE order. + + For multi-bus plugins, you'll need several instances of this, one per bus. +*/ +struct ChannelMapping +{ + ChannelMapping (const AudioChannelSet& layout, bool activeIn) + : indices (makeChannelIndices (layout)), active (activeIn) {} + + explicit ChannelMapping (const AudioChannelSet& layout) + : ChannelMapping (layout, true) {} + + explicit ChannelMapping (const AudioProcessor::Bus& bus) + : ChannelMapping (bus.getLastEnabledLayout(), bus.isEnabled()) {} + + int getJuceChannelForVst3Channel (int vst3Channel) const { return indices[(size_t) vst3Channel]; } + + size_t size() const { return indices.size(); } + + void setActive (bool x) { active = x; } + bool isActive() const { return active; } + +private: + /* Builds a table that provides the index of the corresponding JUCE channel, given a VST3 channel. + + Depending on the mapping, the VST3 arrangement and JUCE arrangement may not contain channels + that map 1:1 via getChannelType. For example, the VST3 7.1 layout contains + 'kSpeakerLs' which maps to the 'leftSurround' channel type, but the JUCE 7.1 layout does not + contain this channel type. As a result, we need to try to map the channels sensibly, even + if there's not a 'direct' mapping. + */ + static std::vector makeChannelIndices (const AudioChannelSet& juceArrangement) + { + const auto order = getSpeakerOrder (getVst3SpeakerArrangement (juceArrangement)); + + std::vector result; + + for (const auto& type : order) + result.push_back (juceArrangement.getChannelIndexForType (type)); + + return result; + } + + std::vector indices; + bool active = true; +}; + +class DynamicChannelMapping +{ +public: + DynamicChannelMapping (const AudioChannelSet& channelSet, bool active) + : set (channelSet), map (channelSet, active) {} + + explicit DynamicChannelMapping (const AudioChannelSet& channelSet) + : DynamicChannelMapping (channelSet, true) {} + + explicit DynamicChannelMapping (const AudioProcessor::Bus& bus) + : DynamicChannelMapping (bus.getLastEnabledLayout(), bus.isEnabled()) {} + + AudioChannelSet getAudioChannelSet() const { return set; } + int getJuceChannelForVst3Channel (int vst3Channel) const { return map.getJuceChannelForVst3Channel (vst3Channel); } + size_t size() const { return map.size(); } + + /* Returns true if the host has activated this bus. */ + bool isHostActive() const { return hostActive; } + /* Returns true if the AudioProcessor expects this bus to be active. */ + bool isClientActive() const { return map.isActive(); } + + void setHostActive (bool active) { hostActive = active; } + void setClientActive (bool active) { map.setActive (active); } + +private: + AudioChannelSet set; + ChannelMapping map; + bool hostActive = false; +}; + +//============================================================================== +inline auto& getAudioBusPointer (detail::Tag, Steinberg::Vst::AudioBusBuffers& data) { return data.channelBuffers32; } +inline auto& getAudioBusPointer (detail::Tag, Steinberg::Vst::AudioBusBuffers& data) { return data.channelBuffers64; } + +static inline int countUsedClientChannels (const std::vector& inputMap, + const std::vector& outputMap) +{ + const auto countUsedChannelsInVector = [] (const std::vector& map) + { + return std::accumulate (map.begin(), map.end(), 0, [] (auto acc, const auto& item) + { + return acc + (item.isClientActive() ? (int) item.size() : 0); + }); + }; + + return jmax (countUsedChannelsInVector (inputMap), countUsedChannelsInVector (outputMap)); +} + +template +class ScratchBuffer +{ +public: + void setSize (int numChannels, int blockSize) + { + buffer.setSize (numChannels, blockSize); + } + + void clear() { channelCounter = 0; } + + auto* getNextChannelBuffer() { return buffer.getWritePointer (channelCounter++); } + +private: + AudioBuffer buffer; + int channelCounter = 0; +}; + +template +static int countValidBuses (Steinberg::Vst::AudioBusBuffers* buffers, int32 num) +{ + return (int) std::distance (buffers, std::find_if (buffers, buffers + num, [] (auto& buf) + { + return getAudioBusPointer (detail::Tag{}, buf) == nullptr && buf.numChannels > 0; + })); +} + +template +static bool validateLayouts (Iterator first, Iterator last, const std::vector& map) +{ + if ((size_t) std::distance (first, last) > map.size()) + return false; + + auto mapIterator = map.begin(); + + for (auto it = first; it != last; ++it, ++mapIterator) + { + auto** busPtr = getAudioBusPointer (detail::Tag{}, *it); + const auto anyChannelIsNull = std::any_of (busPtr, busPtr + it->numChannels, [] (auto* ptr) { return ptr == nullptr; }); + + // Null channels are allowed if the bus is inactive + if ((mapIterator->isHostActive() && anyChannelIsNull) || ((int) mapIterator->size() != it->numChannels)) + return false; + } + + // If the host didn't provide the full complement of buses, it must be because the other + // buses are all deactivated. + return std::none_of (mapIterator, map.end(), [] (const auto& item) { return item.isHostActive(); }); +} + +/* + The main purpose of this class is to remap a set of buffers provided by the VST3 host into an + equivalent JUCE AudioBuffer using the JUCE channel layout/order. + + An instance of this class handles input and output remapping for a single data type (float or + double), matching the FloatType template parameter. + + This is in VST3Common.h, rather than in the VST3_Wrapper.cpp, so that we can test it. + + @see ClientBufferMapper +*/ +template +class ClientBufferMapperData +{ +public: + void prepare (int numChannels, int blockSize) + { + scratchBuffer.setSize (numChannels, blockSize); + channels.reserve ((size_t) jmin (128, numChannels)); + } + + AudioBuffer getMappedBuffer (Steinberg::Vst::ProcessData& data, + const std::vector& inputMap, + const std::vector& outputMap) + { + scratchBuffer.clear(); + channels.clear(); + + const auto usedChannels = countUsedClientChannels (inputMap, outputMap); + + // WaveLab workaround: This host may report the wrong number of inputs/outputs so re-count here + const auto vstInputs = countValidBuses (data.inputs, data.numInputs); + + if (! validateLayouts (data.inputs, data.inputs + vstInputs, inputMap)) + return getBlankBuffer (usedChannels, (int) data.numSamples); + + setUpInputChannels (data, (size_t) vstInputs, scratchBuffer, inputMap, channels); + setUpOutputChannels (scratchBuffer, outputMap, channels); + + return { channels.data(), (int) channels.size(), (int) data.numSamples }; + } + +private: + static void setUpInputChannels (Steinberg::Vst::ProcessData& data, + size_t vstInputs, + ScratchBuffer& scratchBuffer, + const std::vector& map, + std::vector& channels) + { + for (size_t busIndex = 0; busIndex < map.size(); ++busIndex) + { + const auto mapping = map[busIndex]; + + if (! mapping.isClientActive()) + continue; + + const auto originalSize = channels.size(); + + for (size_t channelIndex = 0; channelIndex < mapping.size(); ++channelIndex) + channels.push_back (scratchBuffer.getNextChannelBuffer()); + + if (mapping.isHostActive() && busIndex < vstInputs) + { + auto** busPtr = getAudioBusPointer (detail::Tag{}, data.inputs[busIndex]); + + for (size_t channelIndex = 0; channelIndex < mapping.size(); ++channelIndex) + { + FloatVectorOperations::copy (channels[(size_t) mapping.getJuceChannelForVst3Channel ((int) channelIndex) + originalSize], + busPtr[channelIndex], + (size_t) data.numSamples); + } + } + else + { + for (size_t channelIndex = 0; channelIndex < mapping.size(); ++channelIndex) + FloatVectorOperations::clear (channels[originalSize + channelIndex], (size_t) data.numSamples); + } + } + } + + static void setUpOutputChannels (ScratchBuffer& scratchBuffer, + const std::vector& map, + std::vector& channels) + { + for (size_t i = 0, initialBusIndex = 0; i < (size_t) map.size(); ++i) + { + const auto& mapping = map[i]; + + if (mapping.isClientActive()) + { + for (size_t j = 0; j < mapping.size(); ++j) + { + if (channels.size() <= initialBusIndex + j) + channels.push_back (scratchBuffer.getNextChannelBuffer()); + } + + initialBusIndex += mapping.size(); + } + } + } + + AudioBuffer getBlankBuffer (int usedChannels, int usedSamples) + { + // The host is ignoring the bus layout we requested, so we can't process sensibly! + jassertfalse; + + // Return a silent buffer for the AudioProcessor to process + for (auto i = 0; i < usedChannels; ++i) + { + channels.push_back (scratchBuffer.getNextChannelBuffer()); + FloatVectorOperations::clear (channels.back(), usedSamples); + } + + return { channels.data(), (int) channels.size(), usedSamples }; + } + + std::vector channels; + ScratchBuffer scratchBuffer; +}; + +//============================================================================== +/* + Remaps a set of buffers provided by the VST3 host into an equivalent JUCE AudioBuffer using the + JUCE channel layout/order. + + An instance of this class can remap to either a float or double JUCE buffer, as necessary. + + Although the VST3 spec requires that the bus layout does not change while the plugin is + activated and processing, some hosts get this wrong and try to enable/disable buses during + playback. This class attempts to be resilient, and should cope with buses being switched on and + off during processing. + + This is in VST3Common.h, rather than in the VST3_Wrapper.cpp, so that we can test it. + + @see ClientBufferMapper +*/ +class ClientBufferMapper +{ +public: + void updateFromProcessor (const AudioProcessor& processor) + { + struct Pair + { + std::vector& map; + bool isInput; + }; + + for (const auto& pair : { Pair { inputMap, true }, Pair { outputMap, false } }) + { + if (pair.map.empty()) + { + for (auto i = 0; i < processor.getBusCount (pair.isInput); ++i) + pair.map.emplace_back (*processor.getBus (pair.isInput, i)); + } + else + { + // The number of buses cannot change after creating a VST3 plugin! + jassert ((size_t) processor.getBusCount (pair.isInput) == pair.map.size()); + + for (size_t i = 0; i < (size_t) processor.getBusCount (pair.isInput); ++i) + { + pair.map[i] = [&] + { + DynamicChannelMapping replacement { *processor.getBus (pair.isInput, (int) i) }; + replacement.setHostActive (pair.map[i].isHostActive()); + return replacement; + }(); + } + } + } + } + + void prepare (int blockSize) + { + const auto findNumChannelsWhenAllBusesEnabled = [] (const auto& map) + { + return std::accumulate (map.cbegin(), map.cend(), 0, [] (auto acc, const auto& item) + { + return acc + (int) item.size(); + }); + }; + + const auto numChannels = jmax (findNumChannelsWhenAllBusesEnabled (inputMap), + findNumChannelsWhenAllBusesEnabled (outputMap)); + + floatData .prepare (numChannels, blockSize); + doubleData.prepare (numChannels, blockSize); + } + + void updateActiveClientBuses (const AudioProcessor::BusesLayout& clientBuses) + { + if ( (size_t) clientBuses.inputBuses .size() != inputMap .size() + || (size_t) clientBuses.outputBuses.size() != outputMap.size()) + { + jassertfalse; + return; + } + + const auto sync = [] (auto& map, auto& client) + { + for (size_t i = 0; i < map.size(); ++i) + { + jassert (client[(int) i] == AudioChannelSet::disabled() || client[(int) i] == map[i].getAudioChannelSet()); + map[i].setClientActive (client[(int) i] != AudioChannelSet::disabled()); + } + }; + + sync (inputMap, clientBuses.inputBuses); + sync (outputMap, clientBuses.outputBuses); + } + + void setInputBusHostActive (size_t bus, bool state) { setHostActive (inputMap, bus, state); } + void setOutputBusHostActive (size_t bus, bool state) { setHostActive (outputMap, bus, state); } + + auto& getData (detail::Tag) { return floatData; } + auto& getData (detail::Tag) { return doubleData; } + + AudioChannelSet getRequestedLayoutForInputBus (size_t bus) const + { + return getRequestedLayoutForBus (inputMap, bus); + } + + AudioChannelSet getRequestedLayoutForOutputBus (size_t bus) const + { + return getRequestedLayoutForBus (outputMap, bus); + } + + const std::vector& getInputMap() const { return inputMap; } + const std::vector& getOutputMap() const { return outputMap; } + +private: + static void setHostActive (std::vector& map, size_t bus, bool state) + { + if (bus < map.size()) + map[bus].setHostActive (state); + } + + static AudioChannelSet getRequestedLayoutForBus (const std::vector& map, size_t bus) + { + if (bus < map.size() && map[bus].isHostActive()) + return map[bus].getAudioChannelSet(); + + return AudioChannelSet::disabled(); + } + + ClientBufferMapperData floatData; + ClientBufferMapperData doubleData; + + std::vector inputMap; + std::vector outputMap; +}; + +//============================================================================== +/* Holds a buffer in the JUCE channel layout, and a reference to a Vst ProcessData struct, and + copies each JUCE channel to the appropriate host output channel when this object goes + out of scope. +*/ +template +class ClientRemappedBuffer +{ +public: + ClientRemappedBuffer (ClientBufferMapperData& mapperData, + const std::vector* inputMapIn, + const std::vector* outputMapIn, + Steinberg::Vst::ProcessData& hostData) + : buffer (mapperData.getMappedBuffer (hostData, *inputMapIn, *outputMapIn)), + outputMap (outputMapIn), + data (hostData) + {} + + ClientRemappedBuffer (ClientBufferMapper& mapperIn, Steinberg::Vst::ProcessData& hostData) + : ClientRemappedBuffer (mapperIn.getData (detail::Tag{}), + &mapperIn.getInputMap(), + &mapperIn.getOutputMap(), + hostData) + {} + + ~ClientRemappedBuffer() + { + // WaveLab workaround: This host may report the wrong number of inputs/outputs so re-count here + const auto vstOutputs = (size_t) countValidBuses (data.outputs, data.numOutputs); + + if (validateLayouts (data.outputs, data.outputs + vstOutputs, *outputMap)) + copyToHostOutputBuses (vstOutputs); + else + clearHostOutputBuses (vstOutputs); + } + + AudioBuffer buffer; + +private: + void copyToHostOutputBuses (size_t vstOutputs) const + { + for (size_t i = 0, juceBusOffset = 0; i < outputMap->size(); ++i) + { + const auto& mapping = (*outputMap)[i]; + + if (mapping.isHostActive() && i < vstOutputs) + { + auto& bus = data.outputs[i]; + + if (mapping.isClientActive()) + { + for (size_t j = 0; j < mapping.size(); ++j) + { + auto* hostChannel = getAudioBusPointer (detail::Tag{}, bus)[j]; + const auto juceChannel = juceBusOffset + (size_t) mapping.getJuceChannelForVst3Channel ((int) j); + FloatVectorOperations::copy (hostChannel, buffer.getReadPointer ((int) juceChannel), (size_t) data.numSamples); + } + } + else + { + for (size_t j = 0; j < mapping.size(); ++j) + { + auto* hostChannel = getAudioBusPointer (detail::Tag{}, bus)[j]; + FloatVectorOperations::clear (hostChannel, (size_t) data.numSamples); + } + } + } + + if (mapping.isClientActive()) + juceBusOffset += mapping.size(); + } + } + + void clearHostOutputBuses (size_t vstOutputs) const + { + // The host provided us with an unexpected bus layout. + jassertfalse; + + std::for_each (data.outputs, data.outputs + vstOutputs, [this] (auto& bus) + { + auto** busPtr = getAudioBusPointer (detail::Tag{}, bus); + std::for_each (busPtr, busPtr + bus.numChannels, [this] (auto* ptr) + { + if (ptr != nullptr) + FloatVectorOperations::clear (ptr, (int) data.numSamples); + }); + }); + } + + const std::vector* outputMap = nullptr; + Steinberg::Vst::ProcessData& data; + + JUCE_DECLARE_NON_COPYABLE (ClientRemappedBuffer) + JUCE_DECLARE_NON_MOVEABLE (ClientRemappedBuffer) +}; + +//============================================================================== +/* + Remaps a JUCE buffer to an equivalent VST3 layout. + + An instance of this class handles mappings for both float and double buffers, but in a single + direction (input or output). +*/ +class HostBufferMapper +{ +public: + /* Builds a cached map of juce <-> vst3 channel mappings. */ + void prepare (std::vector arrangements) + { + mappings = std::move (arrangements); + + floatBusMap .resize (mappings.size()); + doubleBusMap.resize (mappings.size()); + busBuffers .resize (mappings.size()); + } + + /* Applies the mapping to an AudioBuffer using JUCE channel layout. */ + template + Steinberg::Vst::AudioBusBuffers* getVst3LayoutForJuceBuffer (AudioBuffer& source) + { + int channelIndexOffset = 0; + + for (size_t i = 0; i < mappings.size(); ++i) + { + const auto& mapping = mappings[i]; + associateBufferTo (busBuffers[i], get (detail::Tag{})[i], source, mapping, channelIndexOffset); + channelIndexOffset += mapping.isActive() ? (int) mapping.size() : 0; + } + + return busBuffers.data(); + } + +private: + template + using Bus = std::vector; + + template + using BusMap = std::vector>; + + static void assignRawPointer (Steinberg::Vst::AudioBusBuffers& vstBuffers, float** raw) { vstBuffers.channelBuffers32 = raw; } + static void assignRawPointer (Steinberg::Vst::AudioBusBuffers& vstBuffers, double** raw) { vstBuffers.channelBuffers64 = raw; } + + template + void associateBufferTo (Steinberg::Vst::AudioBusBuffers& vstBuffers, + Bus& bus, + AudioBuffer& buffer, + const ChannelMapping& busMap, + int channelStartOffset) const + { + bus.clear(); + + for (size_t i = 0; i < busMap.size(); ++i) + { + bus.push_back (busMap.isActive() ? buffer.getWritePointer (channelStartOffset + busMap.getJuceChannelForVst3Channel ((int) i)) + : nullptr); + } + + assignRawPointer (vstBuffers, bus.data()); + vstBuffers.numChannels = (Steinberg::int32) busMap.size(); + vstBuffers.silenceFlags = busMap.isActive() ? 0 : std::numeric_limits::max(); + } + + auto& get (detail::Tag) { return floatBusMap; } + auto& get (detail::Tag) { return doubleBusMap; } + + BusMap floatBusMap; + BusMap doubleBusMap; + + std::vector busBuffers; + std::vector mappings; +}; + +//============================================================================== template class VSTComSmartPtr { @@ -600,31 +1214,23 @@ if (eventList.getEvent (i, e) != Steinberg::kResultOk) continue; - const auto message = toMidiMessage (e); - - if (message.isValid) - result.addEvent (message.item, e.sampleOffset); + if (const auto message = toMidiMessage (e)) + result.addEvent (*message, e.sampleOffset); } } - static void hostToPluginEventList (Steinberg::Vst::IEventList& result, MidiBuffer& midiBuffer, - Steinberg::Vst::IParameterChanges* parameterChanges, - const StoredMidiMapping& midiMapping) - { - toEventList (result, - midiBuffer, - parameterChanges, - &midiMapping, - EventConversionKind::hostToPlugin); + template + static void hostToPluginEventList (Steinberg::Vst::IEventList& result, + MidiBuffer& midiBuffer, + StoredMidiMapping& mapping, + Callback&& callback) + { + toEventList (result, midiBuffer, &mapping, callback); } static void pluginToHostEventList (Steinberg::Vst::IEventList& result, MidiBuffer& midiBuffer) { - toEventList (result, - midiBuffer, - nullptr, - nullptr, - EventConversionKind::pluginToHost); + toEventList (result, midiBuffer, nullptr, [] (auto&&...) {}); } private: @@ -640,51 +1246,70 @@ pluginToHost }; - static void toEventList (Steinberg::Vst::IEventList& result, MidiBuffer& midiBuffer, - Steinberg::Vst::IParameterChanges* parameterChanges, - const StoredMidiMapping* midiMapping, - EventConversionKind kind) + template + static bool sendMappedParameter (const MidiMessage& msg, + StoredMidiMapping* midiMapping, + Callback&& callback) { - enum { maxNumEvents = 2048 }; // Steinberg's Host Checker states that no more than 2048 events are allowed at once - int numEvents = 0; + if (midiMapping == nullptr) + return false; - for (const auto metadata : midiBuffer) - { - if (++numEvents > maxNumEvents) - break; + const auto controlEvent = toVst3ControlEvent (msg); - auto msg = metadata.getMessage(); + if (! controlEvent.hasValue()) + return false; - if (midiMapping != nullptr && parameterChanges != nullptr) - { - Vst3MidiControlEvent controlEvent; + const auto controlParamID = midiMapping->getMapping (createSafeChannel (msg.getChannel()), + controlEvent->controllerNumber); - if (toVst3ControlEvent (msg, controlEvent)) - { - const auto controlParamID = midiMapping->getMapping (createSafeChannel (msg.getChannel()), - controlEvent.controllerNumber); + if (controlParamID != Steinberg::Vst::kNoParamId) + callback (controlParamID, controlEvent->paramValue); - if (controlParamID != Steinberg::Vst::kNoParamId) - { - Steinberg::int32 ignore; + return true; + } - if (auto* queue = parameterChanges->addParameterData (controlParamID, ignore)) - queue->addPoint (metadata.samplePosition, controlEvent.paramValue, ignore); - } + template + static void processMidiMessage (Steinberg::Vst::IEventList& result, + const MidiMessageMetadata metadata, + StoredMidiMapping* midiMapping, + Callback&& callback) + { + const auto msg = metadata.getMessage(); - continue; - } - } + if (sendMappedParameter (msg, midiMapping, std::forward (callback))) + return; - auto maybeEvent = createVstEvent (msg, metadata.data, kind); + const auto kind = midiMapping != nullptr ? EventConversionKind::hostToPlugin + : EventConversionKind::pluginToHost; - if (! maybeEvent.isValid) - continue; + auto maybeEvent = createVstEvent (msg, metadata.data, kind); + + if (! maybeEvent.hasValue()) + return; + + maybeEvent->busIndex = 0; + maybeEvent->sampleOffset = metadata.samplePosition; + result.addEvent (*maybeEvent); + } - auto& e = maybeEvent.item; - e.busIndex = 0; - e.sampleOffset = metadata.samplePosition; - result.addEvent (e); + /* If mapping is non-null, the conversion is assumed to be host-to-plugin, or otherwise + plugin-to-host. + */ + template + static void toEventList (Steinberg::Vst::IEventList& result, + MidiBuffer& midiBuffer, + StoredMidiMapping* midiMapping, + Callback&& callback) + { + enum { maxNumEvents = 2048 }; // Steinberg's Host Checker states that no more than 2048 events are allowed at once + int numEvents = 0; + + for (const auto metadata : midiBuffer) + { + if (++numEvents > maxNumEvents) + break; + + processMidiMessage (result, metadata, midiMapping, std::forward (callback)); } } @@ -801,19 +1426,9 @@ msg.getQuarterFrameValue()); } - template - struct BasicOptional final - { - BasicOptional() noexcept = default; - BasicOptional (const Item& i) noexcept : item { i }, isValid { true } {} - - Item item; - bool isValid{}; - }; - - static BasicOptional createVstEvent (const MidiMessage& msg, - const uint8* midiEventData, - EventConversionKind kind) noexcept + static Optional createVstEvent (const MidiMessage& msg, + const uint8* midiEventData, + EventConversionKind kind) noexcept { if (msg.isNoteOn()) return createNoteOnEvent (msg); @@ -857,7 +1472,7 @@ return {}; } - static BasicOptional toMidiMessage (const Steinberg::Vst::LegacyMIDICCOutEvent& e) + static Optional toMidiMessage (const Steinberg::Vst::LegacyMIDICCOutEvent& e) { if (e.controlNumber <= 127) return MidiMessage::controllerEvent (createSafeChannel (int16 (e.channel)), @@ -894,7 +1509,7 @@ } } - static BasicOptional toMidiMessage (const Steinberg::Vst::Event& e) + static Optional toMidiMessage (const Steinberg::Vst::Event& e) { switch (e.type) { @@ -941,205 +1556,24 @@ Steinberg::Vst::ParamValue paramValue; }; - static bool toVst3ControlEvent (const MidiMessage& msg, Vst3MidiControlEvent& result) + static Optional toVst3ControlEvent (const MidiMessage& msg) { if (msg.isController()) - { - result = { (Steinberg::Vst::CtrlNumber) msg.getControllerNumber(), msg.getControllerValue() / 127.0}; - return true; - } + return Vst3MidiControlEvent { (Steinberg::Vst::CtrlNumber) msg.getControllerNumber(), msg.getControllerValue() / 127.0 }; if (msg.isPitchWheel()) - { - result = { Steinberg::Vst::kPitchBend, msg.getPitchWheelValue() / 16383.0}; - return true; - } + return Vst3MidiControlEvent { Steinberg::Vst::kPitchBend, msg.getPitchWheelValue() / 16383.0}; if (msg.isChannelPressure()) - { - result = { Steinberg::Vst::kAfterTouch, msg.getChannelPressureValue() / 127.0}; - return true; - } + return Vst3MidiControlEvent { Steinberg::Vst::kAfterTouch, msg.getChannelPressureValue() / 127.0}; - result.controllerNumber = -1; - return false; + return {}; } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiEventList) }; //============================================================================== -template -struct VST3BufferExchange -{ - using Bus = Array; - using BusMap = Array; - - static void assignRawPointer (Steinberg::Vst::AudioBusBuffers& vstBuffers, float** raw) { vstBuffers.channelBuffers32 = raw; } - static void assignRawPointer (Steinberg::Vst::AudioBusBuffers& vstBuffers, double** raw) { vstBuffers.channelBuffers64 = raw; } - - /** Assigns a series of AudioBuffer's channels to an AudioBusBuffers' - @warning For speed, does not check the channel count and offsets according to the AudioBuffer - */ - static void associateBufferTo (Steinberg::Vst::AudioBusBuffers& vstBuffers, - Bus& bus, - AudioBuffer& buffer, - int numChannels, int channelStartOffset, - int sampleOffset = 0) - { - const int channelEnd = numChannels + channelStartOffset; - jassert (channelEnd >= 0 && channelEnd <= buffer.getNumChannels()); - - bus.clearQuick(); - - for (int i = channelStartOffset; i < channelEnd; ++i) - bus.add (buffer.getWritePointer (i, sampleOffset)); - - assignRawPointer (vstBuffers, (numChannels > 0 ? bus.getRawDataPointer() : nullptr)); - vstBuffers.numChannels = numChannels; - vstBuffers.silenceFlags = 0; - } - - static void mapArrangementToBuses (int& channelIndexOffset, int index, - Array& result, - BusMap& busMapToUse, const AudioChannelSet& arrangement, - AudioBuffer& source) - { - const int numChansForBus = arrangement.size(); - - if (index >= result.size()) - result.add (Steinberg::Vst::AudioBusBuffers()); - - if (index >= busMapToUse.size()) - busMapToUse.add (Bus()); - - associateBufferTo (result.getReference (index), - busMapToUse.getReference (index), - source, numChansForBus, channelIndexOffset); - - channelIndexOffset += numChansForBus; - } - - static void mapBufferToBuses (Array& result, BusMap& busMapToUse, - const Array& arrangements, - AudioBuffer& source) - { - int channelIndexOffset = 0; - - for (int i = 0; i < arrangements.size(); ++i) - mapArrangementToBuses (channelIndexOffset, i, result, busMapToUse, - arrangements.getUnchecked (i), source); - } - - static void mapBufferToBuses (Array& result, - Steinberg::Vst::IAudioProcessor& processor, - BusMap& busMapToUse, bool isInput, int numBuses, - AudioBuffer& source) - { - int channelIndexOffset = 0; - - for (int i = 0; i < numBuses; ++i) - mapArrangementToBuses (channelIndexOffset, i, - result, busMapToUse, - getArrangementForBus (&processor, isInput, i), - source); - } -}; - -template -struct VST3FloatAndDoubleBusMapCompositeHelper {}; - -struct VST3FloatAndDoubleBusMapComposite -{ - VST3BufferExchange::BusMap floatVersion; - VST3BufferExchange::BusMap doubleVersion; - - template - inline typename VST3BufferExchange::BusMap& get() { return VST3FloatAndDoubleBusMapCompositeHelper::get (*this); } -}; - - -template <> struct VST3FloatAndDoubleBusMapCompositeHelper -{ - static VST3BufferExchange::BusMap& get (VST3FloatAndDoubleBusMapComposite& impl) { return impl.floatVersion; } -}; - -template <> struct VST3FloatAndDoubleBusMapCompositeHelper -{ - static VST3BufferExchange::BusMap& get (VST3FloatAndDoubleBusMapComposite& impl) { return impl.doubleVersion; } -}; - -//============================================================================== -class FloatCache -{ - using FlagType = uint32_t; - -public: - FloatCache() = default; - - explicit FloatCache (size_t sizeIn) - : values (sizeIn), - flags (divCeil (sizeIn, numFlagBits)) - { - std::fill (values.begin(), values.end(), 0.0f); - std::fill (flags.begin(), flags.end(), 0); - } - - size_t size() const noexcept { return values.size(); } - - void setWithoutNotifying (size_t index, float value) - { - jassert (index < size()); - values[index].store (value, std::memory_order_relaxed); - } - - void set (size_t index, float value) - { - jassert (index < size()); - const auto previous = values[index].exchange (value, std::memory_order_relaxed); - const auto bit = previous == value ? ((FlagType) 0) : ((FlagType) 1 << (index % numFlagBits)); - flags[index / numFlagBits].fetch_or (bit, std::memory_order_acq_rel); - } - - float get (size_t index) const noexcept - { - jassert (index < size()); - return values[index].load (std::memory_order_relaxed); - } - - /* Calls the supplied callback for any entries which have been modified - since the last call to this function. - */ - template - void ifSet (Callback&& callback) - { - for (size_t flagIndex = 0; flagIndex < flags.size(); ++flagIndex) - { - const auto prevFlags = flags[flagIndex].exchange (0, std::memory_order_acq_rel); - - for (size_t bit = 0; bit < numFlagBits; ++bit) - { - if (prevFlags & ((FlagType) 1 << bit)) - { - const auto itemIndex = (flagIndex * numFlagBits) + bit; - callback (itemIndex, values[itemIndex].load (std::memory_order_relaxed)); - } - } - } - } - -private: - static constexpr size_t numFlagBits = 8 * sizeof (FlagType); - - static constexpr size_t divCeil (size_t a, size_t b) - { - return (a / b) + ((a % b) != 0); - } - - std::vector> values; - std::vector> flags; -}; - /* Provides very quick polling of all parameter states. We must iterate all parameters on each processBlock call to check whether any @@ -1163,15 +1597,15 @@ Steinberg::Vst::ParamID getParamID (Steinberg::int32 index) const noexcept { return paramIds[(size_t) index]; } - void set (Steinberg::int32 index, float value) { floatCache.set ((size_t) index, value); } - void setWithoutNotifying (Steinberg::int32 index, float value) { floatCache.setWithoutNotifying ((size_t) index, value); } + void set (Steinberg::int32 index, float value) { floatCache.setValueAndBits ((size_t) index, value, 1); } + void setWithoutNotifying (Steinberg::int32 index, float value) { floatCache.setValue ((size_t) index, value); } float get (Steinberg::int32 index) const noexcept { return floatCache.get ((size_t) index); } template void ifSet (Callback&& callback) { - floatCache.ifSet ([&] (size_t index, float value) + floatCache.ifSet ([&] (size_t index, float value, uint32_t) { callback ((Steinberg::int32) index, value); }); @@ -1179,9 +1613,10 @@ private: std::vector paramIds; - FloatCache floatCache; + FlaggedFloatCache<1> floatCache; }; +//============================================================================== /* Ensures that a 'restart' call only ever happens on the main thread. */ class ComponentRestarter : private AsyncUpdater { diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VST3Headers.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VST3Headers.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VST3Headers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VST3Headers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,6 +23,8 @@ ============================================================================== */ +#pragma once + #if JUCE_BSD && ! JUCE_CUSTOM_VST3_SDK #error To build JUCE VST3 plug-ins on BSD you must use an external BSD-compatible VST3 SDK with JUCE_CUSTOM_VST3_SDK=1 #endif @@ -30,7 +32,8 @@ // Wow, those Steinberg guys really don't worry too much about compiler warnings. JUCE_BEGIN_IGNORE_WARNINGS_LEVEL_MSVC (0, 4505 4702 6011 6031 6221 6386 6387 6330 6001 28199) -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnon-virtual-dtor", +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-copy-dtor", + "-Wnon-virtual-dtor", "-Wreorder", "-Wunsequenced", "-Wint-to-pointer-cast", @@ -63,7 +66,8 @@ "-Wmissing-prototypes", "-Wtype-limits", "-Wcpp", - "-W#warnings") + "-W#warnings", + "-Wmaybe-uninitialized") #undef DEVELOPMENT #define DEVELOPMENT 0 // This avoids a Clang warning in Steinberg code about unused values @@ -103,6 +107,8 @@ #include #include #include + + #include "pslextensions/ipslviewembedding.h" #else // needed for VST_VERSION #include @@ -153,6 +159,8 @@ #include #endif + #include "pslextensions/ipslviewembedding.h" + //============================================================================== namespace Steinberg { @@ -175,6 +183,12 @@ DEF_CLASS_IID (Linux::IEventHandler) #endif } + +namespace Presonus +{ + DEF_CLASS_IID (IPlugInViewEmbedding) +} + #endif // JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY JUCE_END_IGNORE_WARNINGS_MSVC diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,6 +27,18 @@ #include "juce_VST3Headers.h" #include "juce_VST3Common.h" +#include "juce_ARACommon.h" + +#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) +#include + +namespace ARA +{ +DEF_CLASS_IID (IMainFactory) +DEF_CLASS_IID (IPlugInEntryPoint) +DEF_CLASS_IID (IPlugInEntryPoint2) +} +#endif namespace juce { @@ -144,7 +156,7 @@ }; //============================================================================== -std::array getNormalisedTUID (const TUID& tuid) noexcept +static std::array getNormalisedTUID (const TUID& tuid) noexcept { const FUID fuid { tuid }; return { { fuid.getLong1(), fuid.getLong2(), fuid.getLong3(), fuid.getLong4() } }; @@ -247,7 +259,9 @@ } //============================================================================== -static void toProcessContext (Vst::ProcessContext& context, AudioPlayHead* playHead, double sampleRate) +static void toProcessContext (Vst::ProcessContext& context, + AudioPlayHead* playHead, + double sampleRate) { jassert (sampleRate > 0.0); //Must always be valid, as stated by the VST3 SDK @@ -255,53 +269,72 @@ zerostruct (context); context.sampleRate = sampleRate; - auto& fr = context.frameRate; - if (playHead != nullptr) + const auto position = playHead != nullptr ? playHead->getPosition() + : nullopt; + + if (position.hasValue()) { - AudioPlayHead::CurrentPositionInfo position; - playHead->getCurrentPosition (position); + if (const auto timeInSamples = position->getTimeInSamples()) + context.projectTimeSamples = *timeInSamples; + else + jassertfalse; // The time in samples *must* be valid. - context.projectTimeSamples = position.timeInSamples; // Must always be valid, as stated by the VST3 SDK - context.projectTimeMusic = position.ppqPosition; // Does not always need to be valid... - context.tempo = position.bpm; - context.timeSigNumerator = position.timeSigNumerator; - context.timeSigDenominator = position.timeSigDenominator; - context.barPositionMusic = position.ppqPositionOfLastBarStart; - context.cycleStartMusic = position.ppqLoopStart; - context.cycleEndMusic = position.ppqLoopEnd; + if (const auto tempo = position->getBpm()) + { + context.state |= ProcessContext::kTempoValid; + context.tempo = *tempo; + } - context.frameRate.framesPerSecond = (Steinberg::uint32) position.frameRate.getBaseRate(); - context.frameRate.flags = (Steinberg::uint32) ((position.frameRate.isDrop() ? FrameRate::kDropRate : 0) - | (position.frameRate.isPullDown() ? FrameRate::kPullDownRate : 0)); + if (const auto loop = position->getLoopPoints()) + { + context.state |= ProcessContext::kCycleValid; + context.cycleStartMusic = loop->ppqStart; + context.cycleEndMusic = loop->ppqEnd; + } - if (position.isPlaying) context.state |= ProcessContext::kPlaying; - if (position.isRecording) context.state |= ProcessContext::kRecording; - if (position.isLooping) context.state |= ProcessContext::kCycleActive; - } - else - { - context.tempo = 120.0; - context.timeSigNumerator = 4; - context.timeSigDenominator = 4; - fr.framesPerSecond = 30; - fr.flags = 0; - } + if (const auto sig = position->getTimeSignature()) + { + context.state |= ProcessContext::kTimeSigValid; + context.timeSigNumerator = sig->numerator; + context.timeSigDenominator = sig->denominator; + } - if (context.projectTimeMusic >= 0.0) context.state |= ProcessContext::kProjectTimeMusicValid; - if (context.barPositionMusic >= 0.0) context.state |= ProcessContext::kBarPositionValid; - if (context.tempo > 0.0) context.state |= ProcessContext::kTempoValid; - if (context.frameRate.framesPerSecond > 0) context.state |= ProcessContext::kSmpteValid; + if (const auto pos = position->getPpqPosition()) + { + context.state |= ProcessContext::kProjectTimeMusicValid; + context.projectTimeMusic = *pos; + } - if (context.cycleStartMusic >= 0.0 - && context.cycleEndMusic > 0.0 - && context.cycleEndMusic > context.cycleStartMusic) - { - context.state |= ProcessContext::kCycleValid; - } + if (const auto barStart = position->getPpqPositionOfLastBarStart()) + { + context.state |= ProcessContext::kBarPositionValid; + context.barPositionMusic = *barStart; + } + + if (const auto frameRate = position->getFrameRate()) + { + if (const auto offset = position->getEditOriginTime()) + { + context.state |= ProcessContext::kSmpteValid; + context.smpteOffsetSubframes = (Steinberg::int32) (80.0 * *offset * frameRate->getEffectiveRate()); + context.frameRate.framesPerSecond = (Steinberg::uint32) frameRate->getBaseRate(); + context.frameRate.flags = (Steinberg::uint32) ((frameRate->isDrop() ? FrameRate::kDropRate : 0) + | (frameRate->isPullDown() ? FrameRate::kPullDownRate : 0)); + } + } + + if (const auto hostTime = position->getHostTimeNs()) + { + context.state |= ProcessContext::kSystemTimeValid; + context.systemTime = (int64_t) *hostTime; + jassert (context.systemTime >= 0); + } - if (context.timeSigNumerator > 0 && context.timeSigDenominator > 0) - context.state |= ProcessContext::kTimeSigValid; + if (position->getIsPlaying()) context.state |= ProcessContext::kPlaying; + if (position->getIsRecording()) context.state |= ProcessContext::kRecording; + if (position->getIsLooping()) context.state |= ProcessContext::kCycleActive; + } } //============================================================================== @@ -801,6 +834,20 @@ auto numClasses = factory->countClasses(); + // Every ARA::IMainFactory must have a matching Steinberg::IComponent. + // The match is determined by the two classes having the same name. + std::unordered_set araMainFactoryClassNames; + + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + for (Steinberg::int32 i = 0; i < numClasses; ++i) + { + PClassInfo info; + factory->getClassInfo (i, &info); + if (std::strcmp (info.category, kARAMainFactoryClass) == 0) + araMainFactoryClassNames.insert (info.name); + } + #endif + for (Steinberg::int32 i = 0; i < numClasses; ++i) { PClassInfo info; @@ -864,6 +911,9 @@ } } + if (araMainFactoryClassNames.find (name) != araMainFactoryClassNames.end()) + desc.hasARAExtension = true; + if (desc.uniqueId != 0) result = performOnDescription (desc); @@ -1327,10 +1377,75 @@ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3ModuleHandle) }; +template +static int compareWithString (Type (&charArray)[N], const String& str) +{ + return std::strncmp (str.toRawUTF8(), + charArray, + std::min (str.getNumBytesAsUTF8(), (size_t) numElementsInArray (charArray))); +} + +template +static void forEachARAFactory (IPluginFactory* pluginFactory, Callback&& cb) +{ + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + const auto numClasses = pluginFactory->countClasses(); + for (Steinberg::int32 i = 0; i < numClasses; ++i) + { + PClassInfo info; + pluginFactory->getClassInfo (i, &info); + + if (std::strcmp (info.category, kARAMainFactoryClass) == 0) + { + const bool keepGoing = cb (info); + if (! keepGoing) + break; + } + } + #else + ignoreUnused (pluginFactory, cb); + #endif +} + +static std::shared_ptr getARAFactory (Steinberg::IPluginFactory* pluginFactory, const String& pluginName) +{ + std::shared_ptr factory; + + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + forEachARAFactory (pluginFactory, + [&pluginFactory, &pluginName, &factory] (const auto& pcClassInfo) + { + if (compareWithString (pcClassInfo.name, pluginName) == 0) + { + ARA::IMainFactory* source; + if (pluginFactory->createInstance (pcClassInfo.cid, ARA::IMainFactory::iid, (void**) &source) + == Steinberg::kResultOk) + { + factory = getOrCreateARAFactory (source->getFactory(), + [source] (const ARA::ARAFactory*) { source->release(); }); + return false; + } + jassert (source == nullptr); + } + + return true; + }); + #else + ignoreUnused (pluginFactory, pluginName); + #endif + + return factory; +} + +static std::shared_ptr getARAFactory (VST3ModuleHandle& module) +{ + auto* pluginFactory = module.getPluginFactory(); + return getARAFactory (pluginFactory, module.getName()); +} + //============================================================================== struct VST3PluginWindow : public AudioProcessorEditor, private ComponentMovementWatcher, - private ComponentPeer::ScaleFactorListener, private IPlugFrame { VST3PluginWindow (AudioPluginInstance* owner, IPlugView* pluginView) @@ -1348,9 +1463,7 @@ warnOnFailure (view->setFrame (this)); view->queryInterface (Steinberg::IPlugViewContentScaleSupport::iid, (void**) &scaleInterface); - if (scaleInterface != nullptr) - warnOnFailure (scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) nativeScaleFactor)); - + setContentScaleFactor(); resizeToFit(); } @@ -1359,13 +1472,13 @@ if (scaleInterface != nullptr) scaleInterface->release(); - removeScaleFactorListener(); - #if JUCE_LINUX || JUCE_BSD embeddedComponent.removeClient(); #endif - warnOnFailure (view->removed()); + if (attachedCalled) + warnOnFailure (view->removed()); + warnOnFailure (view->setFrame (nullptr)); processor.editorBeingDeleted (this); @@ -1418,16 +1531,19 @@ private: //============================================================================== - void componentPeerChanged() override + void componentPeerChanged() override {} + + /* Convert from the component's coordinate system to the hosted VST3's coordinate system. */ + ViewRect componentToVST3Rect (Rectangle r) const { - removeScaleFactorListener(); - currentPeer = getTopLevelComponent()->getPeer(); + const auto physical = localAreaToGlobal (r) * nativeScaleFactor * getDesktopScaleFactor(); + return { 0, 0, physical.getWidth(), physical.getHeight() }; + } - if (currentPeer != nullptr) - { - currentPeer->addScaleFactorListener (this); - nativeScaleFactor = (float) currentPeer->getPlatformScaleFactor(); - } + /* Convert from the hosted VST3's coordinate system to the component's coordinate system. */ + Rectangle vst3ToComponentRect (const ViewRect& vr) const + { + return getLocalArea (nullptr, Rectangle { vr.right, vr.bottom } / (nativeScaleFactor * getDesktopScaleFactor())); } void componentMovedOrResized (bool, bool wasResized) override @@ -1435,44 +1551,34 @@ if (recursiveResize || ! wasResized || getTopLevelComponent()->getPeer() == nullptr) return; - ViewRect rect; - if (view->canResize() == kResultTrue) { - rect.right = (Steinberg::int32) roundToInt ((float) getWidth() * nativeScaleFactor); - rect.bottom = (Steinberg::int32) roundToInt ((float) getHeight() * nativeScaleFactor); - + auto rect = componentToVST3Rect (getLocalBounds()); view->checkSizeConstraint (&rect); { const ScopedValueSetter recursiveResizeSetter (recursiveResize, true); - setSize (roundToInt ((float) rect.getWidth() / nativeScaleFactor), - roundToInt ((float) rect.getHeight() / nativeScaleFactor)); + const auto logicalSize = vst3ToComponentRect (rect); + setSize (logicalSize.getWidth(), logicalSize.getHeight()); } - #if JUCE_WINDOWS - setPluginWindowPos (rect); - #else embeddedComponent.setBounds (getLocalBounds()); - #endif view->onSize (&rect); } else { + ViewRect rect; warnOnFailure (view->getSize (&rect)); - #if JUCE_WINDOWS - setPluginWindowPos (rect); - #else - resizeWithRect (embeddedComponent, rect, nativeScaleFactor); - #endif + resizeWithRect (embeddedComponent, rect); } // Some plugins don't update their cursor correctly when mousing out the window Desktop::getInstance().getMainMouseSource().forceMouseCursorUpdate(); } + using ComponentMovementWatcher::componentMovedOrResized; void componentVisibilityChanged() override @@ -1481,20 +1587,14 @@ resizeToFit(); componentMovedOrResized (true, true); } - using ComponentMovementWatcher::componentVisibilityChanged; - void nativeScaleFactorChanged (double newScaleFactor) override - { - nativeScaleFactor = (float) newScaleFactor; - updatePluginScale(); - componentMovedOrResized (false, true); - } + using ComponentMovementWatcher::componentVisibilityChanged; void resizeToFit() { ViewRect rect; warnOnFailure (view->getSize (&rect)); - resizeWithRect (*this, rect, nativeScaleFactor); + resizeWithRect (*this, rect); } tresult PLUGIN_API resizeView (IPlugView* incomingView, ViewRect* newSize) override @@ -1503,34 +1603,28 @@ if (incomingView != nullptr && newSize != nullptr && incomingView == view) { - auto scaleToViewRect = [this] (int dimension) - { - return (Steinberg::int32) roundToInt ((float) dimension * nativeScaleFactor); - }; - - auto oldWidth = scaleToViewRect (getWidth()); - auto oldHeight = scaleToViewRect (getHeight()); - - resizeWithRect (embeddedComponent, *newSize, nativeScaleFactor); + const auto oldPhysicalSize = componentToVST3Rect (getLocalBounds()); + const auto logicalSize = vst3ToComponentRect (*newSize); + setSize (logicalSize.getWidth(), logicalSize.getHeight()); + embeddedComponent.setSize (logicalSize.getWidth(), logicalSize.getHeight()); #if JUCE_WINDOWS - setPluginWindowPos (*newSize); + embeddedComponent.updateHWNDBounds(); + #elif JUCE_LINUX || JUCE_BSD + embeddedComponent.updateEmbeddedBounds(); #endif - setSize (embeddedComponent.getWidth(), embeddedComponent.getHeight()); - // According to the VST3 Workflow Diagrams, a resizeView from the plugin should // always trigger a response from the host which confirms the new size. - ViewRect rect { 0, 0, - scaleToViewRect (getWidth()), - scaleToViewRect (getHeight()) }; + auto currentPhysicalSize = componentToVST3Rect (getLocalBounds()); - if (rect.right != oldWidth || rect.bottom != oldHeight + if (currentPhysicalSize.getWidth() != oldPhysicalSize.getWidth() + || currentPhysicalSize.getHeight() != oldPhysicalSize.getHeight() || ! isInOnSize) { // Guard against plug-ins immediately calling resizeView() with the same size const ScopedValueSetter inOnSizeSetter (isInOnSize, true); - view->onSize (&rect); + view->onSize (¤tPhysicalSize); } return kResultTrue; @@ -1541,10 +1635,11 @@ } //============================================================================== - static void resizeWithRect (Component& comp, const ViewRect& rect, float scaleFactor) + void resizeWithRect (Component& comp, const ViewRect& rect) const { - comp.setSize (jmax (10, std::abs (roundToInt ((float) rect.getWidth() / scaleFactor))), - jmax (10, std::abs (roundToInt ((float) rect.getHeight() / scaleFactor)))); + const auto logicalSize = vst3ToComponentRect (rect); + comp.setSize (jmax (10, logicalSize.getWidth()), + jmax (10, logicalSize.getHeight())); } void attachPluginWindow() @@ -1552,19 +1647,16 @@ if (pluginHandle == HandleFormat{}) { #if JUCE_WINDOWS - if (auto* topComp = getTopLevelComponent()) - { - peer.reset (embeddedComponent.createNewPeer (0, topComp->getWindowHandle())); - pluginHandle = (HandleFormat) peer->getNativeHandle(); - } - #else + pluginHandle = static_cast (embeddedComponent.getHWND()); + #endif + embeddedComponent.setBounds (getLocalBounds()); addAndMakeVisible (embeddedComponent); - #if JUCE_MAC - pluginHandle = (HandleFormat) embeddedComponent.getView(); - #elif JUCE_LINUX || JUCE_BSD - pluginHandle = (HandleFormat) embeddedComponent.getHostWindowID(); - #endif + + #if JUCE_MAC + pluginHandle = (HandleFormat) embeddedComponent.getView(); + #elif JUCE_LINUX || JUCE_BSD + pluginHandle = (HandleFormat) embeddedComponent.getHostWindowID(); #endif if (pluginHandle == HandleFormat{}) @@ -1573,61 +1665,80 @@ return; } - warnOnFailure (view->attached ((void*) pluginHandle, defaultVST3WindowType)); - updatePluginScale(); - } - } + const auto attachedResult = view->attached ((void*) pluginHandle, defaultVST3WindowType); + ignoreUnused (warnOnFailure (attachedResult)); - void removeScaleFactorListener() - { - if (currentPeer == nullptr) - return; + if (attachedResult == kResultOk) + attachedCalled = true; - for (int i = 0; i < ComponentPeer::getNumPeers(); ++i) - if (ComponentPeer::getPeer (i) == currentPeer) - currentPeer->removeScaleFactorListener (this); + updatePluginScale(); + } } void updatePluginScale() { if (scaleInterface != nullptr) - warnOnFailure (scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) nativeScaleFactor)); + setContentScaleFactor(); else resizeToFit(); } + void setContentScaleFactor() + { + if (scaleInterface != nullptr) + { + const auto result = scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) getEffectiveScale()); + ignoreUnused (result); + + #if ! JUCE_MAC + ignoreUnused (warnOnFailure (result)); + #endif + } + } + + void setScaleFactor (float s) override + { + userScaleFactor = s; + setContentScaleFactor(); + resizeToFit(); + } + + float getEffectiveScale() const + { + return nativeScaleFactor * userScaleFactor; + } + //============================================================================== Atomic refCount { 1 }; VSTComSmartPtr view; #if JUCE_WINDOWS - struct ChildComponent : public Component - { - ChildComponent() { setOpaque (true); } - void paint (Graphics& g) override { g.fillAll (Colours::cornflowerblue); } - using Component::createNewPeer; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildComponent) - }; + using HandleFormat = HWND; - void setPluginWindowPos (ViewRect rect) + struct ViewComponent : public HWNDComponent { - if (auto* topComp = getTopLevelComponent()) + ViewComponent() { - auto pos = (topComp->getLocalPoint (this, Point()) * nativeScaleFactor).roundToInt(); - - ScopedThreadDPIAwarenessSetter threadDpiAwarenessSetter { pluginHandle }; + setOpaque (true); + inner.addToDesktop (0); - SetWindowPos (pluginHandle, nullptr, - pos.x, pos.y, - rect.getWidth(), rect.getHeight(), - isVisible() ? SWP_SHOWWINDOW : SWP_HIDEWINDOW); + if (auto* peer = inner.getPeer()) + setHWND (peer->getNativeHandle()); } - } - ChildComponent embeddedComponent; - std::unique_ptr peer; - using HandleFormat = HWND; + void paint (Graphics& g) override { g.fillAll (Colours::black); } + + private: + struct Inner : public Component + { + Inner() { setOpaque (true); } + void paint (Graphics& g) override { g.fillAll (Colours::black); } + }; + + Inner inner; + }; + + ViewComponent embeddedComponent; #elif JUCE_MAC NSViewComponentWithParent embeddedComponent; using HandleFormat = NSView*; @@ -1641,11 +1752,37 @@ #endif HandleFormat pluginHandle = {}; - bool recursiveResize = false, isInOnSize = false; + bool recursiveResize = false, isInOnSize = false, attachedCalled = false; - ComponentPeer* currentPeer = nullptr; Steinberg::IPlugViewContentScaleSupport* scaleInterface = nullptr; float nativeScaleFactor = 1.0f; + float userScaleFactor = 1.0f; + + struct ScaleNotifierCallback + { + VST3PluginWindow& window; + + void operator() (float platformScale) const + { + MessageManager::callAsync ([ref = Component::SafePointer (&window), platformScale] + { + if (auto* r = ref.getComponent()) + { + r->nativeScaleFactor = platformScale; + r->setContentScaleFactor(); + r->resizeToFit(); + + #if JUCE_WINDOWS + r->embeddedComponent.updateHWNDBounds(); + #elif JUCE_LINUX || JUCE_BSD + r->embeddedComponent.updateEmbeddedBounds(); + #endif + } + }); + } + }; + + NativeScaleFactorNotifier scaleNotifier { this, ScaleNotifierCallback { *this } }; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3PluginWindow) @@ -1654,6 +1791,27 @@ JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996) // warning about overriding deprecated methods //============================================================================== +static bool hasARAExtension (IPluginFactory* pluginFactory, const String& pluginClassName) +{ + bool result = false; + + forEachARAFactory (pluginFactory, + [&pluginClassName, &result] (const auto& pcClassInfo) + { + if (compareWithString (pcClassInfo.name, pluginClassName) == 0) + { + result = true; + + return false; + } + + return true; + }); + + return result; +} + +//============================================================================== struct VST3ComponentHolder { VST3ComponentHolder (const VST3ModuleHandle::Ptr& m) : module (m) @@ -1669,16 +1827,33 @@ // transfers ownership to the plugin instance! AudioPluginInstance* createPluginInstance(); + bool isIComponentAlsoIEditController() const + { + if (component == nullptr) + { + jassertfalse; + return false; + } + + return VSTComSmartPtr().loadFrom (component); + } + bool fetchController (VSTComSmartPtr& editController) { if (! isComponentInitialised && ! initialise()) return false; + editController.loadFrom (component); + // Get the IEditController: TUID controllerCID = { 0 }; - if (component->getControllerClassId (controllerCID) == kResultTrue && FUID (controllerCID).isValid()) + if (editController == nullptr + && component->getControllerClassId (controllerCID) == kResultTrue + && FUID (controllerCID).isValid()) + { editController.loadFrom (factory, controllerCID); + } if (editController == nullptr) { @@ -1695,9 +1870,6 @@ } } - if (editController == nullptr) - editController.loadFrom (component); - return (editController != nullptr); } @@ -1764,6 +1936,8 @@ totalNumInputChannels, totalNumOutputChannels); + description.hasARAExtension = hasARAExtension (factory, description.name); + return; } @@ -2044,18 +2218,6 @@ void setValue (float newValue) override { pluginInstance.cachedParamValues.set (vstParamIndex, newValue); - pluginInstance.parameterDispatcher.push (vstParamIndex, newValue); - } - - /* If the editor set the value, there's no need to notify it that the parameter - value changed. Instead, we set the cachedValue (which will be read by the - processor during the next processBlock) and notify listeners that the parameter - has changed. - */ - void setValueFromEditor (float newValue) - { - pluginInstance.cachedParamValues.set (vstParamIndex, newValue); - sendValueChangedMessageToListeners (newValue); } /* If we're syncing the editor to the processor, the processor won't need to @@ -2150,13 +2312,13 @@ const Steinberg::int32 vstParamIndex; const Steinberg::Vst::ParamID paramID; const bool automatable; - const bool discrete = getNumSteps() != AudioProcessor::getDefaultNumParameterSteps(); const int numSteps = [&] { auto stepCount = getParameterInfo().stepCount; return stepCount == 0 ? AudioProcessor::getDefaultNumParameterSteps() : stepCount + 1; }(); + const bool discrete = getNumSteps() != AudioProcessor::getDefaultNumParameterSteps(); }; //============================================================================== @@ -2171,32 +2333,7 @@ ~VST3PluginInstance() override { - struct VST3Deleter : public CallbackMessage - { - VST3Deleter (VST3PluginInstance& inInstance, WaitableEvent& inEvent) - : vst3Instance (inInstance), completionSignal (inEvent) - {} - - void messageCallback() override - { - vst3Instance.cleanup(); - completionSignal.signal(); - } - - VST3PluginInstance& vst3Instance; - WaitableEvent& completionSignal; - }; - - if (MessageManager::getInstance()->isThisTheMessageThread()) - { - cleanup(); - } - else - { - WaitableEvent completionEvent; - (new VST3Deleter (*this, completionEvent))->post(); - completionEvent.wait(); - } + callOnMessageThread ([this] { cleanup(); }); } void cleanup() @@ -2213,7 +2350,7 @@ editController->setComponentHandler (nullptr); - if (isControllerInitialised) + if (isControllerInitialised && ! holder->isIComponentAlsoIEditController()) editController->terminate(); holder->terminate(); @@ -2245,8 +2382,10 @@ if (! (isControllerInitialised || holder->fetchController (editController))) return false; - // (May return an error if the plugin combines the IComponent and IEditController implementations) - editController->initialize (holder->host->getFUnknown()); + // If the IComponent and IEditController are the same, we will have + // already initialized the object at this point and should avoid doing so again. + if (! holder->isIComponentAlsoIEditController()) + editController->initialize (holder->host->getFUnknown()); isControllerInitialised = true; editController->setComponentHandler (holder->host); @@ -2277,7 +2416,8 @@ void getExtensions (ExtensionsVisitor& visitor) const override { - struct Extensions : public ExtensionsVisitor::VST3Client + struct Extensions : public ExtensionsVisitor::VST3Client, + public ExtensionsVisitor::ARAClient { explicit Extensions (const VST3PluginInstance* instanceIn) : instance (instanceIn) {} @@ -2290,10 +2430,21 @@ return instance->setStateFromPresetFile (rawData); } + void createARAFactoryAsync (std::function cb) const noexcept override + { + cb (ARAFactoryWrapper { ::juce::getARAFactory (*(instance->holder->module)) }); + } + const VST3PluginInstance* instance = nullptr; }; - visitor.visitVST3Client (Extensions { this }); + Extensions extensions { this }; + visitor.visitVST3Client (extensions); + + if (::juce::getARAFactory (*(holder->module))) + { + visitor.visitARAClient (extensions); + } } void* getPlatformSpecificData() override { return holder->component; } @@ -2401,7 +2552,9 @@ warnOnFailure (holder->component->activateBus (Vst::kAudio, Vst::kOutput, i, getBus (false, i)->isEnabled() ? 1 : 0)); setLatencySamples (jmax (0, (int) processor->getLatencySamples())); - cachedBusLayouts = getBusesLayout(); + + inputBusMap .prepare (createChannelMappings (true)); + outputBusMap.prepare (createChannelMappings (false)); setStateForAllMidiBuses (true); @@ -2420,13 +2573,13 @@ isActive = false; - setStateForAllMidiBuses (false); - if (processor != nullptr) warnOnFailureIfImplemented (processor->setProcessing (false)); if (holder->component != nullptr) warnOnFailure (holder->component->setActive (false)); + + setStateForAllMidiBuses (false); } bool supportsDoublePrecisionProcessing() const override @@ -2542,6 +2695,11 @@ inputParameterChanges->set (cachedParamValues.getParamID (index), value); }); + inputParameterChanges->forEach ([&] (Steinberg::int32 index, float value) + { + parameterDispatcher.push (index, value); + }); + processor->process (data); outputParameterChanges->forEach ([&] (Steinberg::int32 index, float value) @@ -2634,12 +2792,9 @@ // call releaseResources first! jassert (! isActive); - bool result = syncBusLayouts (layouts); - - // didn't succeed? Make sure it's back in it's original state - if (! result) - syncBusLayouts (getBusesLayout()); - + const auto previousLayout = getBusesLayout(); + const auto result = syncBusLayouts (layouts); + syncBusLayouts (previousLayout); return result; } @@ -2903,7 +3058,7 @@ MemoryBlock getStateForPresetFile() const { - VSTComSmartPtr memoryStream = new Steinberg::MemoryStream(); + VSTComSmartPtr memoryStream (new Steinberg::MemoryStream(), false); if (memoryStream == nullptr || holder->component == nullptr) return {}; @@ -2921,8 +3076,8 @@ bool setStateFromPresetFile (const MemoryBlock& rawData) const { - MemoryBlock rawDataCopy (rawData); - VSTComSmartPtr memoryStream = new Steinberg::MemoryStream (rawDataCopy.getData(), (int) rawDataCopy.getSize()); + auto rawDataCopy = rawData; + VSTComSmartPtr memoryStream (new Steinberg::MemoryStream (rawDataCopy.getData(), (int) rawDataCopy.getSize()), false); if (memoryStream == nullptr || holder->component == nullptr) return false; @@ -2949,7 +3104,6 @@ ignoreUnused (data, sizeInBytes); } - private: //============================================================================== #if JUCE_LINUX || JUCE_BSD @@ -2983,9 +3137,7 @@ even if there aren't enough channels to process, as very poorly specified by the Steinberg SDK */ - VST3FloatAndDoubleBusMapComposite inputBusMap, outputBusMap; - Array inputBuses, outputBuses; - AudioProcessor::BusesLayout cachedBusLayouts; + HostBufferMapper inputBusMap, outputBusMap; StringArray programNames; Vst::ParamID programParameterID = (Vst::ParamID) -1; @@ -3010,7 +3162,9 @@ { Steinberg::MemoryStream stream; - if (object->getState (&stream) == kResultTrue) + const auto result = object->getState (&stream); + + if (result == kResultTrue) { MemoryBlock info (stream.getData(), (size_t) stream.getSize()); head.createNewChildElement (identifier)->addTextElement (info.toBase64Encoding()); @@ -3098,7 +3252,7 @@ if ((paramInfo.flags & Vst::ParameterInfo::kIsBypass) != 0) bypassParam = param; - std::function findOrCreateGroup; + std::function findOrCreateGroup; findOrCreateGroup = [&groupMap, &infoMap, &findOrCreateGroup] (Vst::UnitID groupID) { auto existingGroup = groupMap.find (groupID); @@ -3180,6 +3334,17 @@ setStateForAllBusesOfType (holder->component, newState, false, false); // Activate/deactivate MIDI outputs } + std::vector createChannelMappings (bool isInput) const + { + std::vector result; + result.reserve ((size_t) getBusCount (isInput)); + + for (auto i = 0; i < getBusCount (isInput); ++i) + result.emplace_back (*getBus (isInput, i)); + + return result; + } + void setupIO() { setStateForAllMidiBuses (true); @@ -3192,7 +3357,8 @@ warnOnFailure (processor->setupProcessing (setup)); - cachedBusLayouts = getBusesLayout(); + inputBusMap .prepare (createChannelMappings (true)); + outputBusMap.prepare (createChannelMappings (false)); setRateAndBufferSizeDetails (setup.sampleRate, (int) setup.maxSamplesPerBlock); } @@ -3269,7 +3435,7 @@ /** @note An IPlugView, when first created, should start with a ref-count of 1! */ IPlugView* tryCreatingView() const { - JUCE_ASSERT_MESSAGE_THREAD + JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED IPlugView* v = editController->createView (Vst::ViewType::kEditor); @@ -3283,11 +3449,8 @@ template void associateWith (Vst::ProcessData& destination, AudioBuffer& buffer) { - VST3BufferExchange::mapBufferToBuses (inputBuses, inputBusMap.get(), cachedBusLayouts.inputBuses, buffer); - VST3BufferExchange::mapBufferToBuses (outputBuses, outputBusMap.get(), cachedBusLayouts.outputBuses, buffer); - - destination.inputs = inputBuses.getRawDataPointer(); - destination.outputs = outputBuses.getRawDataPointer(); + destination.inputs = inputBusMap .getVst3LayoutForJuceBuffer (buffer); + destination.outputs = outputBusMap.getVst3LayoutForJuceBuffer (buffer); } void associateWith (Vst::ProcessData& destination, MidiBuffer& midiBuffer) @@ -3299,8 +3462,12 @@ { MidiEventList::hostToPluginEventList (*midiInputs, midiBuffer, - destination.inputParameterChanges, - storedMidiMapping); + storedMidiMapping, + [this] (const auto controlID, const auto paramValue) + { + if (auto* param = this->getParameterForID (controlID)) + param->setValueNotifyingHost ((float) paramValue); + }); } destination.inputEvents = midiInputs; @@ -3445,7 +3612,7 @@ if (auto* param = plugin->getParameterForID (paramID)) { - param->setValueFromEditor ((float) valueNormalised); + param->setValueNotifyingHost ((float) valueNormalised); // did the plug-in already update the parameter internally if (plugin->editController->getParamNormalized (paramID) != (float) valueNormalised) @@ -3647,6 +3814,22 @@ } } +void VST3PluginFormat::createARAFactoryAsync (const PluginDescription& description, ARAFactoryCreationCallback callback) +{ + if (! description.hasARAExtension) + { + jassertfalse; + callback ({ {}, "The provided plugin does not support ARA features" }); + } + + File file (description.fileOrIdentifier); + VSTComSmartPtr pluginFactory ( + DLLHandleCache::getInstance()->findOrCreateHandle (file.getFullPathName()).getPluginFactory()); + const auto* pluginName = description.name.toRawUTF8(); + + callback ({ ARAFactoryWrapper { ::juce::getARAFactory (pluginFactory, pluginName) }, {} }); +} + void VST3PluginFormat::createPluginInstance (const PluginDescription& description, double, int, PluginCreationCallback callback) { @@ -3746,12 +3929,13 @@ FileSearchPath VST3PluginFormat::getDefaultLocationsToSearch() { #if JUCE_WINDOWS - auto programFiles = File::getSpecialLocation (File::globalApplicationsDirectory).getFullPathName(); - return FileSearchPath (programFiles + "\\Common Files\\VST3"); + const auto localAppData = File::getSpecialLocation (File::windowsLocalAppData) .getFullPathName(); + const auto programFiles = File::getSpecialLocation (File::globalApplicationsDirectory).getFullPathName(); + return FileSearchPath (localAppData + "\\Programs\\Common\\VST3;" + programFiles + "\\Common Files\\VST3"); #elif JUCE_MAC - return FileSearchPath ("/Library/Audio/Plug-Ins/VST3;~/Library/Audio/Plug-Ins/VST3"); + return FileSearchPath ("~/Library/Audio/Plug-Ins/VST3;/Library/Audio/Plug-Ins/VST3"); #else - return FileSearchPath ("/usr/lib/vst3/;/usr/local/lib/vst3/;~/.vst3/"); + return FileSearchPath ("~/.vst3/;/usr/lib/vst3/;/usr/local/lib/vst3/"); #endif } diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -68,6 +68,7 @@ StringArray searchPathsForPlugins (const FileSearchPath&, bool recursive, bool) override; bool doesPluginStillExist (const PluginDescription&) override; FileSearchPath getDefaultLocationsToSearch() override; + void createARAFactoryAsync (const PluginDescription&, ARAFactoryCreationCallback callback) override; private: //============================================================================== diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,658 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "juce_VST3Headers.h" +#include "juce_VST3Common.h" + +namespace juce +{ + +class VST3PluginFormatTests : public UnitTest +{ +public: + VST3PluginFormatTests() + : UnitTest ("VST3 Hosting", UnitTestCategories::audioProcessors) + { + } + + void runTest() override + { + beginTest ("ChannelMapping for a stereo bus performs no remapping"); + { + ChannelMapping map (AudioChannelSet::stereo()); + expect (map.size() == 2); + + expect (map.getJuceChannelForVst3Channel (0) == 0); // L -> left + expect (map.getJuceChannelForVst3Channel (1) == 1); // R -> right + } + + beginTest ("ChannelMapping for a 9.1.6 bus remaps the channels appropriately"); + { + ChannelMapping map (AudioChannelSet::create9point1point6()); + expect (map.size() == 16); + + // VST3 order is: + // L + // R + // C + // Lfe + // Ls + // Rs + // Lc + // Rc + // Sl + // Sr + // Tfl + // Tfr + // Trl + // Trr + // Tsl + // Tsr + // JUCE order is: + // Left + // Right + // Centre + // LFE + // Left Surround Side + // Right Surround Side + // Top Front Left + // Top Front Right + // Top Rear Left + // Top Rear Right + // Left Surround Rear + // Right Surround Rear + // Wide Left + // Wide Right + // Top Side Left + // Top Side Right + + expect (map.getJuceChannelForVst3Channel (0) == 12); // L -> wideLeft + expect (map.getJuceChannelForVst3Channel (1) == 13); // R -> wideRight + expect (map.getJuceChannelForVst3Channel (2) == 2); // C -> centre + expect (map.getJuceChannelForVst3Channel (3) == 3); // Lfe -> LFE + expect (map.getJuceChannelForVst3Channel (4) == 10); // Ls -> leftSurroundRear + expect (map.getJuceChannelForVst3Channel (5) == 11); // Rs -> rightSurroundRear + expect (map.getJuceChannelForVst3Channel (6) == 0); // Lc -> left + expect (map.getJuceChannelForVst3Channel (7) == 1); // Rc -> right + expect (map.getJuceChannelForVst3Channel (8) == 4); // Sl -> leftSurroundSide + expect (map.getJuceChannelForVst3Channel (9) == 5); // Sl -> leftSurroundSide + expect (map.getJuceChannelForVst3Channel (10) == 6); // Tfl -> topFrontLeft + expect (map.getJuceChannelForVst3Channel (11) == 7); // Tfr -> topFrontRight + expect (map.getJuceChannelForVst3Channel (12) == 8); // Trl -> topRearLeft + expect (map.getJuceChannelForVst3Channel (13) == 9); // Trr -> topRearRight + expect (map.getJuceChannelForVst3Channel (14) == 14); // Tsl -> topSideLeft + expect (map.getJuceChannelForVst3Channel (15) == 15); // Tsr -> topSideRight + } + + const auto blockSize = 128; + + beginTest ("If the host provides more buses than the plugin knows about, the remapped buffer is silent and uses only internal channels"); + { + ClientBufferMapperData remapper; + remapper.prepare (2, blockSize * 2); + + const std::vector emptyBuses; + const std::vector stereoBus { DynamicChannelMapping { AudioChannelSet::stereo() } }; + + TestBuffers testBuffers { blockSize }; + + auto ins = MultiBusBuffers{}.withBus (testBuffers, 2).withBus (testBuffers, 1); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 2).withBus (testBuffers, 1); + auto data = makeProcessData (blockSize, ins, outs); + + for (const auto& config : { Config { stereoBus, stereoBus }, Config { emptyBuses, stereoBus }, Config { stereoBus, emptyBuses } }) + { + testBuffers.init(); + + { + const ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == config.getNumChannels()); + expect (remapped.getNumSamples() == blockSize); + + for (auto i = 0; i < remapped.getNumChannels(); ++i) + expect (allMatch (remapped, i, 0.0f)); + } + + expect (! testBuffers.isClear (0)); + expect (! testBuffers.isClear (1)); + expect (! testBuffers.isClear (2)); + expect (testBuffers.isClear (3)); + expect (testBuffers.isClear (4)); + expect (testBuffers.isClear (5)); + } + } + + beginTest ("If the host provides fewer buses than the plugin knows about, the remapped buffer is silent and uses only internal channels"); + { + ClientBufferMapperData remapper; + remapper.prepare (3, blockSize * 2); + + const std::vector noBus; + const std::vector oneBus { DynamicChannelMapping { AudioChannelSet::mono() } }; + const std::vector twoBuses { DynamicChannelMapping { AudioChannelSet::mono() }, + DynamicChannelMapping { AudioChannelSet::stereo() } }; + + TestBuffers testBuffers { blockSize }; + + auto ins = MultiBusBuffers{}.withBus (testBuffers, 1); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 1); + auto data = makeProcessData (blockSize, ins, outs); + + for (const auto& config : { Config { noBus, twoBuses }, + Config { twoBuses, noBus }, + Config { oneBus, twoBuses }, + Config { twoBuses, oneBus }, + Config { twoBuses, twoBuses } }) + { + testBuffers.init(); + + { + const ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == config.getNumChannels()); + expect (remapped.getNumSamples() == blockSize); + + // The remapped buffer will only be cleared if the host's input layout does not + // match the client's input layout. + if (config.ins.size() != 1) + for (auto i = 0; i < remapped.getNumChannels(); ++i) + expect (allMatch (remapped, i, 0.0f)); + } + + expect (! testBuffers.isClear (0)); + expect (testBuffers.isClear (1)); + } + } + + beginTest ("If the host channel count on any bus is incorrect, the remapped buffer is silent and uses only internal channels"); + { + ClientBufferMapperData remapper; + remapper.prepare (3, blockSize * 2); + + const std::vector monoBus { DynamicChannelMapping { AudioChannelSet::mono() } }; + const std::vector stereoBus { DynamicChannelMapping { AudioChannelSet::stereo() } }; + + TestBuffers testBuffers { blockSize }; + + auto ins = MultiBusBuffers{}.withBus (testBuffers, 1); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 2); + auto data = makeProcessData (blockSize, ins, outs); + + for (const auto& config : { Config { stereoBus, monoBus }, + Config { stereoBus, stereoBus }, + Config { monoBus, monoBus } }) + { + testBuffers.init(); + + { + const ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == config.getNumChannels()); + expect (remapped.getNumSamples() == blockSize); + + // The remapped buffer will only be cleared if the host's input layout does not + // match the client's input layout. + if (config.ins.front().size() != 1) + for (auto i = 0; i < remapped.getNumChannels(); ++i) + expect (allMatch (remapped, i, 0.0f)); + } + + expect (! testBuffers.isClear (0)); + expect (testBuffers.isClear (1)); + expect (testBuffers.isClear (2)); + } + } + + beginTest ("A layout with more output channels than input channels leaves unused inputs untouched"); + { + ClientBufferMapperData remapper; + remapper.prepare (20, blockSize * 2); + + const Config config { { DynamicChannelMapping { AudioChannelSet::mono() }, + DynamicChannelMapping { AudioChannelSet::create5point1() } }, + { DynamicChannelMapping { AudioChannelSet::stereo() }, + DynamicChannelMapping { AudioChannelSet::create7point1() } } }; + + TestBuffers testBuffers { blockSize }; + + auto ins = MultiBusBuffers{}.withBus (testBuffers, 1).withBus (testBuffers, 6); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 2).withBus (testBuffers, 8); + + auto data = makeProcessData (blockSize, ins, outs); + + testBuffers.init(); + + { + ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == 10); + + // Data from the input channels is copied to the correct channels of the remapped buffer + expect (allMatch (remapped, 0, 1.0f)); + expect (allMatch (remapped, 1, 2.0f)); + expect (allMatch (remapped, 2, 3.0f)); + expect (allMatch (remapped, 3, 4.0f)); + expect (allMatch (remapped, 4, 5.0f)); + expect (allMatch (remapped, 5, 6.0f)); + expect (allMatch (remapped, 6, 7.0f)); + // The remaining channels are output-only, so they may contain any data + + // Write some data to the buffer in JUCE layout + for (auto i = 0; i < remapped.getNumChannels(); ++i) + { + auto* ptr = remapped.getWritePointer (i); + std::fill (ptr, ptr + remapped.getNumSamples(), (float) i); + } + } + + // Channels are copied back to the correct output buffer + expect (channelStartsWithValue (data.outputs[0], 0, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 1, 1.0f)); + + expect (channelStartsWithValue (data.outputs[1], 0, 2.0f)); + expect (channelStartsWithValue (data.outputs[1], 1, 3.0f)); + expect (channelStartsWithValue (data.outputs[1], 2, 4.0f)); + expect (channelStartsWithValue (data.outputs[1], 3, 5.0f)); + expect (channelStartsWithValue (data.outputs[1], 4, 8.0f)); // JUCE surround side -> VST3 surround side + expect (channelStartsWithValue (data.outputs[1], 5, 9.0f)); + expect (channelStartsWithValue (data.outputs[1], 6, 6.0f)); // JUCE surround rear -> VST3 surround rear + expect (channelStartsWithValue (data.outputs[1], 7, 7.0f)); + } + + beginTest ("A layout with more input channels than output channels doesn't attempt to output any input channels"); + { + ClientBufferMapperData remapper; + remapper.prepare (15, blockSize * 2); + + const Config config { { DynamicChannelMapping { AudioChannelSet::create7point1point6() }, + DynamicChannelMapping { AudioChannelSet::mono() } }, + { DynamicChannelMapping { AudioChannelSet::createLCRS() }, + DynamicChannelMapping { AudioChannelSet::stereo() } } }; + + TestBuffers testBuffers { blockSize }; + + auto ins = MultiBusBuffers{}.withBus (testBuffers, 14).withBus (testBuffers, 1); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 4) .withBus (testBuffers, 2); + + auto data = makeProcessData (blockSize, ins, outs); + + testBuffers.init(); + + { + ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == 15); + + // Data from the input channels is copied to the correct channels of the remapped buffer + expect (allMatch (remapped, 0, 1.0f)); + expect (allMatch (remapped, 1, 2.0f)); + expect (allMatch (remapped, 2, 3.0f)); + expect (allMatch (remapped, 3, 4.0f)); + expect (allMatch (remapped, 4, 7.0f)); + expect (allMatch (remapped, 5, 8.0f)); + expect (allMatch (remapped, 6, 9.0f)); + expect (allMatch (remapped, 7, 10.0f)); + expect (allMatch (remapped, 8, 11.0f)); + expect (allMatch (remapped, 9, 12.0f)); + expect (allMatch (remapped, 10, 5.0f)); + expect (allMatch (remapped, 11, 6.0f)); + expect (allMatch (remapped, 12, 13.0f)); + expect (allMatch (remapped, 13, 14.0f)); + expect (allMatch (remapped, 14, 15.0f)); + + // Write some data to the buffer in JUCE layout + for (auto i = 0; i < remapped.getNumChannels(); ++i) + { + auto* ptr = remapped.getWritePointer (i); + std::fill (ptr, ptr + remapped.getNumSamples(), (float) i); + } + } + + // Channels are copied back to the correct output buffer + expect (channelStartsWithValue (data.outputs[0], 0, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 1, 1.0f)); + expect (channelStartsWithValue (data.outputs[0], 2, 2.0f)); + expect (channelStartsWithValue (data.outputs[0], 3, 3.0f)); + + expect (channelStartsWithValue (data.outputs[1], 0, 4.0f)); + expect (channelStartsWithValue (data.outputs[1], 1, 5.0f)); + } + + beginTest ("Inactive buses are ignored"); + { + ClientBufferMapperData remapper; + remapper.prepare (18, blockSize * 2); + + Config config { { DynamicChannelMapping { AudioChannelSet::create7point1point6() }, + DynamicChannelMapping { AudioChannelSet::mono(), false }, + DynamicChannelMapping { AudioChannelSet::quadraphonic() }, + DynamicChannelMapping { AudioChannelSet::mono(), false } }, + { DynamicChannelMapping { AudioChannelSet::create5point0(), false }, + DynamicChannelMapping { AudioChannelSet::createLCRS() }, + DynamicChannelMapping { AudioChannelSet::stereo() } } }; + + config.ins[1].setHostActive (false); + config.ins[3].setHostActive (false); + + TestBuffers testBuffers { blockSize }; + + // The host doesn't need to provide trailing buses that are inactive, as long as the + // client knows those buses are inactive. + auto ins = MultiBusBuffers{}.withBus (testBuffers, 14).withBus (testBuffers, 1).withBus (testBuffers, 4); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 5) .withBus (testBuffers, 4).withBus (testBuffers, 2); + + auto data = makeProcessData (blockSize, ins, outs); + + testBuffers.init(); + + { + ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == 18); + + // Data from the input channels is copied to the correct channels of the remapped buffer + expect (allMatch (remapped, 0, 1.0f)); + expect (allMatch (remapped, 1, 2.0f)); + expect (allMatch (remapped, 2, 3.0f)); + expect (allMatch (remapped, 3, 4.0f)); + expect (allMatch (remapped, 4, 7.0f)); + expect (allMatch (remapped, 5, 8.0f)); + expect (allMatch (remapped, 6, 9.0f)); + expect (allMatch (remapped, 7, 10.0f)); + expect (allMatch (remapped, 8, 11.0f)); + expect (allMatch (remapped, 9, 12.0f)); + expect (allMatch (remapped, 10, 5.0f)); + expect (allMatch (remapped, 11, 6.0f)); + expect (allMatch (remapped, 12, 13.0f)); + expect (allMatch (remapped, 13, 14.0f)); + + expect (allMatch (remapped, 14, 16.0f)); + expect (allMatch (remapped, 15, 17.0f)); + expect (allMatch (remapped, 16, 18.0f)); + expect (allMatch (remapped, 17, 19.0f)); + + // Write some data to the buffer in JUCE layout + for (auto i = 0; i < remapped.getNumChannels(); ++i) + { + auto* ptr = remapped.getWritePointer (i); + std::fill (ptr, ptr + remapped.getNumSamples(), (float) i); + } + } + + // All channels on the first output bus should be cleared, because the plugin + // thinks that this bus is inactive. + expect (channelStartsWithValue (data.outputs[0], 0, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 1, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 2, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 3, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 4, 0.0f)); + + // Remaining channels should be copied back as normal + expect (channelStartsWithValue (data.outputs[1], 0, 0.0f)); + expect (channelStartsWithValue (data.outputs[1], 1, 1.0f)); + expect (channelStartsWithValue (data.outputs[1], 2, 2.0f)); + expect (channelStartsWithValue (data.outputs[1], 3, 3.0f)); + + expect (channelStartsWithValue (data.outputs[2], 0, 4.0f)); + expect (channelStartsWithValue (data.outputs[2], 1, 5.0f)); + } + + beginTest ("Null pointers are allowed on inactive buses provided to clients"); + { + ClientBufferMapperData remapper; + remapper.prepare (8, blockSize * 2); + + const std::vector emptyBuses; + const std::vector stereoBus { ChannelMapping { AudioChannelSet::stereo() } }; + + Config config { { DynamicChannelMapping { AudioChannelSet::stereo() }, + DynamicChannelMapping { AudioChannelSet::quadraphonic(), false }, + DynamicChannelMapping { AudioChannelSet::stereo() } }, + { DynamicChannelMapping { AudioChannelSet::quadraphonic() }, + DynamicChannelMapping { AudioChannelSet::stereo(), false }, + DynamicChannelMapping { AudioChannelSet::quadraphonic() } } }; + + config.ins[1].setHostActive (false); + config.outs[1].setHostActive (false); + + TestBuffers testBuffers { blockSize }; + + auto ins = MultiBusBuffers{}.withBus (testBuffers, 2).withBus (testBuffers, 4).withBus (testBuffers, 2); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 4).withBus (testBuffers, 2).withBus (testBuffers, 4); + + auto data = makeProcessData (blockSize, ins, outs); + + for (auto i = 0; i < 4; ++i) + data.inputs [1].channelBuffers32[i] = nullptr; + + for (auto i = 0; i < 2; ++i) + data.outputs[1].channelBuffers32[i] = nullptr; + + testBuffers.init(); + + { + ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == 8); + + expect (allMatch (remapped, 0, 1.0f)); + expect (allMatch (remapped, 1, 2.0f)); + // skip 4 inactive channels + expect (allMatch (remapped, 2, 7.0f)); + expect (allMatch (remapped, 3, 8.0f)); + + // Write some data to the buffer in JUCE layout + for (auto i = 0; i < remapped.getNumChannels(); ++i) + { + auto* ptr = remapped.getWritePointer (i); + std::fill (ptr, ptr + remapped.getNumSamples(), (float) i); + } + } + + expect (channelStartsWithValue (data.outputs[0], 0, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 1, 1.0f)); + expect (channelStartsWithValue (data.outputs[0], 2, 2.0f)); + expect (channelStartsWithValue (data.outputs[0], 3, 3.0f)); + + expect (channelStartsWithValue (data.outputs[2], 0, 4.0f)); + expect (channelStartsWithValue (data.outputs[2], 1, 5.0f)); + expect (channelStartsWithValue (data.outputs[2], 2, 6.0f)); + expect (channelStartsWithValue (data.outputs[2], 3, 7.0f)); + } + + beginTest ("HostBufferMapper reorders channels correctly"); + { + HostBufferMapper mapper; + + { + mapper.prepare ({ ChannelMapping { AudioChannelSet::stereo() }, + ChannelMapping { AudioChannelSet::create7point1point2() }, + ChannelMapping { AudioChannelSet::create9point1point6(), false }, + ChannelMapping { AudioChannelSet::createLCRS() } }); + AudioBuffer hostBuffer (16, blockSize); + const auto* clientBuffers = mapper.getVst3LayoutForJuceBuffer (hostBuffer); + + expect (clientBuffers[0].numChannels == 2); + expect (clientBuffers[1].numChannels == 10); + // Even though it's disabled, this bus should still have the correct channel count + expect (clientBuffers[2].numChannels == 16); + expect (clientBuffers[3].numChannels == 4); + + expect (clientBuffers[0].channelBuffers32[0] == hostBuffer.getReadPointer (0)); + expect (clientBuffers[0].channelBuffers32[1] == hostBuffer.getReadPointer (1)); + + expect (clientBuffers[1].channelBuffers32[0] == hostBuffer.getReadPointer (2)); + expect (clientBuffers[1].channelBuffers32[1] == hostBuffer.getReadPointer (3)); + expect (clientBuffers[1].channelBuffers32[2] == hostBuffer.getReadPointer (4)); + expect (clientBuffers[1].channelBuffers32[3] == hostBuffer.getReadPointer (5)); + expect (clientBuffers[1].channelBuffers32[4] == hostBuffer.getReadPointer (8)); + expect (clientBuffers[1].channelBuffers32[5] == hostBuffer.getReadPointer (9)); + expect (clientBuffers[1].channelBuffers32[6] == hostBuffer.getReadPointer (6)); + expect (clientBuffers[1].channelBuffers32[7] == hostBuffer.getReadPointer (7)); + expect (clientBuffers[1].channelBuffers32[8] == hostBuffer.getReadPointer (10)); + expect (clientBuffers[1].channelBuffers32[9] == hostBuffer.getReadPointer (11)); + + for (auto i = 0; i < clientBuffers[2].numChannels; ++i) + expect (clientBuffers[2].channelBuffers32[i] == nullptr); + + expect (clientBuffers[3].channelBuffers32[0] == hostBuffer.getReadPointer (12)); + expect (clientBuffers[3].channelBuffers32[1] == hostBuffer.getReadPointer (13)); + expect (clientBuffers[3].channelBuffers32[2] == hostBuffer.getReadPointer (14)); + expect (clientBuffers[3].channelBuffers32[3] == hostBuffer.getReadPointer (15)); + } + + { + mapper.prepare ({ ChannelMapping { AudioChannelSet::mono() }, + ChannelMapping { AudioChannelSet::mono(), false }, + ChannelMapping { AudioChannelSet::mono() }, + ChannelMapping { AudioChannelSet::mono(), false } }); + AudioBuffer hostBuffer (2, blockSize); + const auto* clientBuffers = mapper.getVst3LayoutForJuceBuffer (hostBuffer); + + expect (clientBuffers[0].numChannels == 1); + expect (clientBuffers[1].numChannels == 1); + expect (clientBuffers[2].numChannels == 1); + expect (clientBuffers[3].numChannels == 1); + + expect (clientBuffers[0].channelBuffers64[0] == hostBuffer.getReadPointer (0)); + expect (clientBuffers[1].channelBuffers64[0] == nullptr); + expect (clientBuffers[2].channelBuffers64[0] == hostBuffer.getReadPointer (1)); + expect (clientBuffers[3].channelBuffers64[0] == nullptr); + } + } + } + +private: + //============================================================================== + struct Config + { + Config (std::vector i, std::vector o) + : ins (std::move (i)), outs (std::move (o)) + { + for (auto container : { &ins, &outs }) + for (auto& x : *container) + x.setHostActive (true); + } + + std::vector ins, outs; + + int getNumChannels() const { return countUsedClientChannels (ins, outs); } + }; + + struct TestBuffers + { + explicit TestBuffers (int samples) : numSamples (samples) {} + + void init() + { + auto index = 1; + + for (auto& channel : buffers) + std::fill (channel.begin(), channel.end(), (float) index++); + } + + bool allMatch (int channel, float value) const + { + const auto& buf = buffers[(size_t) channel]; + return std::all_of (buf.begin(), buf.end(), [&] (auto x) { return x == value; }); + } + + bool isClear (int channel) const + { + return allMatch (channel, 0.0f); + } + + float* addChannel() + { + buffers.emplace_back (numSamples); + return buffers.back().data(); + } + + float* get (int channel) { return buffers[(size_t) channel].data(); } + const float* get (int channel) const { return buffers[(size_t) channel].data(); } + + std::vector> buffers; + int numSamples = 0; + }; + + static bool channelStartsWithValue (Steinberg::Vst::AudioBusBuffers& bus, size_t index, float value) + { + return bus.channelBuffers32[index][0] == value; + } + + static bool allMatch (const AudioBuffer& buf, int index, float value) + { + const auto* ptr = buf.getReadPointer (index); + return std::all_of (ptr, ptr + buf.getNumSamples(), [&] (auto x) { return x == value; }); + } + + struct MultiBusBuffers + { + std::vector buffers; + std::vector> pointerStorage; + + MultiBusBuffers withBus (TestBuffers& storage, int numChannels) && + { + MultiBusBuffers result { std::move (buffers), std::move (pointerStorage) }; + + std::vector pointers; + + for (auto i = 0; i < numChannels; ++i) + pointers.push_back (storage.addChannel()); + + Steinberg::Vst::AudioBusBuffers buffer; + buffer.numChannels = (Steinberg::int32) pointers.size(); + buffer.channelBuffers32 = pointers.data(); + + result.buffers.push_back (buffer); + result.pointerStorage.push_back (std::move (pointers)); + + return result; + } + }; + + static Steinberg::Vst::ProcessData makeProcessData (int blockSize, MultiBusBuffers& ins, MultiBusBuffers& outs) + { + Steinberg::Vst::ProcessData result; + result.numSamples = blockSize; + result.inputs = ins.buffers.data(); + result.numInputs = (Steinberg::int32) ins.buffers.size(); + result.outputs = outs.buffers.data(); + result.numOutputs = (Steinberg::int32) outs.buffers.size(); + return result; + } +}; + +static VST3PluginFormatTests vst3PluginFormatTests; + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VSTCommon.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VSTCommon.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VSTCommon.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VSTCommon.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -301,35 +301,6 @@ return speakerTypeMap.at (type); } - - static AudioChannelSet::ChannelType getChannelType (int32 type) noexcept - { - switch (type) - { - case Vst2::kSpeakerL: return AudioChannelSet::left; - case Vst2::kSpeakerR: return AudioChannelSet::right; - case Vst2::kSpeakerC: return AudioChannelSet::centre; - case Vst2::kSpeakerLfe: return AudioChannelSet::LFE; - case Vst2::kSpeakerLs: return AudioChannelSet::leftSurround; - case Vst2::kSpeakerRs: return AudioChannelSet::rightSurround; - case Vst2::kSpeakerLc: return AudioChannelSet::leftCentre; - case Vst2::kSpeakerRc: return AudioChannelSet::rightCentre; - case Vst2::kSpeakerS: return AudioChannelSet::surround; - case Vst2::kSpeakerSl: return AudioChannelSet::leftSurroundRear; - case Vst2::kSpeakerSr: return AudioChannelSet::rightSurroundRear; - case Vst2::kSpeakerTm: return AudioChannelSet::topMiddle; - case Vst2::kSpeakerTfl: return AudioChannelSet::topFrontLeft; - case Vst2::kSpeakerTfc: return AudioChannelSet::topFrontCentre; - case Vst2::kSpeakerTfr: return AudioChannelSet::topFrontRight; - case Vst2::kSpeakerTrl: return AudioChannelSet::topRearLeft; - case Vst2::kSpeakerTrc: return AudioChannelSet::topRearCentre; - case Vst2::kSpeakerTrr: return AudioChannelSet::topRearRight; - case Vst2::kSpeakerLfe2: return AudioChannelSet::LFE2; - default: break; - } - - return AudioChannelSet::unknown; - } }; } // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -1090,34 +1090,7 @@ ~VSTPluginInstance() override { if (vstEffect != nullptr && vstEffect->magic == 0x56737450 /* 'VstP' */) - { - struct VSTDeleter : public CallbackMessage - { - VSTDeleter (VSTPluginInstance& inInstance, WaitableEvent& inEvent) - : vstInstance (inInstance), completionSignal (inEvent) - {} - - void messageCallback() override - { - vstInstance.cleanup(); - completionSignal.signal(); - } - - VSTPluginInstance& vstInstance; - WaitableEvent& completionSignal; - }; - - if (MessageManager::getInstance()->isThisTheMessageThread()) - { - cleanup(); - } - else - { - WaitableEvent completionEvent; - (new VSTDeleter (*this, completionEvent))->post(); - completionEvent.wait(); - } - } + callOnMessageThread ([this] { cleanup(); }); } void cleanup() @@ -1254,10 +1227,6 @@ wantsMidiMessages = pluginCanDo ("receiveVstMidiEvent") > 0 || isSynthPlugin(); - #if JUCE_MAC && JUCE_SUPPORT_CARBON - usesCocoaNSView = ((unsigned int) pluginCanDo ("hasCockosViewAsConfig") & 0xffff0000ul) == 0xbeef0000ul; - #endif - setLatencySamples (vstEffect->initialDelay); } @@ -1401,7 +1370,7 @@ if (! isPowerOn) setPower (true); - // dodgy hack to force some plugins to initialise the sample rate.. + // dodgy hack to force some plugins to initialise the sample rate. if (! hasEditor()) { if (auto* firstParam = getParameters()[0]) @@ -1701,7 +1670,7 @@ return 0; } - // handles non plugin-specific callbacks.. + // handles non plugin-specific callbacks. static pointer_sized_int handleGeneralCallback (int32 opcode, int32 /*index*/, pointer_sized_int /*value*/, void* ptr, float /*opt*/) { switch (opcode) @@ -1989,26 +1958,12 @@ return false; } - bool updateSizeFromEditor (int w, int h) - { - editorSize = { w, h }; - - if (auto* editor = getActiveEditor()) - { - editor->setSize (w, h); - return true; - } - - return false; - } - - Rectangle getEditorSize() const { return editorSize; } + bool updateSizeFromEditor (int w, int h); Vst2::AEffect* vstEffect; ModuleHandle::Ptr vstModule; std::unique_ptr extraFunctions; - bool usesCocoaNSView = false; private: //============================================================================== @@ -2083,7 +2038,6 @@ AudioBuffer tmpBufferDouble; HeapBlock channelBufferDouble; std::unique_ptr bypassParam; - Rectangle editorSize; std::unique_ptr xmlInfo; @@ -2148,24 +2102,11 @@ void setWindowSize (int width, int height) { - if (auto* ed = getActiveEditor()) - { - #if JUCE_LINUX || JUCE_BSD - const MessageManagerLock mmLock; - #endif - - #if ! JUCE_MAC - if (auto* peer = ed->getTopLevelComponent()->getPeer()) - { - auto scale = peer->getPlatformScaleFactor(); - updateSizeFromEditor (roundToInt (width / scale), roundToInt (height / scale)); - - return; - } - #endif + #if JUCE_LINUX || JUCE_BSD + const MessageManagerLock mmLock; + #endif - updateSizeFromEditor (width, height); - } + updateSizeFromEditor (width, height); } //============================================================================== @@ -2345,6 +2286,20 @@ return { nullptr, nullptr }; } + template + void setFromOptional (Member& target, Optional opt, int32_t flag) + { + if (opt.hasValue()) + { + target = static_cast (*opt); + vstHostTime.flags |= flag; + } + else + { + vstHostTime.flags &= ~flag; + } + } + //============================================================================== template void processAudio (AudioBuffer& buffer, MidiBuffer& midiMessages, @@ -2370,25 +2325,32 @@ { if (auto* currentPlayHead = getPlayHead()) { - AudioPlayHead::CurrentPositionInfo position; - - if (currentPlayHead->getCurrentPosition (position)) + if (const auto position = currentPlayHead->getPosition()) { + if (const auto samplePos = position->getTimeInSamples()) + vstHostTime.samplePos = (double) *samplePos; + else + jassertfalse; // VST hosts *must* call setTimeInSamples on the audio playhead + + if (auto sig = position->getTimeSignature()) + { + vstHostTime.flags |= Vst2::kVstTimeSigValid; + vstHostTime.timeSigNumerator = sig->numerator; + vstHostTime.timeSigDenominator = sig->denominator; + } + else + { + vstHostTime.flags &= ~Vst2::kVstTimeSigValid; + } - vstHostTime.samplePos = (double) position.timeInSamples; - vstHostTime.tempo = position.bpm; - vstHostTime.timeSigNumerator = position.timeSigNumerator; - vstHostTime.timeSigDenominator = position.timeSigDenominator; - vstHostTime.ppqPos = position.ppqPosition; - vstHostTime.barStartPos = position.ppqPositionOfLastBarStart; - vstHostTime.flags |= Vst2::kVstTempoValid - | Vst2::kVstTimeSigValid - | Vst2::kVstPpqPosValid - | Vst2::kVstBarsValid; + setFromOptional (vstHostTime.ppqPos, position->getPpqPosition(), Vst2::kVstPpqPosValid); + setFromOptional (vstHostTime.barStartPos, position->getPpqPositionOfLastBarStart(), Vst2::kVstBarsValid); + setFromOptional (vstHostTime.nanoSeconds, position->getHostTimeNs(), Vst2::kVstNanosValid); + setFromOptional (vstHostTime.tempo, position->getBpm(), Vst2::kVstTempoValid); int32 newTransportFlags = 0; - if (position.isPlaying) newTransportFlags |= Vst2::kVstTransportPlaying; - if (position.isRecording) newTransportFlags |= Vst2::kVstTransportRecording; + if (position->getIsPlaying()) newTransportFlags |= Vst2::kVstTransportPlaying; + if (position->getIsRecording()) newTransportFlags |= Vst2::kVstTransportRecording; if (newTransportFlags != (vstHostTime.flags & (Vst2::kVstTransportPlaying | Vst2::kVstTransportRecording))) @@ -2396,40 +2358,43 @@ else vstHostTime.flags &= ~Vst2::kVstTransportChanged; - struct OptionalFrameRate + const auto optionalFrameRate = [fr = position->getFrameRate()]() -> Optional { - bool valid; - Vst2::VstInt32 rate; - }; + if (! fr.hasValue()) + return {}; - const auto optionalFrameRate = [&fr = position.frameRate]() -> OptionalFrameRate - { - switch (fr.getBaseRate()) + switch (fr->getBaseRate()) { - case 24: return { true, fr.isPullDown() ? Vst2::kVstSmpte239fps : Vst2::kVstSmpte24fps }; - case 25: return { true, fr.isPullDown() ? Vst2::kVstSmpte249fps : Vst2::kVstSmpte25fps }; - case 30: return { true, fr.isPullDown() ? (fr.isDrop() ? Vst2::kVstSmpte2997dfps : Vst2::kVstSmpte2997fps) - : (fr.isDrop() ? Vst2::kVstSmpte30dfps : Vst2::kVstSmpte30fps) }; - case 60: return { true, fr.isPullDown() ? Vst2::kVstSmpte599fps : Vst2::kVstSmpte60fps }; + case 24: return fr->isPullDown() ? Vst2::kVstSmpte239fps : Vst2::kVstSmpte24fps; + case 25: return fr->isPullDown() ? Vst2::kVstSmpte249fps : Vst2::kVstSmpte25fps; + case 30: return fr->isPullDown() ? (fr->isDrop() ? Vst2::kVstSmpte2997dfps : Vst2::kVstSmpte2997fps) + : (fr->isDrop() ? Vst2::kVstSmpte30dfps : Vst2::kVstSmpte30fps); + case 60: return fr->isPullDown() ? Vst2::kVstSmpte599fps : Vst2::kVstSmpte60fps; } - return { false, Vst2::VstSmpteFrameRate{} }; + return {}; }(); - vstHostTime.flags |= optionalFrameRate.valid ? Vst2::kVstSmpteValid : 0; - vstHostTime.smpteFrameRate = optionalFrameRate.rate; - vstHostTime.smpteOffset = (int32) (position.timeInSeconds * 80.0 * position.frameRate.getEffectiveRate() + 0.5); + vstHostTime.flags |= optionalFrameRate ? Vst2::kVstSmpteValid : 0; + vstHostTime.smpteFrameRate = optionalFrameRate.orFallback (Vst2::VstSmpteFrameRate{}); + const auto effectiveRate = position->getFrameRate().hasValue() ? position->getFrameRate()->getEffectiveRate() : 0.0; + vstHostTime.smpteOffset = (int32) (position->getTimeInSeconds().orFallback (0.0) * 80.0 * effectiveRate + 0.5); - if (position.isLooping) + if (const auto loop = position->getLoopPoints()) { - vstHostTime.cycleStartPos = position.ppqLoopStart; - vstHostTime.cycleEndPos = position.ppqLoopEnd; - vstHostTime.flags |= (Vst2::kVstCyclePosValid | Vst2::kVstTransportCycleActive); + vstHostTime.flags |= Vst2::kVstCyclePosValid; + vstHostTime.cycleStartPos = loop->ppqStart; + vstHostTime.cycleEndPos = loop->ppqEnd; } else { - vstHostTime.flags &= ~(Vst2::kVstCyclePosValid | Vst2::kVstTransportCycleActive); + vstHostTime.flags &= ~Vst2::kVstCyclePosValid; } + + if (position->getIsLooping()) + vstHostTime.flags |= Vst2::kVstTransportCycleActive; + else + vstHostTime.flags &= ~Vst2::kVstTransportCycleActive; } } @@ -2472,13 +2437,13 @@ } else { - // Not initialised, so just bypass.. + // Not initialised, so just bypass. for (int i = getTotalNumOutputChannels(); --i >= 0;) buffer.clear (i, 0, buffer.getNumSamples()); } { - // copy any incoming midi.. + // copy any incoming midi. const ScopedLock sl (midiInLock); midiMessages.swapWith (incomingMidi); @@ -2593,7 +2558,7 @@ { char nm[256] = { 0 }; - // only do this if the plugin can't use indexed names.. + // only do this if the plugin can't use indexed names. if (dispatch (Vst2::effGetProgramNameIndexed, 0, -1, nm, 0) == 0) { auto oldProgram = getCurrentProgram(); @@ -2773,7 +2738,6 @@ struct VSTPluginWindow : public AudioProcessorEditor, #if ! JUCE_MAC private ComponentMovementWatcher, - private ComponentPeer::ScaleFactorListener, #endif private Timer { @@ -2791,18 +2755,8 @@ #elif JUCE_MAC ignoreUnused (recursiveResize, pluginRefusesToResize, alreadyInside); - #if JUCE_SUPPORT_CARBON - if (! plug.usesCocoaNSView) - { - carbonWrapper.reset (new CarbonWrapperComponent (*this)); - addAndMakeVisible (carbonWrapper.get()); - } - else - #endif - { - cocoaWrapper.reset (new NSViewComponentWithParent (plugin)); - addAndMakeVisible (cocoaWrapper.get()); - } + cocoaWrapper.reset (new NSViewComponentWithParent (plugin)); + addAndMakeVisible (cocoaWrapper.get()); #endif activeVSTWindows.add (this); @@ -2817,6 +2771,10 @@ setOpaque (true); setVisible (true); + + #if JUCE_WINDOWS + addAndMakeVisible (embeddedComponent); + #endif } ~VSTPluginWindow() override @@ -2824,12 +2782,7 @@ closePluginWindow(); #if JUCE_MAC - #if JUCE_SUPPORT_CARBON - carbonWrapper.reset(); - #endif cocoaWrapper.reset(); - #else - removeScaleFactorListeners(); #endif activeVSTWindows.removeFirstMatchingValue (this); @@ -2837,10 +2790,31 @@ } //============================================================================== - void updateSizeFromEditor (int w, int h) + /* Convert from the hosted VST's coordinate system to the component's coordinate system. */ + Rectangle vstToComponentRect (Component& editor, const Rectangle& vr) const { - if (! plugin.updateSizeFromEditor (w, h)) - setSize (w, h); + return editor.getLocalArea (nullptr, vr / (nativeScaleFactor * getDesktopScaleFactor())); + } + + Rectangle componentToVstRect (Component& editor, const Rectangle& vr) const + { + if (auto* tl = editor.getTopLevelComponent()) + return tl->getLocalArea (&editor, vr) * nativeScaleFactor * tl->getDesktopScaleFactor(); + + return {}; + } + + bool updateSizeFromEditor (int w, int h) + { + const auto correctedBounds = vstToComponentRect (*this, { w, h }); + setSize (correctedBounds.getWidth(), correctedBounds.getHeight()); + + #if JUCE_MAC + if (cocoaWrapper != nullptr) + cocoaWrapper->setSize (correctedBounds.getWidth(), correctedBounds.getHeight()); + #endif + + return true; } #if JUCE_MAC @@ -2851,29 +2825,28 @@ void visibilityChanged() override { - if (cocoaWrapper != nullptr) - { - if (isShowing()) - openPluginWindow ((NSView*) cocoaWrapper->getView()); - else - closePluginWindow(); - } + if (isShowing()) + openPluginWindow ((NSView*) cocoaWrapper->getView()); + else + closePluginWindow(); } void childBoundsChanged (Component*) override { - if (cocoaWrapper != nullptr) - { - auto w = cocoaWrapper->getWidth(); - auto h = cocoaWrapper->getHeight(); + auto w = cocoaWrapper->getWidth(); + auto h = cocoaWrapper->getHeight(); - if (w != getWidth() || h != getHeight()) - setSize (w, h); - } + if (w != getWidth() || h != getHeight()) + setSize (w, h); } void parentHierarchyChanged() override { visibilityChanged(); } #else + float getEffectiveScale() const + { + return nativeScaleFactor * userScaleFactor; + } + void paint (Graphics& g) override { #if JUCE_LINUX || JUCE_BSD @@ -2881,7 +2854,7 @@ { if (pluginWindow != 0) { - auto clip = g.getClipBounds(); + auto clip = componentToVstRect (*this, g.getClipBounds().toNearestInt()); X11Symbols::getInstance()->xClearArea (display, pluginWindow, clip.getX(), clip.getY(), static_cast (clip.getWidth()), @@ -2900,36 +2873,15 @@ if (recursiveResize) return; - if (auto* peer = getTopLevelComponent()->getPeer()) + if (getPeer() != nullptr) { const ScopedValueSetter recursiveResizeSetter (recursiveResize, true); - const auto pos = (peer->getAreaCoveredBy (*this).toFloat() * nativeScaleFactor).toNearestInt(); - #if JUCE_WINDOWS - if (pluginHWND != 0) - { - ScopedThreadDPIAwarenessSetter threadDpiAwarenessSetter { pluginHWND }; - SetWindowPos (pluginHWND, - HWND_BOTTOM, - pos.getX(), - pos.getY(), - 0, - 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER); - - MessageManager::callAsync ([ref = SafePointer (this)] - { - // Clean up after the editor window, in case it tried to move itself - // into the wrong location over this component. - if (ref == nullptr) - return; - - if (auto* p = ref->getPeer()) - p->repaint (p->getBounds().withPosition ({})); - }); - } + embeddedComponent.setBounds (getLocalBounds()); #elif JUCE_LINUX || JUCE_BSD + const auto pos = componentToVstRect (*this, getLocalBounds()); + if (pluginWindow != 0) { auto* symbols = X11Symbols::getInstance(); @@ -2955,8 +2907,7 @@ else if (! shouldAvoidDeletingWindow()) closePluginWindow(); - if (auto* peer = getTopLevelComponent()->getPeer()) - setScaleFactorAndDispatchMessage (peer->getPlatformScaleFactor()); + setContentScaleFactor(); #if JUCE_LINUX || JUCE_BSD MessageManager::callAsync ([safeThis = SafePointer { this }] @@ -2974,39 +2925,37 @@ void componentPeerChanged() override { closePluginWindow(); - openPluginWindow(); - - removeScaleFactorListeners(); - - if (auto* peer = getTopLevelComponent()->getPeer()) - peer->addScaleFactorListener (this); - componentMovedOrResized (true, true); - } - - void nativeScaleFactorChanged (double newScaleFactor) override - { - setScaleFactorAndDispatchMessage (newScaleFactor); - #if JUCE_WINDOWS - resizeToFit(); - #endif + if (getPeer() != nullptr) + { + openPluginWindow(); + componentMovedOrResized (true, true); + } } - void setScaleFactorAndDispatchMessage (double newScaleFactor) + void setContentScaleFactor() { - if (approximatelyEqual ((float) newScaleFactor, nativeScaleFactor)) - return; - - nativeScaleFactor = (float) newScaleFactor; - if (pluginRespondsToDPIChanges) dispatch (Vst2::effVendorSpecific, (int) ByteOrder::bigEndianInt ("PreS"), (int) ByteOrder::bigEndianInt ("AeCs"), - nullptr, nativeScaleFactor); + nullptr, getEffectiveScale()); } #endif + void setScaleFactor (float scale) override + { + userScaleFactor = scale; + + #if ! JUCE_MAC + setContentScaleFactor(); + #endif + + #if JUCE_WINDOWS + resizeToFit(); + #endif + } + //============================================================================== bool keyStateChanged (bool) override { return pluginWantsKeys; } bool keyPressed (const juce::KeyPress&) override { return pluginWantsKeys; } @@ -3029,7 +2978,14 @@ if (! reentrantGuard) { reentrantGuard = true; + + #if JUCE_WINDOWS + // Some plugins may draw/resize inside their idle callback, so ensure that + // DPI awareness is set correctly inside this call. + ScopedThreadDPIAwarenessSetter scope (getPluginHWND()); + #endif plugin.dispatch (Vst2::effEditIdle, 0, 0, nullptr, 0); + reentrantGuard = false; } @@ -3076,7 +3032,7 @@ } // This is an old workaround for some plugins that need a repaint when their - // windows are first created, but it breaks some Izotope plugins.. + // windows are first created, but it breaks some Izotope plugins. bool shouldRepaintCarbonWindowWhenCreated() { return ! plugin.getName().containsIgnoreCase ("izotope"); @@ -3128,7 +3084,7 @@ #else void openPluginWindow() { - if (isOpen || getWindowHandle() == nullptr) + if (isOpen) return; JUCE_VST_LOG ("Opening VST UI: " + plugin.getName()); @@ -3136,13 +3092,18 @@ pluginRespondsToDPIChanges = plugin.pluginCanDo ("supportsViewDpiScaling") > 0; - if (auto* peer = getTopLevelComponent()->getPeer()) - setScaleFactorAndDispatchMessage (peer->getPlatformScaleFactor()); + setContentScaleFactor(); Vst2::ERect* rect = nullptr; dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0); - dispatch (Vst2::effEditOpen, 0, 0, getWindowHandle(), 0); + + #if JUCE_WINDOWS + auto* handle = embeddedComponent.getHWND(); + #else + auto* handle = getWindowHandle(); + #endif + dispatch (Vst2::effEditOpen, 0, 0, handle, 0); dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0); // do this before and after like in the steinberg example dispatch (Vst2::effGetProgram, 0, 0, nullptr, 0); // also in steinberg code @@ -3150,7 +3111,7 @@ #if JUCE_WINDOWS originalWndProc = 0; - pluginHWND = GetWindow ((HWND) getWindowHandle(), GW_CHILD); + auto* pluginHWND = getPluginHWND(); if (pluginHWND == 0) { @@ -3193,7 +3154,7 @@ ScopedThreadDPIAwarenessSetter threadDpiAwarenessSetter { pluginHWND }; SetWindowPos (pluginHWND, 0, - 0, 0, roundToInt (rw * nativeScaleFactor), roundToInt (rh * nativeScaleFactor), + 0, 0, rw, rh, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER); GetWindowRect (pluginHWND, &r); @@ -3229,9 +3190,6 @@ X11Symbols::getInstance()->xMapRaised (display, pluginWindow); #endif - w = roundToInt ((float) w / nativeScaleFactor); - h = roundToInt ((float) h / nativeScaleFactor); - // double-check it's not too tiny w = jmax (w, 32); h = jmax (h, 32); @@ -3245,13 +3203,6 @@ startTimer (18 + juce::Random::getSystemRandom().nextInt (5)); repaint(); } - - void removeScaleFactorListeners() - { - for (int i = 0; i < ComponentPeer::getNumPeers(); ++i) - if (auto* peer = ComponentPeer::getPeer (i)) - peer->removeScaleFactorListener (this); - } #endif //============================================================================== @@ -3260,7 +3211,7 @@ if (isOpen) { // You shouldn't end up hitting this assertion unless the host is trying to do GUI - // cleanup on a non-GUI thread.. If it does that, bad things could happen in here.. + // cleanup on a non-GUI thread. If it does that, bad things could happen in here. JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED JUCE_VST_LOG ("Closing VST UI: " + plugin.getName()); @@ -3270,12 +3221,13 @@ #if JUCE_WINDOWS JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4244) + auto* pluginHWND = getPluginHWND(); + if (originalWndProc != 0 && pluginHWND != 0 && IsWindow (pluginHWND)) SetWindowLongPtr (pluginHWND, GWLP_WNDPROC, (LONG_PTR) originalWndProc); JUCE_END_IGNORE_WARNINGS_MSVC originalWndProc = 0; - pluginHWND = 0; #elif JUCE_LINUX || JUCE_BSD pluginWindow = 0; #endif @@ -3295,7 +3247,8 @@ if (pluginRefusesToResize) return true; - return (isWithin (w, getWidth(), 5) && isWithin (h, getHeight(), 5)); + const auto converted = vstToComponentRect (*this, { w, h }); + return (isWithin (converted.getWidth(), getWidth(), 5) && isWithin (converted.getHeight(), getHeight(), 5)); } void resizeToFit() @@ -3303,14 +3256,16 @@ Vst2::ERect* rect = nullptr; dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0); - auto w = roundToInt ((rect->right - rect->left) / nativeScaleFactor); - auto h = roundToInt ((rect->bottom - rect->top) / nativeScaleFactor); + auto w = rect->right - rect->left; + auto h = rect->bottom - rect->top; if (! isWindowSizeCorrectForPlugin (w, h)) { updateSizeFromEditor (w, h); sizeCheckCount = 0; } + + embeddedComponent.updateHWNDBounds(); } void checkPluginWindowSize() @@ -3319,14 +3274,16 @@ resizeToFit(); } - // hooks to get keyboard events from VST windows.. + // hooks to get keyboard events from VST windows. static LRESULT CALLBACK vstHookWndProc (HWND hW, UINT message, WPARAM wParam, LPARAM lParam) { for (int i = activeVSTWindows.size(); --i >= 0;) { Component::SafePointer w (activeVSTWindows[i]); - if (w != nullptr && w->pluginHWND == hW) + auto* pluginHWND = w->getPluginHWND(); + + if (w != nullptr && pluginHWND == hW) { if (message == WM_CHAR || message == WM_KEYDOWN @@ -3341,7 +3298,7 @@ if (w != nullptr) // (may have been deleted in SendMessage callback) return CallWindowProc ((WNDPROC) w->originalWndProc, - (HWND) w->pluginHWND, + (HWND) pluginHWND, message, wParam, lParam); } } @@ -3359,116 +3316,86 @@ //============================================================================== #if JUCE_MAC - #if JUCE_SUPPORT_CARBON - struct CarbonWrapperComponent : public CarbonViewWrapperComponent - { - CarbonWrapperComponent (VSTPluginWindow& w) : owner (w) - { - keepPluginWindowWhenHidden = w.shouldAvoidDeletingWindow(); - setRepaintsChildHIViewWhenCreated (w.shouldRepaintCarbonWindowWhenCreated()); - } - - ~CarbonWrapperComponent() - { - deleteWindow(); - } - - HIViewRef attachView (WindowRef windowRef, HIViewRef /*rootView*/) override - { - owner.openPluginWindow (windowRef); - return {}; - } - - void removeView (HIViewRef) override - { - if (owner.isOpen) - { - owner.isOpen = false; - owner.dispatch (Vst2::effEditClose, 0, 0, 0, 0); - owner.dispatch (Vst2::effEditSleep, 0, 0, 0, 0); - } - } - - bool getEmbeddedViewSize (int& w, int& h) override - { - Vst2::ERect* rect = nullptr; - owner.dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0); - w = rect->right - rect->left; - h = rect->bottom - rect->top; - return true; - } - - void handleMouseDown (int x, int y) override - { - if (! alreadyInside) - { - alreadyInside = true; - getTopLevelComponent()->toFront (true); - owner.dispatch (Vst2::effEditMouse, x, y, 0, 0); - alreadyInside = false; - } - else - { - PostEvent (::mouseDown, 0); - } - } - - void handlePaint() override - { - if (auto* peer = getPeer()) - { - auto pos = peer->globalToLocal (getScreenPosition()); - Vst2::ERect r; - r.left = (int16) pos.getX(); - r.top = (int16) pos.getY(); - r.right = (int16) (r.left + getWidth()); - r.bottom = (int16) (r.top + getHeight()); - - owner.dispatch (Vst2::effEditDraw, 0, 0, &r, 0); - } - } - - private: - VSTPluginWindow& owner; - bool alreadyInside = false; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CarbonWrapperComponent) - }; - - friend struct CarbonWrapperComponent; - std::unique_ptr carbonWrapper; - #endif - std::unique_ptr cocoaWrapper; void resized() override { - #if JUCE_SUPPORT_CARBON - if (carbonWrapper != nullptr) - carbonWrapper->setSize (getWidth(), getHeight()); - #endif - - if (cocoaWrapper != nullptr) - cocoaWrapper->setSize (getWidth(), getHeight()); } #endif //============================================================================== VSTPluginInstance& plugin; + float userScaleFactor = 1.0f; bool isOpen = false, recursiveResize = false; bool pluginWantsKeys = false, pluginRefusesToResize = false, alreadyInside = false; #if ! JUCE_MAC bool pluginRespondsToDPIChanges = false; + float nativeScaleFactor = 1.0f; + + struct ScaleNotifierCallback + { + VSTPluginWindow& window; + + void operator() (float platformScale) const + { + MessageManager::callAsync ([ref = Component::SafePointer (&window), platformScale] + { + if (auto* r = ref.getComponent()) + { + r->nativeScaleFactor = platformScale; + r->setContentScaleFactor(); + + #if JUCE_WINDOWS + r->resizeToFit(); + #endif + r->componentMovedOrResized (true, true); + } + }); + } + }; + + NativeScaleFactorNotifier scaleNotifier { this, ScaleNotifierCallback { *this } }; + #if JUCE_WINDOWS - HWND pluginHWND = {}; + struct ViewComponent : public HWNDComponent + { + ViewComponent() + { + setOpaque (true); + inner.addToDesktop (0); + + if (auto* peer = inner.getPeer()) + setHWND (peer->getNativeHandle()); + } + + void paint (Graphics& g) override { g.fillAll (Colours::black); } + + private: + struct Inner : public Component + { + Inner() { setOpaque (true); } + void paint (Graphics& g) override { g.fillAll (Colours::black); } + }; + + Inner inner; + }; + + HWND getPluginHWND() const + { + return GetWindow ((HWND) embeddedComponent.getHWND(), GW_CHILD); + } + + ViewComponent embeddedComponent; void* originalWndProc = {}; int sizeCheckCount = 0; #elif JUCE_LINUX || JUCE_BSD ::Display* display = XWindowSystem::getInstance()->getDisplay(); Window pluginWindow = 0; #endif + #else + static constexpr auto nativeScaleFactor = 1.0f; #endif //============================================================================== @@ -3489,6 +3416,14 @@ #endif } +bool VSTPluginInstance::updateSizeFromEditor (int w, int h) +{ + if (auto* editor = dynamic_cast (getActiveEditor())) + return editor->updateSizeFromEditor (w, h); + + return false; +} + //============================================================================== // entry point for all callbacks from the plugin static pointer_sized_int VSTCALLBACK audioMaster (Vst2::AEffect* effect, int32 opcode, int32 index, pointer_sized_int value, void* ptr, float opt) diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/generate_lv2_bundle_sources.py juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/generate_lv2_bundle_sources.py --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/generate_lv2_bundle_sources.py 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/generate_lv2_bundle_sources.py 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,157 @@ +# ============================================================================== +# +# This file is part of the JUCE library. +# Copyright (c) 2020 - Raw Material Software Limited +# +# 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 7 End-User License +# Agreement and JUCE Privacy Policy. +# +# End User License Agreement: www.juce.com/juce-7-licence +# Privacy Policy: www.juce.com/juce-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. +# +# ============================================================================== + +# This script is used to convert the data files from the LV2 distribution into +# a form suitable for inclusion in a C++ project. An LV2 host would normally +# expect these files to be installed on disk, but this places a burden on host +# developers to include these files in their product installers, and to install +# them to sensible locations. Instead of forcing host developers to handle this +# case, JUCE hosts will use the embedded copy of this data to write all of the +# files to a temporary location at runtime. + +import argparse +import os + +BUNDLE_TEMPLATE = """juce::lv2::Bundle +{{ +"{}", +{{ +{} +}} +}} +""" + +BUNDLE_RESOURCE_TEMPLATE = """juce::lv2::BundleResource +{{ +"{}", +{} +}} +""" + +FUNCTION_TEMPLATE = """/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +/* + This file is auto-generated by generate_lv2_bundle_sources.py. +*/ + +#pragma once + +#ifndef DOXYGEN + +#include + +namespace juce +{{ +namespace lv2 +{{ + +struct BundleResource +{{ + const char* name; + const char* contents; +}}; + +struct Bundle +{{ + const char* name; + std::vector contents; + + static std::vector getAllBundles(); +}}; + +}} +}} + +std::vector juce::lv2::Bundle::getAllBundles() +{{ + return {{ +{} +}}; +}} + +#endif""" + + +def chunks(lst, n): + for i in range(0, len(lst), n): + yield lst[i:i + n] + + +def get_chunked_string_literal(s): + return ' '.join(map(lambda x: 'R"lv2ttl({})lv2ttl"'.format(''.join(x)), chunks(s, 8000))) + + +def get_file_source_string(ttl): + with open(ttl) as f: + return BUNDLE_RESOURCE_TEMPLATE.format(os.path.basename(ttl), + get_chunked_string_literal(f.read())) + + +def generate_bundle_source(root, files): + if len(files) == 0: + return "" + + return BUNDLE_TEMPLATE.format(os.path.basename(root), + ", ".join(get_file_source_string(os.path.join(root, ttl)) for ttl in files)) + +def filter_turtle(files): + return [f for f in files if f.endswith(".ttl")] + + +def filter_ttl_files(lv2_dir): + for root, _, files in os.walk(args.lv2_dir): + yield root, filter_turtle(files) + + +parser = argparse.ArgumentParser() +parser.add_argument("lv2_dir") +args = parser.parse_args() + +print(FUNCTION_TEMPLATE.format(", ".join(generate_bundle_source(root, files) + for root, files in filter_ttl_files(args.lv2_dir) + if len(files) != 0)) + .replace("\t", " "), + end = "\r\n") diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,78 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +/* + This header contains preprocessor config flags that would normally be + generated by the build systems of the various LV2 libraries. + + Rather than using the generated platform-dependent headers, we use JUCE's + platform detection macros to pick the right config values at build time. +*/ + +#pragma once + +#define LILV_DYN_MANIFEST +#define LILV_STATIC +#define LV2_STATIC +#define SERD_STATIC +#define SORD_STATIC +#define SRATOM_STATIC +#define ZIX_STATIC + +#define LILV_VERSION "0.24.12" +#define SERD_VERSION "0.30.10" +#define SORD_VERSION "0.16.9" + +#define LILV_CXX 1 + +#if JUCE_WINDOWS + #define LILV_DIR_SEP "\\" + #define LILV_PATH_SEP ";" +#else + #define LILV_DIR_SEP "/" + #define LILV_PATH_SEP ":" +#endif + +#ifndef LILV_DEFAULT_LV2_PATH + #if JUCE_MAC || JUCE_IOS + #define LILV_DEFAULT_LV2_PATH \ + "~/Library/Audio/Plug-Ins/LV2" LILV_PATH_SEP \ + "~/.lv2" LILV_PATH_SEP \ + "/usr/local/lib/lv2" LILV_PATH_SEP \ + "/usr/lib/lv2" LILV_PATH_SEP \ + "/Library/Audio/Plug-Ins/LV2" + #elif JUCE_WINDOWS + #define LILV_DEFAULT_LV2_PATH \ + "%APPDATA%\\LV2" LILV_PATH_SEP \ + "%COMMONPROGRAMFILES%\\LV2" + #elif JUCE_LINUX || JUCE_ANDROID + #define LILV_DEFAULT_LV2_PATH \ + "~/.lv2" LILV_PATH_SEP \ + "/usr/lib/lv2" LILV_PATH_SEP \ + "/usr/local/lib/lv2" + #else + #error "Unsupported platform" + #endif +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/COPYING juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/COPYING --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/COPYING 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,13 @@ +Copyright 2011-2021 David Robillard + +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. \ No newline at end of file diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,2117 @@ +/* + Copyright 2007-2019 David Robillard + + 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 lilv.h API for Lilv, a lightweight LV2 host library. + +#ifndef LILV_LILV_H +#define LILV_LILV_H + +#include "lv2/core/lv2.h" +#include "lv2/urid/urid.h" + +#include +#include +#include +#include + +#if defined(_WIN32) && !defined(LILV_STATIC) && defined(LILV_INTERNAL) +# define LILV_API __declspec(dllexport) +#elif defined(_WIN32) && !defined(LILV_STATIC) +# define LILV_API __declspec(dllimport) +#elif defined(__GNUC__) +# define LILV_API __attribute__((visibility("default"))) +#else +# define LILV_API +#endif + +#if defined(__GNUC__) && \ + (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +# define LILV_DEPRECATED __attribute__((__deprecated__)) +#else +# define LILV_DEPRECATED +#endif + +#ifdef __cplusplus +extern "C" { +# if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +# endif +#endif + +#define LILV_NS_DOAP "http://usefulinc.com/ns/doap#" +#define LILV_NS_FOAF "http://xmlns.com/foaf/0.1/" +#define LILV_NS_LILV "http://drobilla.net/ns/lilv#" +#define LILV_NS_LV2 "http://lv2plug.in/ns/lv2core#" +#define LILV_NS_OWL "http://www.w3.org/2002/07/owl#" +#define LILV_NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#" +#define LILV_NS_RDFS "http://www.w3.org/2000/01/rdf-schema#" +#define LILV_NS_XSD "http://www.w3.org/2001/XMLSchema#" + +#define LILV_URI_ATOM_PORT "http://lv2plug.in/ns/ext/atom#AtomPort" +#define LILV_URI_AUDIO_PORT "http://lv2plug.in/ns/lv2core#AudioPort" +#define LILV_URI_CONTROL_PORT "http://lv2plug.in/ns/lv2core#ControlPort" +#define LILV_URI_CV_PORT "http://lv2plug.in/ns/lv2core#CVPort" +#define LILV_URI_EVENT_PORT "http://lv2plug.in/ns/ext/event#EventPort" +#define LILV_URI_INPUT_PORT "http://lv2plug.in/ns/lv2core#InputPort" +#define LILV_URI_MIDI_EVENT "http://lv2plug.in/ns/ext/midi#MidiEvent" +#define LILV_URI_OUTPUT_PORT "http://lv2plug.in/ns/lv2core#OutputPort" +#define LILV_URI_PORT "http://lv2plug.in/ns/lv2core#Port" + +struct LilvInstanceImpl; + +/** + @defgroup lilv Lilv C API + This is the complete public C API of lilv. + @{ +*/ + +typedef struct LilvPluginImpl LilvPlugin; /**< LV2 Plugin. */ +typedef struct LilvPluginClassImpl LilvPluginClass; /**< Plugin Class. */ +typedef struct LilvPortImpl LilvPort; /**< Port. */ +typedef struct LilvScalePointImpl LilvScalePoint; /**< Scale Point. */ +typedef struct LilvUIImpl LilvUI; /**< Plugin UI. */ +typedef struct LilvNodeImpl LilvNode; /**< Typed Value. */ +typedef struct LilvWorldImpl LilvWorld; /**< Lilv World. */ +typedef struct LilvInstanceImpl LilvInstance; /**< Plugin instance. */ +typedef struct LilvStateImpl LilvState; /**< Plugin state. */ + +typedef void LilvIter; /**< Collection iterator */ +typedef void LilvPluginClasses; /**< A set of #LilvPluginClass. */ +typedef void LilvPlugins; /**< A set of #LilvPlugin. */ +typedef void LilvScalePoints; /**< A set of #LilvScalePoint. */ +typedef void LilvUIs; /**< A set of #LilvUI. */ +typedef void LilvNodes; /**< A set of #LilvNode. */ + +/** + Free memory allocated by Lilv. + + This function exists because some systems require memory allocated by a + library to be freed by code in the same library. It is otherwise equivalent + to the standard C free() function. +*/ +LILV_API +void +lilv_free(void* ptr); + +/** + @defgroup lilv_node Nodes + @{ +*/ + +/** + Convert a file URI string to a local path string. + + For example, "file://foo/bar/baz.ttl" returns "/foo/bar/baz.ttl". + Return value is shared and must not be deleted by caller. + This function does not handle escaping correctly and should not be used for + general file URIs. Use lilv_file_uri_parse() instead. + + @return `uri` converted to a path, or NULL on failure (URI is not local). +*/ +LILV_API +LILV_DEPRECATED +const char* +lilv_uri_to_path(const char* uri); + +/** + Convert a file URI string to a local path string. + + For example, "file://foo/bar%20one/baz.ttl" returns "/foo/bar one/baz.ttl". + Return value must be freed by caller with lilv_free(). + + @param uri The file URI to parse. + @param hostname If non-NULL, set to the hostname in the URI, if any. + @return `uri` converted to a path, or NULL on failure (URI is not local). +*/ +LILV_API +char* +lilv_file_uri_parse(const char* uri, char** hostname); + +/** + Create a new URI value. + + Returned value must be freed by caller with lilv_node_free(). +*/ +LILV_API +LilvNode* +lilv_new_uri(LilvWorld* world, const char* uri); + +/** + Create a new file URI value. + + Relative paths are resolved against the current working directory. Note + that this may yield unexpected results if `host` is another machine. + + @param world The world. + @param host Host name, or NULL. + @param path Path on host. + @return A new node that must be freed by caller. +*/ +LILV_API +LilvNode* +lilv_new_file_uri(LilvWorld* world, const char* host, const char* path); + +/** + Create a new string value (with no language). + + Returned value must be freed by caller with lilv_node_free(). +*/ +LILV_API +LilvNode* +lilv_new_string(LilvWorld* world, const char* str); + +/** + Create a new integer value. + + Returned value must be freed by caller with lilv_node_free(). +*/ +LILV_API +LilvNode* +lilv_new_int(LilvWorld* world, int val); + +/** + Create a new floating point value. + + Returned value must be freed by caller with lilv_node_free(). +*/ +LILV_API +LilvNode* +lilv_new_float(LilvWorld* world, float val); + +/** + Create a new boolean value. + + Returned value must be freed by caller with lilv_node_free(). +*/ +LILV_API +LilvNode* +lilv_new_bool(LilvWorld* world, bool val); + +/** + Free a LilvNode. + + It is safe to call this function on NULL. +*/ +LILV_API +void +lilv_node_free(LilvNode* val); + +/** + Duplicate a LilvNode. +*/ +LILV_API +LilvNode* +lilv_node_duplicate(const LilvNode* val); + +/** + Return whether two values are equivalent. +*/ +LILV_API +bool +lilv_node_equals(const LilvNode* value, const LilvNode* other); + +/** + Return this value as a Turtle/SPARQL token. + + Returned value must be freed by caller with lilv_free(). + + Example tokens: + + - URI: <http://example.org/foo> + - QName: doap:name + - String: "this is a string" + - Float: 1.0 + - Integer: 1 + - Boolean: true +*/ +LILV_API +char* +lilv_node_get_turtle_token(const LilvNode* value); + +/** + Return whether the value is a URI (resource). +*/ +LILV_API +bool +lilv_node_is_uri(const LilvNode* value); + +/** + Return this value as a URI string, like "http://example.org/foo". + + Valid to call only if `lilv_node_is_uri(value)` returns true. + Returned value is owned by `value` and must not be freed by caller. +*/ +LILV_API +const char* +lilv_node_as_uri(const LilvNode* value); + +/** + Return whether the value is a blank node (resource with no URI). +*/ +LILV_API +bool +lilv_node_is_blank(const LilvNode* value); + +/** + Return this value as a blank node identifier, like "genid03". + + Valid to call only if `lilv_node_is_blank(value)` returns true. + Returned value is owned by `value` and must not be freed by caller. +*/ +LILV_API +const char* +lilv_node_as_blank(const LilvNode* value); + +/** + Return whether this value is a literal (that is, not a URI). + + Returns true if `value` is a string or numeric value. +*/ +LILV_API +bool +lilv_node_is_literal(const LilvNode* value); + +/** + Return whether this value is a string literal. + + Returns true if `value` is a string value (and not numeric). +*/ +LILV_API +bool +lilv_node_is_string(const LilvNode* value); + +/** + Return `value` as a string. +*/ +LILV_API +const char* +lilv_node_as_string(const LilvNode* value); + +/** + Return the path of a file URI node. + + Returns NULL if `value` is not a file URI. + Returned value must be freed by caller with lilv_free(). +*/ +LILV_API +char* +lilv_node_get_path(const LilvNode* value, char** hostname); + +/** + Return whether this value is a decimal literal. +*/ +LILV_API +bool +lilv_node_is_float(const LilvNode* value); + +/** + Return `value` as a float. + + Valid to call only if `lilv_node_is_float(value)` or + `lilv_node_is_int(value)` returns true. +*/ +LILV_API +float +lilv_node_as_float(const LilvNode* value); + +/** + Return whether this value is an integer literal. +*/ +LILV_API +bool +lilv_node_is_int(const LilvNode* value); + +/** + Return `value` as an integer. + + Valid to call only if `lilv_node_is_int(value)` returns true. +*/ +LILV_API +int +lilv_node_as_int(const LilvNode* value); + +/** + Return whether this value is a boolean. +*/ +LILV_API +bool +lilv_node_is_bool(const LilvNode* value); + +/** + Return `value` as a bool. + + Valid to call only if `lilv_node_is_bool(value)` returns true. +*/ +LILV_API +bool +lilv_node_as_bool(const LilvNode* value); + +/** + @} + @defgroup lilv_collections Collections + + Lilv has several collection types for holding various types of value. + Each collection type supports a similar basic API, except #LilvPlugins which + is internal and thus lacks a free function: + + - void PREFIX_free (coll) + - unsigned PREFIX_size (coll) + - LilvIter* PREFIX_begin (coll) + + The types of collection are: + + - LilvPlugins, with function prefix `lilv_plugins_`. + - LilvPluginClasses, with function prefix `lilv_plugin_classes_`. + - LilvScalePoints, with function prefix `lilv_scale_points_`. + - LilvNodes, with function prefix `lilv_nodes_`. + - LilvUIs, with function prefix `lilv_uis_`. + + @{ +*/ + +/* Collections */ + +/** + Iterate over each element of a collection. + + @code + LILV_FOREACH(plugin_classes, i, classes) { + LilvPluginClass c = lilv_plugin_classes_get(classes, i); + // ... + } + @endcode +*/ +#define LILV_FOREACH(colltype, iter, collection) \ + for (LilvIter* iter = lilv_##colltype##_begin(collection); \ + !lilv_##colltype##_is_end(collection, iter); \ + (iter) = lilv_##colltype##_next(collection, iter)) + +/* LilvPluginClasses */ + +LILV_API +void +lilv_plugin_classes_free(LilvPluginClasses* collection); + +LILV_API +unsigned +lilv_plugin_classes_size(const LilvPluginClasses* collection); + +LILV_API +LilvIter* +lilv_plugin_classes_begin(const LilvPluginClasses* collection); + +LILV_API +const LilvPluginClass* +lilv_plugin_classes_get(const LilvPluginClasses* collection, LilvIter* i); + +LILV_API +LilvIter* +lilv_plugin_classes_next(const LilvPluginClasses* collection, LilvIter* i); + +LILV_API +bool +lilv_plugin_classes_is_end(const LilvPluginClasses* collection, LilvIter* i); + +/** + Get a plugin class from `classes` by URI. + + Return value is shared (stored in `classes`) and must not be freed or + modified by the caller in any way. + + @return NULL if no plugin class with `uri` is found in `classes`. +*/ +LILV_API +const LilvPluginClass* +lilv_plugin_classes_get_by_uri(const LilvPluginClasses* classes, + const LilvNode* uri); + +/* ScalePoints */ + +LILV_API +void +lilv_scale_points_free(LilvScalePoints* collection); + +LILV_API +unsigned +lilv_scale_points_size(const LilvScalePoints* collection); + +LILV_API +LilvIter* +lilv_scale_points_begin(const LilvScalePoints* collection); + +LILV_API +const LilvScalePoint* +lilv_scale_points_get(const LilvScalePoints* collection, LilvIter* i); + +LILV_API +LilvIter* +lilv_scale_points_next(const LilvScalePoints* collection, LilvIter* i); + +LILV_API +bool +lilv_scale_points_is_end(const LilvScalePoints* collection, LilvIter* i); + +/* UIs */ + +LILV_API +void +lilv_uis_free(LilvUIs* collection); + +LILV_API +unsigned +lilv_uis_size(const LilvUIs* collection); + +LILV_API +LilvIter* +lilv_uis_begin(const LilvUIs* collection); + +LILV_API +const LilvUI* +lilv_uis_get(const LilvUIs* collection, LilvIter* i); + +LILV_API +LilvIter* +lilv_uis_next(const LilvUIs* collection, LilvIter* i); + +LILV_API +bool +lilv_uis_is_end(const LilvUIs* collection, LilvIter* i); + +/** + Get a UI from `uis` by URI. + + Return value is shared (stored in `uis`) and must not be freed or + modified by the caller in any way. + + @return NULL if no UI with `uri` is found in `list`. +*/ +LILV_API +const LilvUI* +lilv_uis_get_by_uri(const LilvUIs* uis, const LilvNode* uri); + +/* Nodes */ + +LILV_API +void +lilv_nodes_free(LilvNodes* collection); + +LILV_API +unsigned +lilv_nodes_size(const LilvNodes* collection); + +LILV_API +LilvIter* +lilv_nodes_begin(const LilvNodes* collection); + +LILV_API +const LilvNode* +lilv_nodes_get(const LilvNodes* collection, LilvIter* i); + +LILV_API +LilvIter* +lilv_nodes_next(const LilvNodes* collection, LilvIter* i); + +LILV_API +bool +lilv_nodes_is_end(const LilvNodes* collection, LilvIter* i); + +LILV_API +LilvNode* +lilv_nodes_get_first(const LilvNodes* collection); + +/** + Return whether `values` contains `value`. +*/ +LILV_API +bool +lilv_nodes_contains(const LilvNodes* nodes, const LilvNode* value); + +/** + Return a new LilvNodes that contains all nodes from both `a` and `b`. +*/ +LILV_API +LilvNodes* +lilv_nodes_merge(const LilvNodes* a, const LilvNodes* b); + +/* Plugins */ + +LILV_API +unsigned +lilv_plugins_size(const LilvPlugins* collection); + +LILV_API +LilvIter* +lilv_plugins_begin(const LilvPlugins* collection); + +LILV_API +const LilvPlugin* +lilv_plugins_get(const LilvPlugins* collection, LilvIter* i); + +LILV_API +LilvIter* +lilv_plugins_next(const LilvPlugins* collection, LilvIter* i); + +LILV_API +bool +lilv_plugins_is_end(const LilvPlugins* collection, LilvIter* i); + +/** + Get a plugin from `plugins` by URI. + + Return value is shared (stored in `plugins`) and must not be freed or + modified by the caller in any way. + + @return NULL if no plugin with `uri` is found in `plugins`. +*/ +LILV_API +const LilvPlugin* +lilv_plugins_get_by_uri(const LilvPlugins* plugins, const LilvNode* uri); + +/** + @} + @defgroup lilv_world World + + The "world" represents all Lilv state, and is used to discover/load/cache + LV2 data (plugins, UIs, and extensions). + Normal hosts which just need to load plugins by URI should simply use + lilv_world_load_all() to discover/load the system's LV2 resources. + + @{ +*/ + +/** + Initialize a new, empty world. + + If initialization fails, NULL is returned. +*/ +LILV_API +LilvWorld* +lilv_world_new(void); + +/** + Enable/disable language filtering. + + Language filtering applies to any functions that return (a) value(s). + With filtering enabled, Lilv will automatically return the best value(s) + for the current LANG. With filtering disabled, all matching values will + be returned regardless of language tag. Filtering is enabled by default. +*/ +#define LILV_OPTION_FILTER_LANG "http://drobilla.net/ns/lilv#filter-lang" + +/** + Enable/disable dynamic manifest support. + + Dynamic manifest data will only be loaded if this option is true. +*/ +#define LILV_OPTION_DYN_MANIFEST "http://drobilla.net/ns/lilv#dyn-manifest" + +/** + Set application-specific LV2_PATH. + + This overrides the LV2_PATH from the environment, so that lilv will only + look inside the given path. This can be used to make self-contained + applications. +*/ +#define LILV_OPTION_LV2_PATH "http://drobilla.net/ns/lilv#lv2-path" + +/** + Set an option for `world`. + + Currently recognized options: + + - #LILV_OPTION_FILTER_LANG + - #LILV_OPTION_DYN_MANIFEST + - #LILV_OPTION_LV2_PATH +*/ +LILV_API +void +lilv_world_set_option(LilvWorld* world, const char* uri, const LilvNode* value); + +/** + Destroy the world. + + It is safe to call this function on NULL. Note that destroying `world` will + destroy all the objects it contains. Do not destroy the world until you are + finished with all objects that came from it. +*/ +LILV_API +void +lilv_world_free(LilvWorld* world); + +/** + Load all installed LV2 bundles on the system. + + This is the recommended way for hosts to load LV2 data. It implements the + established/standard best practice for discovering all LV2 data on the + system. The environment variable LV2_PATH may be used to control where + this function will look for bundles. + + Hosts should use this function rather than explicitly load bundles, except + in special circumstances such as development utilities, or hosts that ship + with special plugin bundles which are installed to a known location. +*/ +LILV_API +void +lilv_world_load_all(LilvWorld* world); + +/** + Load a specific bundle. + + `bundle_uri` must be a fully qualified URI to the bundle directory, + with the trailing slash, eg. file:///usr/lib/lv2/foo.lv2/ + + Normal hosts should not need this function (use lilv_world_load_all()). + + Hosts MUST NOT attach any long-term significance to bundle paths + (for example in save files), since there are no guarantees they will remain + unchanged between (or even during) program invocations. Plugins (among + other things) MUST be identified by URIs (not paths) in save files. +*/ +LILV_API +void +lilv_world_load_bundle(LilvWorld* world, const LilvNode* bundle_uri); + +/** + Load all specifications from currently loaded bundles. + + This is for hosts that explicitly load specific bundles, its use is not + necessary when using lilv_world_load_all(). This function parses the + specifications and adds them to the model. +*/ +LILV_API +void +lilv_world_load_specifications(LilvWorld* world); + +/** + Load all plugin classes from currently loaded specifications. + + Must be called after lilv_world_load_specifications(). This is for hosts + that explicitly load specific bundles, its use is not necessary when using + lilv_world_load_all(). +*/ +LILV_API +void +lilv_world_load_plugin_classes(LilvWorld* world); + +/** + Unload a specific bundle. + + This unloads statements loaded by lilv_world_load_bundle(). Note that this + is not necessarily all information loaded from the bundle. If any resources + have been separately loaded with lilv_world_load_resource(), they must be + separately unloaded with lilv_world_unload_resource(). +*/ +LILV_API +int +lilv_world_unload_bundle(LilvWorld* world, const LilvNode* bundle_uri); + +/** + Load all the data associated with the given `resource`. + + All accessible data files linked to `resource` with rdfs:seeAlso will be + loaded into the world model. + + @param world The world. + @param resource Must be a subject (a URI or a blank node). + @return The number of files parsed, or -1 on error +*/ +LILV_API +int +lilv_world_load_resource(LilvWorld* world, const LilvNode* resource); + +/** + Unload all the data associated with the given `resource`. + + This unloads all data loaded by a previous call to + lilv_world_load_resource() with the given `resource`. + + @param world The world. + @param resource Must be a subject (a URI or a blank node). +*/ +LILV_API +int +lilv_world_unload_resource(LilvWorld* world, const LilvNode* resource); + +/** + Get the parent of all other plugin classes, lv2:Plugin. +*/ +LILV_API +const LilvPluginClass* +lilv_world_get_plugin_class(const LilvWorld* world); + +/** + Return a list of all found plugin classes. + + Returned list is owned by world and must not be freed by the caller. +*/ +LILV_API +const LilvPluginClasses* +lilv_world_get_plugin_classes(const LilvWorld* world); + +/** + Return a list of all found plugins. + + The returned list contains just enough references to query + or instantiate plugins. The data for a particular plugin will not be + loaded into memory until a call to an lilv_plugin_* function results in + a query (at which time the data is cached with the LilvPlugin so future + queries are very fast). + + The returned list and the plugins it contains are owned by `world` + and must not be freed by caller. +*/ +LILV_API +const LilvPlugins* +lilv_world_get_all_plugins(const LilvWorld* world); + +/** + Find nodes matching a triple pattern. + + Either `subject` or `object` may be NULL (a wildcard), but not both. + + @return All matches for the wildcard field, or NULL. +*/ +LILV_API +LilvNodes* +lilv_world_find_nodes(LilvWorld* world, + const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object); + +/** + Find a single node that matches a pattern. + + Exactly one of `subject`, `predicate`, `object` must be NULL. + This function is equivalent to + lilv_nodes_get_first(lilv_world_find_nodes(...)) but simplifies the common + case of only wanting a single value. + + @return The first matching node, or NULL if no matches are found. +*/ +LILV_API +LilvNode* +lilv_world_get(LilvWorld* world, + const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object); + +/** + Return true iff a statement matching a certain pattern exists. + + This is useful for checking if particular statement exists without having to + bother with collections and memory management. + + @param world The world. + @param subject Subject of statement, or NULL for anything. + @param predicate Predicate (key) of statement, or NULL for anything. + @param object Object (value) of statement, or NULL for anything. +*/ +LILV_API +bool +lilv_world_ask(LilvWorld* world, + const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object); + +/** + Get an LV2 symbol for some subject. + + This will return the lv2:symbol property of the subject if it is given + explicitly, and otherwise will attempt to derive a symbol from the URI. + + @return A string node that is a valid LV2 symbol, or NULL on error. +*/ +LILV_API +LilvNode* +lilv_world_get_symbol(LilvWorld* world, const LilvNode* subject); + +/** + @} + @defgroup lilv_plugin Plugins + @{ +*/ + +/** + Check if `plugin` is valid. + + This is not a rigorous validator, but can be used to reject some malformed + plugins that could cause bugs (for example, plugins with missing required + fields). + + Note that normal hosts do NOT need to use this - lilv does not + load invalid plugins into plugin lists. This is included for plugin + testing utilities, etc. + + @return True iff `plugin` is valid. +*/ +LILV_API +bool +lilv_plugin_verify(const LilvPlugin* plugin); + +/** + Get the URI of `plugin`. + + Any serialization that refers to plugins should refer to them by this. + Hosts SHOULD NOT save any filesystem paths, plugin indexes, etc. in saved + files; save only the URI. + + The URI is a globally unique identifier for one specific plugin. Two + plugins with the same URI are compatible in port signature, and should + be guaranteed to work in a compatible and consistent way. If a plugin + is upgraded in an incompatible way (eg if it has different ports), it + MUST have a different URI than it's predecessor. + + @return A shared URI value which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_plugin_get_uri(const LilvPlugin* plugin); + +/** + Get the (resolvable) URI of the plugin's "main" bundle. + + This returns the URI of the bundle where the plugin itself was found. Note + that the data for a plugin may be spread over many bundles, that is, + lilv_plugin_get_data_uris() may return URIs which are not within this + bundle. + + Typical hosts should not need to use this function. + Note this always returns a fully qualified URI. If you want a local + filesystem path, use lilv_file_uri_parse(). + + @return A shared string which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_plugin_get_bundle_uri(const LilvPlugin* plugin); + +/** + Get the (resolvable) URIs of the RDF data files that define a plugin. + + Typical hosts should not need to use this function. + Note this always returns fully qualified URIs. If you want local + filesystem paths, use lilv_file_uri_parse(). + + @return A list of complete URLs eg. "file:///foo/ABundle.lv2/aplug.ttl", + which is shared and must not be modified or freed. +*/ +LILV_API +const LilvNodes* +lilv_plugin_get_data_uris(const LilvPlugin* plugin); + +/** + Get the (resolvable) URI of the shared library for `plugin`. + + Note this always returns a fully qualified URI. If you want a local + filesystem path, use lilv_file_uri_parse(). + + @return A shared string which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_plugin_get_library_uri(const LilvPlugin* plugin); + +/** + Get the name of `plugin`. + + This returns the name (doap:name) of the plugin. The name may be + translated according to the current locale, this value MUST NOT be used + as a plugin identifier (use the URI for that). + + Returned value must be freed by the caller. +*/ +LILV_API +LilvNode* +lilv_plugin_get_name(const LilvPlugin* plugin); + +/** + Get the class this plugin belongs to (like "Filters" or "Effects"). +*/ +LILV_API +const LilvPluginClass* +lilv_plugin_get_class(const LilvPlugin* plugin); + +/** + Get a value associated with the plugin in a plugin's data files. + + `predicate` must be either a URI or a QName. + + Returns the ?object of all triples found of the form: + + <plugin-uri> predicate ?object + + May return NULL if the property was not found, or if object(s) is not + sensibly represented as a LilvNodes. + + Return value must be freed by caller with lilv_nodes_free(). +*/ +LILV_API +LilvNodes* +lilv_plugin_get_value(const LilvPlugin* plugin, const LilvNode* predicate); + +/** + Return whether a feature is supported by a plugin. + + This will return true if the feature is an optional or required feature + of the plugin. +*/ +LILV_API +bool +lilv_plugin_has_feature(const LilvPlugin* plugin, const LilvNode* feature); + +/** + Get the LV2 Features supported (required or optionally) by a plugin. + + A feature is "supported" by a plugin if it is required OR optional. + + Since required features have special rules the host must obey, this function + probably shouldn't be used by normal hosts. Using + lilv_plugin_get_optional_features() and lilv_plugin_get_required_features() + separately is best in most cases. + + Returned value must be freed by caller with lilv_nodes_free(). +*/ +LILV_API +LilvNodes* +lilv_plugin_get_supported_features(const LilvPlugin* plugin); + +/** + Get the LV2 Features required by a plugin. + + If a feature is required by a plugin, hosts MUST NOT use the plugin if they + do not understand (or are unable to support) that feature. + + All values returned here MUST be passed to the plugin's instantiate method + (along with data, if necessary, as defined by the feature specification) + or plugin instantiation will fail. + + Return value must be freed by caller with lilv_nodes_free(). +*/ +LILV_API +LilvNodes* +lilv_plugin_get_required_features(const LilvPlugin* plugin); + +/** + Get the LV2 Features optionally supported by a plugin. + + Hosts MAY ignore optional plugin features for whatever reasons. Plugins + MUST operate (at least somewhat) if they are instantiated without being + passed optional features. + + Return value must be freed by caller with lilv_nodes_free(). +*/ +LILV_API +LilvNodes* +lilv_plugin_get_optional_features(const LilvPlugin* plugin); + +/** + Return whether or not a plugin provides a specific extension data. +*/ +LILV_API +bool +lilv_plugin_has_extension_data(const LilvPlugin* plugin, const LilvNode* uri); + +/** + Get a sequence of all extension data provided by a plugin. + + This can be used to find which URIs lilv_instance_get_extension_data() + will return a value for without instantiating the plugin. +*/ +LILV_API +LilvNodes* +lilv_plugin_get_extension_data(const LilvPlugin* plugin); + +/** + Get the number of ports on this plugin. +*/ +LILV_API +uint32_t +lilv_plugin_get_num_ports(const LilvPlugin* plugin); + +/** + Get the port ranges (minimum, maximum and default values) for all ports. + + `min_values`, `max_values` and `def_values` must either point to an array + of N floats, where N is the value returned by lilv_plugin_get_num_ports() + for this plugin, or NULL. The elements of the array will be set to the + the minimum, maximum and default values of the ports on this plugin, + with array index corresponding to port index. If a port doesn't have a + minimum, maximum or default value, or the port's type is not float, the + corresponding array element will be set to NAN. + + This is a convenience method for the common case of getting the range of + all float ports on a plugin, and may be significantly faster than + repeated calls to lilv_port_get_range(). +*/ +LILV_API +void +lilv_plugin_get_port_ranges_float(const LilvPlugin* plugin, + float* min_values, + float* max_values, + float* def_values); + +/** + Get the number of ports on this plugin that are members of some class(es). + + Note that this is a varargs function so ports fitting any type 'profile' + desired can be found quickly. REMEMBER TO TERMINATE THE PARAMETER LIST + OF THIS FUNCTION WITH NULL OR VERY NASTY THINGS WILL HAPPEN. +*/ +LILV_API +uint32_t +lilv_plugin_get_num_ports_of_class(const LilvPlugin* plugin, + const LilvNode* class_1, + ...); + +/** + Variant of lilv_plugin_get_num_ports_of_class() that takes a va_list. + + This function calls va_arg() on `args` but does not call va_end(). +*/ +LILV_API +uint32_t +lilv_plugin_get_num_ports_of_class_va(const LilvPlugin* plugin, + const LilvNode* class_1, + va_list args); + +/** + Return whether or not the plugin introduces (and reports) latency. + + The index of the latency port can be found with + lilv_plugin_get_latency_port() ONLY if this function returns true. +*/ +LILV_API +bool +lilv_plugin_has_latency(const LilvPlugin* plugin); + +/** + Return the index of the plugin's latency port. + + It is a fatal error to call this on a plugin without checking if the port + exists by first calling lilv_plugin_has_latency(). + + Any plugin that introduces unwanted latency that should be compensated for + (by hosts with the ability/need) MUST provide this port, which is a control + rate output port that reports the latency for each cycle in frames. +*/ +LILV_API +uint32_t +lilv_plugin_get_latency_port_index(const LilvPlugin* plugin); + +/** + Get a port on `plugin` by `index`. +*/ +LILV_API +const LilvPort* +lilv_plugin_get_port_by_index(const LilvPlugin* plugin, uint32_t index); + +/** + Get a port on `plugin` by `symbol`. + + Note this function is slower than lilv_plugin_get_port_by_index(), + especially on plugins with a very large number of ports. +*/ +LILV_API +const LilvPort* +lilv_plugin_get_port_by_symbol(const LilvPlugin* plugin, + const LilvNode* symbol); + +/** + Get a port on `plugin` by its lv2:designation. + + The designation of a port describes the meaning, assignment, allocation or + role of the port, like "left channel" or "gain". If found, the port with + matching `port_class` and `designation` is be returned, otherwise NULL is + returned. The `port_class` can be used to distinguish the input and output + ports for a particular designation. If `port_class` is NULL, any port with + the given designation will be returned. +*/ +LILV_API +const LilvPort* +lilv_plugin_get_port_by_designation(const LilvPlugin* plugin, + const LilvNode* port_class, + const LilvNode* designation); + +/** + Get the project the plugin is a part of. + + More information about the project can be read via lilv_world_find_nodes(), + typically using properties from DOAP (such as doap:name). +*/ +LILV_API +LilvNode* +lilv_plugin_get_project(const LilvPlugin* plugin); + +/** + Get the full name of the plugin's author. + + Returns NULL if author name is not present. + Returned value must be freed by caller. +*/ +LILV_API +LilvNode* +lilv_plugin_get_author_name(const LilvPlugin* plugin); + +/** + Get the email address of the plugin's author. + + Returns NULL if author email address is not present. + Returned value must be freed by caller. +*/ +LILV_API +LilvNode* +lilv_plugin_get_author_email(const LilvPlugin* plugin); + +/** + Get the address of the plugin author's home page. + + Returns NULL if author homepage is not present. + Returned value must be freed by caller. +*/ +LILV_API +LilvNode* +lilv_plugin_get_author_homepage(const LilvPlugin* plugin); + +/** + Return true iff `plugin` has been replaced by another plugin. + + The plugin will still be usable, but hosts should hide them from their + user interfaces to prevent users from using deprecated plugins. +*/ +LILV_API +bool +lilv_plugin_is_replaced(const LilvPlugin* plugin); + +/** + Write the Turtle description of `plugin` to `plugin_file`. + + This function is particularly useful for porting plugins in conjunction with + an LV2 bridge such as NASPRO. +*/ +LILV_API +void +lilv_plugin_write_description(LilvWorld* world, + const LilvPlugin* plugin, + const LilvNode* base_uri, + FILE* plugin_file); + +/** + Write a manifest entry for `plugin` to `manifest_file`. + + This function is intended for use with lilv_plugin_write_description() to + write a complete description of a plugin to a bundle. +*/ +LILV_API +void +lilv_plugin_write_manifest_entry(LilvWorld* world, + const LilvPlugin* plugin, + const LilvNode* base_uri, + FILE* manifest_file, + const char* plugin_file_path); + +/** + Get the resources related to `plugin` with lv2:appliesTo. + + Some plugin-related resources are not linked directly to the plugin with + rdfs:seeAlso and thus will not be automatically loaded along with the plugin + data (usually for performance reasons). All such resources of the given @c + type related to `plugin` can be accessed with this function. + + If `type` is NULL, all such resources will be returned, regardless of type. + + To actually load the data for each returned resource, use + lilv_world_load_resource(). +*/ +LILV_API +LilvNodes* +lilv_plugin_get_related(const LilvPlugin* plugin, const LilvNode* type); + +/** + @} + @defgroup lilv_port Ports + @{ +*/ + +/** + Get the RDF node of `port`. + + Ports nodes may be may be URIs or blank nodes. + + @return A shared node which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_port_get_node(const LilvPlugin* plugin, const LilvPort* port); + +/** + Port analog of lilv_plugin_get_value(). +*/ +LILV_API +LilvNodes* +lilv_port_get_value(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* predicate); + +/** + Get a single property value of a port. + + This is equivalent to lilv_nodes_get_first(lilv_port_get_value(...)) but is + simpler to use in the common case of only caring about one value. The + caller is responsible for freeing the returned node. +*/ +LILV_API +LilvNode* +lilv_port_get(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* predicate); + +/** + Return the LV2 port properties of a port. +*/ +LILV_API +LilvNodes* +lilv_port_get_properties(const LilvPlugin* plugin, const LilvPort* port); + +/** + Return whether a port has a certain property. +*/ +LILV_API +bool +lilv_port_has_property(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* property); + +/** + Return whether a port supports a certain event type. + + More precisely, this returns true iff the port has an atom:supports or an + ev:supportsEvent property with `event_type` as the value. +*/ +LILV_API +bool +lilv_port_supports_event(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* event_type); + +/** + Get the index of a port. + + The index is only valid for the life of the plugin and may change between + versions. For a stable identifier, use the symbol. +*/ +LILV_API +uint32_t +lilv_port_get_index(const LilvPlugin* plugin, const LilvPort* port); + +/** + Get the symbol of a port. + + The 'symbol' is a short string, a valid C identifier. + Returned value is owned by `port` and must not be freed. +*/ +LILV_API +const LilvNode* +lilv_port_get_symbol(const LilvPlugin* plugin, const LilvPort* port); + +/** + Get the name of a port. + + This is guaranteed to return the untranslated name (the doap:name in the + data file without a language tag). Returned value must be freed by + the caller. +*/ +LILV_API +LilvNode* +lilv_port_get_name(const LilvPlugin* plugin, const LilvPort* port); + +/** + Get all the classes of a port. + + This can be used to determine if a port is an input, output, audio, + control, midi, etc, etc, though it's simpler to use lilv_port_is_a(). + The returned list does not include lv2:Port, which is implied. + Returned value is shared and must not be destroyed by caller. +*/ +LILV_API +const LilvNodes* +lilv_port_get_classes(const LilvPlugin* plugin, const LilvPort* port); + +/** + Determine if a port is of a given class (input, output, audio, etc). + + For convenience/performance/extensibility reasons, hosts are expected to + create a LilvNode for each port class they "care about". Well-known type + URI strings like `LILV_URI_INPUT_PORT` are defined for convenience, but + this function is designed so that Lilv is usable with any port types + without requiring explicit support in Lilv. +*/ +LILV_API +bool +lilv_port_is_a(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* port_class); + +/** + Get the default, minimum, and maximum values of a port. + + `def`, `min`, and `max` are outputs, pass pointers to uninitialized + LilvNode* variables. These will be set to point at new values (which must + be freed by the caller using lilv_node_free()), or NULL if the value does + not exist. +*/ +LILV_API +void +lilv_port_get_range(const LilvPlugin* plugin, + const LilvPort* port, + LilvNode** def, + LilvNode** min, + LilvNode** max); + +/** + Get the scale points (enumeration values) of a port. + + This returns a collection of 'interesting' named values of a port, which for + example might be appropriate entries for a value selector in a UI. + + Returned value may be NULL if `port` has no scale points, otherwise it + must be freed by caller with lilv_scale_points_free(). +*/ +LILV_API +LilvScalePoints* +lilv_port_get_scale_points(const LilvPlugin* plugin, const LilvPort* port); + +/** + @} + @defgroup lilv_state Plugin State + @{ +*/ + +/** + Load a state snapshot from the world RDF model. + + This function can be used to load the default state of a plugin by passing + the plugin URI as the `subject` parameter. + + @param world The world. + @param map URID mapper. + @param node The subject of the state description (such as a preset URI). + @return A new LilvState which must be freed with lilv_state_free(), or NULL. +*/ +LILV_API +LilvState* +lilv_state_new_from_world(LilvWorld* world, + LV2_URID_Map* map, + const LilvNode* node); + +/** + Load a state snapshot from a file. + + If `subject` is NULL, it is taken to be the URI of the file (`<>` in + Turtle). + + This function parses the file separately to create the state, it does not + parse the file into the world model, that is, the returned state is the only + new memory consumed once this function returns. + + @param world The world. + @param map URID mapper. + @param subject The subject of the state description (such as a preset URI). + @param path The path of the file containing the state description. + @return A new LilvState which must be freed with lilv_state_free(). +*/ +LILV_API +LilvState* +lilv_state_new_from_file(LilvWorld* world, + LV2_URID_Map* map, + const LilvNode* subject, + const char* path); + +/** + Load a state snapshot from a string made by lilv_state_to_string(). +*/ +LILV_API +LilvState* +lilv_state_new_from_string(LilvWorld* world, + LV2_URID_Map* map, + const char* str); + +/** + Function to get a port value. + + This function MUST set `size` and `type` appropriately. + + @param port_symbol The symbol of the port. + @param user_data The user_data passed to lilv_state_new_from_instance(). + @param size (Output) The size of the returned value. + @param type (Output) The URID of the type of the returned value. + @return A pointer to the port value. +*/ +typedef const void* (*LilvGetPortValueFunc)(const char* port_symbol, + void* user_data, + uint32_t* size, + uint32_t* type); + +/** + Create a new state snapshot from a plugin instance. + + + This function may be called simultaneously with any instance function + (except discovery functions) unless the threading class of that function + explicitly disallows this. + + To support advanced file functionality, there are several directory + parameters. The multiple parameters are necessary to support saving an + instance's state many times, or saving states from multiple instances, while + avoiding any duplication of data. For example, a host could pass the same + `copy_dir` and `link_dir` for all plugins in a session (for example + `session/shared/copy/` `session/shared/link/`), while the `save_dir` would + be unique to each plugin instance (for example `session/states/state1.lv2` + for one instance and `session/states/state2.lv2` for another instance). + Simple hosts that only wish to save a single plugin's state once may simply + use the same directory for all of them, or pass NULL to not support files at + all. + + If supported (via state:makePath passed to LV2_Descriptor::instantiate()), + `scratch_dir` should be the directory where any files created by the plugin + (for example during instantiation or while running) are stored. Any files + here that are referred to in the state will be copied to preserve their + contents at the time of the save. Lilv will assume any files within this + directory (recursively) are created by the plugin and that all other files + are immutable. Note that this function does not completely save the state, + use lilv_state_save() for that. + + See state.h from the + LV2 State extension for details on the `flags` and `features` parameters. + + @param plugin The plugin this state applies to. + + @param instance An instance of `plugin`. + + @param map The map to use for mapping URIs in state. + + @param scratch_dir Directory of files created by the plugin earlier, or + NULL. This is for hosts that support file creation at any time with state + state:makePath. These files will be copied as necessary to `copy_dir` and + not be referred to directly in state (a temporary directory is appropriate). + + @param copy_dir Directory of copies of files in `scratch_dir`, or NULL. + This directory will have the same structure as `scratch_dir` but with + possibly modified file names to distinguish revisions. This allows the + saved state to contain the exact contents of the scratch file at save time, + so that the state is not ruined if the file is later modified (for example, + by the plugin continuing to record). This can be the same as `save_dir` to + create a copy in the state bundle, but can also be a separate directory + which allows multiple state snapshots to share a single copy if the file has + not changed. + + @param link_dir Directory of links to external files, or NULL. A link will + be made in this directory to any external files referred to in plugin state. + In turn, links will be created in the save directory to these links (like + save_dir/file => link_dir/file => /foo/bar/file). This allows many state + snapshots to share a single link to an external file, so archival (for + example, with `tar -h`) will not create several copies of the file. If this + is not required, it can be the same as `save_dir`. + + @param save_dir Directory of files created by plugin during save (or NULL). + This is typically the bundle directory later passed to lilv_state_save(). + + @param get_value Function to get port values (or NULL). If NULL, the + returned state will not represent port values. This should only be NULL in + hosts that save and restore port values via some other mechanism. + + @param user_data User data to pass to `get_value`. + + @param flags Bitwise OR of LV2_State_Flags values. + + @param features Features to pass LV2_State_Interface.save(). + + @return A new LilvState which must be freed with lilv_state_free(). +*/ +LILV_API +LilvState* +lilv_state_new_from_instance(const LilvPlugin* plugin, + LilvInstance* instance, + LV2_URID_Map* map, + const char* scratch_dir, + const char* copy_dir, + const char* link_dir, + const char* save_dir, + LilvGetPortValueFunc get_value, + void* user_data, + uint32_t flags, + const LV2_Feature* const* features); + +/** + Free `state`. +*/ +LILV_API +void +lilv_state_free(LilvState* state); + +/** + Return true iff `a` is equivalent to `b`. +*/ +LILV_API +bool +lilv_state_equals(const LilvState* a, const LilvState* b); + +/** + Return the number of properties in `state`. +*/ +LILV_API +unsigned +lilv_state_get_num_properties(const LilvState* state); + +/** + Get the URI of the plugin `state` applies to. +*/ +LILV_API +const LilvNode* +lilv_state_get_plugin_uri(const LilvState* state); + +/** + Get the URI of `state`. + + This may return NULL if the state has not been saved and has no URI. +*/ +LILV_API +const LilvNode* +lilv_state_get_uri(const LilvState* state); + +/** + Get the label of `state`. +*/ +LILV_API +const char* +lilv_state_get_label(const LilvState* state); + +/** + Set the label of `state`. +*/ +LILV_API +void +lilv_state_set_label(LilvState* state, const char* label); + +/** + Set a metadata property on `state`. + + This is a generic version of lilv_state_set_label(), which sets metadata + properties visible to hosts, but not plugins. This allows storing useful + information such as comments or preset banks. + + @param state The state to set the metadata for. + @param key The key to store `value` under (URID). + @param value Pointer to the value to be stored. + @param size The size of `value` in bytes. + @param type The type of `value` (URID). + @param flags LV2_State_Flags for `value`. + @return Zero on success. +*/ +LILV_API +int +lilv_state_set_metadata(LilvState* state, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags); + +/** + Function to set a port value. + + @param port_symbol The symbol of the port. + @param user_data The user_data passed to lilv_state_restore(). + @param size The size of `value`. + @param type The URID of the type of `value`. + @param value A pointer to the port value. +*/ +typedef void (*LilvSetPortValueFunc)(const char* port_symbol, + void* user_data, + const void* value, + uint32_t size, + uint32_t type); + +/** + Enumerate the port values in a state snapshot. + + This function is a subset of lilv_state_restore() that only fires the + `set_value` callback and does not directly affect a plugin instance. This + is useful in hosts that need to retrieve the port values in a state snapshot + for special handling. + + @param state The state to retrieve port values from. + @param set_value A function to receive port values. + @param user_data User data to pass to `set_value`. +*/ +LILV_API +void +lilv_state_emit_port_values(const LilvState* state, + LilvSetPortValueFunc set_value, + void* user_data); + +/** + Restore a plugin instance from a state snapshot. + + This will set all the properties of `instance`, if given, to the values + stored in `state`. If `set_value` is provided, it will be called (with the + given `user_data`) to restore each port value, otherwise the host must + restore the port values itself (using lilv_state_get_port_value()) in order + to completely restore `state`. + + If the state has properties and `instance` is given, this function is in + the "instantiation" threading class, so it MUST NOT be called + simultaneously with any function on the same plugin instance. If the state + has no properties, only port values are set via `set_value`. + + See state.h from the + LV2 State extension for details on the `flags` and `features` parameters. + + @param state The state to restore, which must apply to the correct plugin. + @param instance An instance of the plugin `state` applies to, or NULL. + @param set_value A function to set a port value (may be NULL). + @param user_data User data to pass to `set_value`. + @param flags Bitwise OR of LV2_State_Flags values. + @param features Features to pass LV2_State_Interface.restore(). +*/ +LILV_API +void +lilv_state_restore(const LilvState* state, + LilvInstance* instance, + LilvSetPortValueFunc set_value, + void* user_data, + uint32_t flags, + const LV2_Feature* const* features); + +/** + Save state to a file. + + The format of state on disk is compatible with that defined in the LV2 + preset extension, so this function may be used to save presets which can + be loaded by any host. + + If `uri` is NULL, the preset URI will be a file URI, but the bundle + can safely be moved (the state file will use `<>` as the subject). + + @param world The world. + @param map URID mapper. + @param unmap URID unmapper. + @param state State to save. + @param uri URI of state, may be NULL. + @param dir Path of the bundle directory to save into. + @param filename Path of the state file relative to `dir`. +*/ +LILV_API +int +lilv_state_save(LilvWorld* world, + LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + const LilvState* state, + const char* uri, + const char* dir, + const char* filename); + +/** + Save state to a string. + + This function does not use the filesystem. + + @param world The world. + + @param map URID mapper. + + @param unmap URID unmapper. + + @param state The state to serialize. + + @param uri URI for the state description (mandatory). + + @param base_uri Base URI for serialisation. Unless you know what you are + doing, pass NULL for this, otherwise the state may not be restorable via + lilv_state_new_from_string(). +*/ +LILV_API +char* +lilv_state_to_string(LilvWorld* world, + LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + const LilvState* state, + const char* uri, + const char* base_uri); + +/** + Unload a state from the world and delete all associated files. + + This function DELETES FILES/DIRECTORIES FROM THE FILESYSTEM! It is intended + for removing user-saved presets, but can delete any state the user has + permission to delete, including presets shipped with plugins. + + The rdfs:seeAlso file for the state will be removed. The entry in the + bundle's manifest.ttl is removed, and if this results in an empty manifest, + then the manifest file is removed. If this results in an empty bundle, then + the bundle directory is removed as well. + + @param world The world. + @param state State to remove from the system. +*/ +LILV_API +int +lilv_state_delete(LilvWorld* world, const LilvState* state); + +/** + @} + @defgroup lilv_scalepoint Scale Points + @{ +*/ + +/** + Get the label of this scale point (enumeration value). + + Returned value is owned by `point` and must not be freed. +*/ +LILV_API +const LilvNode* +lilv_scale_point_get_label(const LilvScalePoint* point); + +/** + Get the value of this scale point (enumeration value). + + Returned value is owned by `point` and must not be freed. +*/ +LILV_API +const LilvNode* +lilv_scale_point_get_value(const LilvScalePoint* point); + +/** + @} + @defgroup lilv_class Plugin Classes + @{ +*/ + +/** + Get the URI of this class' superclass. + + Returned value is owned by `plugin_class` and must not be freed by caller. + Returned value may be NULL, if class has no parent. +*/ +LILV_API +const LilvNode* +lilv_plugin_class_get_parent_uri(const LilvPluginClass* plugin_class); + +/** + Get the URI of this plugin class. + + Returned value is owned by `plugin_class` and must not be freed by caller. +*/ +LILV_API +const LilvNode* +lilv_plugin_class_get_uri(const LilvPluginClass* plugin_class); + +/** + Get the label of this plugin class, like "Oscillators". + + Returned value is owned by `plugin_class` and must not be freed by caller. +*/ +LILV_API +const LilvNode* +lilv_plugin_class_get_label(const LilvPluginClass* plugin_class); + +/** + Get the subclasses of this plugin class. + + Returned value must be freed by caller with lilv_plugin_classes_free(). +*/ +LILV_API +LilvPluginClasses* +lilv_plugin_class_get_children(const LilvPluginClass* plugin_class); + +/** + @} + @defgroup lilv_instance Plugin Instances + @{ +*/ + +/** + @cond LILV_DOCUMENT_INSTANCE_IMPL +*/ + +/* Instance of a plugin. + + This is exposed in the ABI to allow inlining of performance critical + functions like lilv_instance_run() (simple wrappers of functions in lv2.h). + This is for performance reasons, user code should not use this definition + in any way (which is why it is not machine documented). + Truly private implementation details are hidden via `pimpl`. +*/ +struct LilvInstanceImpl { + const LV2_Descriptor* lv2_descriptor; + LV2_Handle lv2_handle; + void* pimpl; +}; + +/** + @endcond +*/ + +/** + Instantiate a plugin. + + The returned value is a lightweight handle for an LV2 plugin instance, + it does not refer to `plugin`, or any other Lilv state. The caller must + eventually free it with lilv_instance_free(). + `features` is a NULL-terminated array of features the host supports. + NULL may be passed if the host supports no additional features. + + @return NULL if instantiation failed. +*/ +LILV_API +LilvInstance* +lilv_plugin_instantiate(const LilvPlugin* plugin, + double sample_rate, + const LV2_Feature* const* features); + +/** + Free a plugin instance. + + It is safe to call this function on NULL. + `instance` is invalid after this call. +*/ +LILV_API +void +lilv_instance_free(LilvInstance* instance); + +#ifndef LILV_INTERNAL + +/** + Get the URI of the plugin which `instance` is an instance of. + + Returned string is shared and must not be modified or deleted. +*/ +static inline const char* +lilv_instance_get_uri(const LilvInstance* instance) +{ + return instance->lv2_descriptor->URI; +} + +/** + Connect a port to a data location. + + This may be called regardless of whether the plugin is activated, + activation and deactivation does not destroy port connections. +*/ +static inline void +lilv_instance_connect_port(LilvInstance* instance, + uint32_t port_index, + void* data_location) +{ + instance->lv2_descriptor->connect_port( + instance->lv2_handle, port_index, data_location); +} + +/** + Activate a plugin instance. + + This resets all state information in the plugin, except for port data + locations (as set by lilv_instance_connect_port()). This MUST be called + before calling lilv_instance_run(). +*/ +static inline void +lilv_instance_activate(LilvInstance* instance) +{ + if (instance->lv2_descriptor->activate) { + instance->lv2_descriptor->activate(instance->lv2_handle); + } +} + +/** + Run `instance` for `sample_count` frames. + + If the hint lv2:hardRTCapable is set for this plugin, this function is + guaranteed not to block. +*/ +static inline void +lilv_instance_run(LilvInstance* instance, uint32_t sample_count) +{ + instance->lv2_descriptor->run(instance->lv2_handle, sample_count); +} + +/** + Deactivate a plugin instance. + + Note that to run the plugin after this you must activate it, which will + reset all state information (except port connections). +*/ +static inline void +lilv_instance_deactivate(LilvInstance* instance) +{ + if (instance->lv2_descriptor->deactivate) { + instance->lv2_descriptor->deactivate(instance->lv2_handle); + } +} + +/** + Get extension data from the plugin instance. + + The type and semantics of the data returned is specific to the particular + extension, though in all cases it is shared and must not be deleted. +*/ +static inline const void* +lilv_instance_get_extension_data(const LilvInstance* instance, const char* uri) +{ + if (instance->lv2_descriptor->extension_data) { + return instance->lv2_descriptor->extension_data(uri); + } + + return NULL; +} + +/** + Get the LV2_Descriptor of the plugin instance. + + Normally hosts should not need to access the LV2_Descriptor directly, + use the lilv_instance_* functions. + + The returned descriptor is shared and must not be deleted. +*/ +static inline const LV2_Descriptor* +lilv_instance_get_descriptor(const LilvInstance* instance) +{ + return instance->lv2_descriptor; +} + +/** + Get the LV2_Handle of the plugin instance. + + Normally hosts should not need to access the LV2_Handle directly, + use the lilv_instance_* functions. + + The returned handle is shared and must not be deleted. +*/ +static inline LV2_Handle +lilv_instance_get_handle(const LilvInstance* instance) +{ + return instance->lv2_handle; +} + +#endif /* LILV_INTERNAL */ + +/** + @} + @defgroup lilv_ui Plugin UIs + @{ +*/ + +/** + Get all UIs for `plugin`. + + Returned value must be freed by caller using lilv_uis_free(). +*/ +LILV_API +LilvUIs* +lilv_plugin_get_uis(const LilvPlugin* plugin); + +/** + Get the URI of a Plugin UI. + + @return A shared value which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_ui_get_uri(const LilvUI* ui); + +/** + Get the types (URIs of RDF classes) of a Plugin UI. + + Note that in most cases lilv_ui_is_supported() should be used, which avoids + the need to use this function (and type specific logic). + + @return A shared value which must not be modified or freed. +*/ +LILV_API +const LilvNodes* +lilv_ui_get_classes(const LilvUI* ui); + +/** + Check whether a plugin UI has a given type. + + @param ui The Plugin UI + @param class_uri The URI of the LV2 UI type to check this UI against +*/ +LILV_API +bool +lilv_ui_is_a(const LilvUI* ui, const LilvNode* class_uri); + +/** + Function to determine whether a UI type is supported. + + This is provided by the user and must return non-zero iff using a UI of type + `ui_type_uri` in a container of type `container_type_uri` is supported. +*/ +typedef unsigned (*LilvUISupportedFunc)(const char* container_type_uri, + const char* ui_type_uri); + +/** + Return true iff a Plugin UI is supported as a given widget type. + + @param ui The Plugin UI + + @param supported_func User provided supported predicate. + + @param container_type The widget type to host the UI within. + + @param ui_type (Output) If non-NULL, set to the native type of the UI + which is owned by `ui` and must not be freed by the caller. + + @return The embedding quality level returned by `supported_func`. +*/ +LILV_API +unsigned +lilv_ui_is_supported(const LilvUI* ui, + LilvUISupportedFunc supported_func, + const LilvNode* container_type, + const LilvNode** ui_type); + +/** + Get the URI for a Plugin UI's bundle. + + @return A shared value which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_ui_get_bundle_uri(const LilvUI* ui); + +/** + Get the URI for a Plugin UI's shared library. + + @return A shared value which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_ui_get_binary_uri(const LilvUI* ui); + +/** + @} + @} +*/ + +#ifdef __cplusplus +# if defined(__clang__) +# pragma clang diagnostic pop +# endif +} /* extern "C" */ +#endif + +#endif /* LILV_LILV_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,440 @@ +/* + Copyright 2007-2017 David Robillard + + 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. +*/ + +#ifndef LILV_LILVMM_HPP +#define LILV_LILVMM_HPP + +#include "lilv/lilv.h" +#include "lv2/core/lv2.h" + +#include +#include + +namespace Lilv { + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdeprecated-declarations" +#elif defined(__GNUC__) && __GNUC__ > 4 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + +struct Instance; +struct Node; +struct Nodes; +struct Plugin; +struct PluginClass; +struct PluginClasses; +struct Plugins; +struct Port; +struct ScalePoint; +struct ScalePoints; +struct UI; +struct UIs; +struct World; + +LILV_DEPRECATED +static inline const char* +uri_to_path(const char* uri) +{ + return lilv_uri_to_path(uri); +} + +#if defined(__clang__) +# pragma clang diagnostic pop +#elif defined(__GNUC__) && __GNUC__ > 4 +# pragma GCC diagnostic pop +#endif + +#define LILV_WRAP0(RT, prefix, name) \ + inline RT name() { return lilv_##prefix##_##name(me); } + +#define LILV_WRAP0_VOID(prefix, name) \ + inline void name() { lilv_##prefix##_##name(me); } + +#define LILV_WRAP1(RT, prefix, name, T1, a1) \ + inline RT name(T1 a1) { return lilv_##prefix##_##name(me, a1); } + +#define LILV_WRAP1_VOID(prefix, name, T1, a1) \ + inline void name(T1 a1) { lilv_##prefix##_##name(me, a1); } + +#define LILV_WRAP2(RT, prefix, name, T1, a1, T2, a2) \ + inline RT name(T1 a1, T2 a2) { return lilv_##prefix##_##name(me, a1, a2); } + +#define LILV_WRAP3(RT, prefix, name, T1, a1, T2, a2, T3, a3) \ + inline RT name(T1 a1, T2 a2, T3 a3) \ + { \ + return lilv_##prefix##_##name(me, a1, a2, a3); \ + } + +#define LILV_WRAP2_VOID(prefix, name, T1, a1, T2, a2) \ + inline void name(T1 a1, T2 a2) { lilv_##prefix##_##name(me, a1, a2); } + +#ifndef SWIG +# define LILV_WRAP_CONVERSION(CT) \ + inline operator CT*() const { return me; } +#else +# define LILV_WRAP_CONVERSION(CT) +#endif + +struct Node { + inline Node(const LilvNode* node) + : me(lilv_node_duplicate(node)) + {} + + inline Node(const Node& copy) + : me(lilv_node_duplicate(copy.me)) + {} + + inline Node& operator=(const Node& rhs) + { + if (&rhs != this) { + lilv_node_free(me); + me = lilv_node_duplicate(rhs.me); + } + return *this; + } + + inline Node(Node&& other) noexcept + : me(other.me) + { + other.me = nullptr; + } + + inline Node& operator=(Node&& rhs) noexcept + { + if (&rhs != this) { + me = rhs.me; + rhs.me = nullptr; + } + return *this; + } + + inline ~Node() { lilv_node_free(me); } + + inline bool equals(const Node& other) const + { + return lilv_node_equals(me, other.me); + } + + inline bool operator==(const Node& other) const { return equals(other); } + + LILV_WRAP_CONVERSION(LilvNode); + + LILV_WRAP0(char*, node, get_turtle_token); + LILV_WRAP0(bool, node, is_uri); + LILV_WRAP0(const char*, node, as_uri); + LILV_WRAP0(bool, node, is_blank); + LILV_WRAP0(const char*, node, as_blank); + LILV_WRAP0(bool, node, is_literal); + LILV_WRAP0(bool, node, is_string); + LILV_WRAP0(const char*, node, as_string); + LILV_WRAP0(bool, node, is_float); + LILV_WRAP0(float, node, as_float); + LILV_WRAP0(bool, node, is_int); + LILV_WRAP0(int, node, as_int); + LILV_WRAP0(bool, node, is_bool); + LILV_WRAP0(bool, node, as_bool); + + LilvNode* me; +}; + +struct ScalePoint { + inline ScalePoint(const LilvScalePoint* c_obj) + : me(c_obj) + {} + + LILV_WRAP_CONVERSION(const LilvScalePoint); + + LILV_WRAP0(const LilvNode*, scale_point, get_label); + LILV_WRAP0(const LilvNode*, scale_point, get_value); + + const LilvScalePoint* me; +}; + +struct PluginClass { + inline PluginClass(const LilvPluginClass* c_obj) + : me(c_obj) + {} + + LILV_WRAP_CONVERSION(const LilvPluginClass); + + LILV_WRAP0(Node, plugin_class, get_parent_uri); + LILV_WRAP0(Node, plugin_class, get_uri); + LILV_WRAP0(Node, plugin_class, get_label); + LILV_WRAP0(LilvPluginClasses*, plugin_class, get_children); + + const LilvPluginClass* me; +}; + +#define LILV_WRAP_COLL(CT, ET, prefix) \ + inline CT(const Lilv##CT* c_obj) \ + : me(c_obj) \ + {} \ + LILV_WRAP_CONVERSION(const Lilv##CT); \ + LILV_WRAP0(unsigned, prefix, size); \ + LILV_WRAP1(ET, prefix, get, LilvIter*, i); \ + LILV_WRAP0(LilvIter*, prefix, begin); \ + LILV_WRAP1(LilvIter*, prefix, next, LilvIter*, i); \ + LILV_WRAP1(bool, prefix, is_end, LilvIter*, i); \ + const Lilv##CT* me; + +struct PluginClasses { + LILV_WRAP_COLL(PluginClasses, PluginClass, plugin_classes); + LILV_WRAP1(PluginClass, plugin_classes, get_by_uri, const LilvNode*, uri); +}; + +struct ScalePoints { + LILV_WRAP_COLL(ScalePoints, ScalePoint, scale_points); +}; + +struct Nodes { + LILV_WRAP_COLL(Nodes, Node, nodes); + LILV_WRAP1(bool, nodes, contains, const Node&, node); + LILV_WRAP0(Node, nodes, get_first); +}; + +struct UI { + inline UI(const LilvUI* c_obj) + : me(c_obj) + {} + + LILV_WRAP_CONVERSION(const LilvUI); + + LILV_WRAP0(const LilvNode*, ui, get_uri); + LILV_WRAP0(const LilvNode*, ui, get_bundle_uri); + LILV_WRAP0(const LilvNode*, ui, get_binary_uri); + LILV_WRAP0(const LilvNodes*, ui, get_classes); + /*LILV_WRAP3(bool, ui, is_supported, + LilvUISupportedFunc, supported_func, + const LilvNode*, container_type, + const LilvNode**, ui_type);*/ + LILV_WRAP1(bool, ui, is_a, const LilvNode*, class_uri); + + const LilvUI* me; +}; + +struct UIs { + LILV_WRAP_COLL(UIs, UI, uis); +}; + +struct Port { + inline Port(const LilvPlugin* p, const LilvPort* c_obj) + : parent(p) + , me(c_obj) + {} + + LILV_WRAP_CONVERSION(const LilvPort); + +#define LILV_PORT_WRAP0(RT, name) \ + inline RT name() { return lilv_port_##name(parent, me); } + +#define LILV_PORT_WRAP1(RT, name, T1, a1) \ + inline RT name(T1 a1) { return lilv_port_##name(parent, me, a1); } + + LILV_PORT_WRAP1(LilvNodes*, get_value, LilvNode*, predicate); + LILV_PORT_WRAP0(LilvNodes*, get_properties) + LILV_PORT_WRAP1(bool, has_property, LilvNode*, property_uri); + LILV_PORT_WRAP1(bool, supports_event, LilvNode*, event_uri); + LILV_PORT_WRAP0(const LilvNode*, get_symbol); + LILV_PORT_WRAP0(LilvNode*, get_name); + LILV_PORT_WRAP0(const LilvNodes*, get_classes); + LILV_PORT_WRAP1(bool, is_a, LilvNode*, port_class); + LILV_PORT_WRAP0(LilvScalePoints*, get_scale_points); + + // TODO: get_range (output parameters) + + const LilvPlugin* parent; + const LilvPort* me; +}; + +struct Plugin { + inline Plugin(const LilvPlugin* c_obj) + : me(c_obj) + {} + + LILV_WRAP_CONVERSION(const LilvPlugin); + + LILV_WRAP0(bool, plugin, verify); + LILV_WRAP0(Node, plugin, get_uri); + LILV_WRAP0(Node, plugin, get_bundle_uri); + LILV_WRAP0(Nodes, plugin, get_data_uris); + LILV_WRAP0(Node, plugin, get_library_uri); + LILV_WRAP0(Node, plugin, get_name); + LILV_WRAP0(PluginClass, plugin, get_class); + LILV_WRAP1(Nodes, plugin, get_value, const Node&, pred); + LILV_WRAP1(bool, plugin, has_feature, const Node&, feature_uri); + LILV_WRAP0(Nodes, plugin, get_supported_features); + LILV_WRAP0(Nodes, plugin, get_required_features); + LILV_WRAP0(Nodes, plugin, get_optional_features); + LILV_WRAP0(unsigned, plugin, get_num_ports); + LILV_WRAP0(bool, plugin, has_latency); + LILV_WRAP0(unsigned, plugin, get_latency_port_index); + LILV_WRAP0(Node, plugin, get_author_name); + LILV_WRAP0(Node, plugin, get_author_email); + LILV_WRAP0(Node, plugin, get_author_homepage); + LILV_WRAP0(bool, plugin, is_replaced); + LILV_WRAP0(Nodes, plugin, get_extension_data); + LILV_WRAP0(UIs, plugin, get_uis); + LILV_WRAP1(Nodes, plugin, get_related, const Node&, type); + + inline Port get_port_by_index(unsigned index) const + { + return Port(me, lilv_plugin_get_port_by_index(me, index)); + } + + inline Port get_port_by_symbol(LilvNode* symbol) const + { + return Port(me, lilv_plugin_get_port_by_symbol(me, symbol)); + } + + inline void get_port_ranges_float(float* min_values, + float* max_values, + float* def_values) const + { + return lilv_plugin_get_port_ranges_float( + me, min_values, max_values, def_values); + } + + inline unsigned get_num_ports_of_class(LilvNode* class_1, ...) const + { + va_list args; + va_start(args, class_1); + + const uint32_t count = + lilv_plugin_get_num_ports_of_class_va(me, class_1, args); + + va_end(args); + return count; + } + + const LilvPlugin* me; +}; + +struct Plugins { + LILV_WRAP_COLL(Plugins, Plugin, plugins); + LILV_WRAP1(Plugin, plugins, get_by_uri, const LilvNode*, uri); +}; + +struct Instance { + inline Instance(LilvInstance* instance) + : me(instance) + {} + + LILV_DEPRECATED + inline Instance(Plugin plugin, double sample_rate) + { + me = lilv_plugin_instantiate(plugin, sample_rate, nullptr); + } + + LILV_DEPRECATED inline Instance(Plugin plugin, + double sample_rate, + LV2_Feature* const* features) + { + me = lilv_plugin_instantiate(plugin, sample_rate, features); + } + + static inline Instance* create(Plugin plugin, + double sample_rate, + LV2_Feature* const* features) + { + LilvInstance* me = lilv_plugin_instantiate(plugin, sample_rate, features); + + return me ? new Instance(me) : nullptr; + } + + LILV_WRAP_CONVERSION(LilvInstance); + + LILV_WRAP2_VOID(instance, + connect_port, + unsigned, + port_index, + void*, + data_location); + + LILV_WRAP0_VOID(instance, activate); + LILV_WRAP1_VOID(instance, run, unsigned, sample_count); + LILV_WRAP0_VOID(instance, deactivate); + + inline const void* get_extension_data(const char* uri) const + { + return lilv_instance_get_extension_data(me, uri); + } + + inline const LV2_Descriptor* get_descriptor() const + { + return lilv_instance_get_descriptor(me); + } + + inline LV2_Handle get_handle() const { return lilv_instance_get_handle(me); } + + LilvInstance* me; +}; + +struct World { + inline World() + : me(lilv_world_new()) + {} + + inline ~World() { lilv_world_free(me); } + + World(const World&) = delete; + World& operator=(const World&) = delete; + + World(World&&) = delete; + World& operator=(World&&) = delete; + + inline LilvNode* new_uri(const char* uri) const + { + return lilv_new_uri(me, uri); + } + + inline LilvNode* new_string(const char* str) const + { + return lilv_new_string(me, str); + } + + inline LilvNode* new_int(int val) const { return lilv_new_int(me, val); } + + inline LilvNode* new_float(float val) const + { + return lilv_new_float(me, val); + } + + inline LilvNode* new_bool(bool val) const { return lilv_new_bool(me, val); } + + inline Nodes find_nodes(const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object) const + { + return lilv_world_find_nodes(me, subject, predicate, object); + } + + LILV_WRAP2_VOID(world, set_option, const char*, uri, LilvNode*, value); + LILV_WRAP0_VOID(world, load_all); + LILV_WRAP1_VOID(world, load_bundle, LilvNode*, bundle_uri); + LILV_WRAP0(const LilvPluginClass*, world, get_plugin_class); + LILV_WRAP0(const LilvPluginClasses*, world, get_plugin_classes); + LILV_WRAP0(Plugins, world, get_all_plugins); + LILV_WRAP1(int, world, load_resource, const LilvNode*, resource); + + LilvWorld* me; +}; + +} /* namespace Lilv */ + +#endif /* LILV_LILVMM_HPP */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,240 @@ +/* + Copyright 2008-2019 David Robillard + + 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. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "sord/sord.h" +#include "zix/common.h" +#include "zix/tree.h" + +#include +#include +#include + +int +lilv_ptr_cmp(const void* a, const void* b, const void* user_data) +{ + (void)user_data; + + return (intptr_t)a - (intptr_t)b; +} + +int +lilv_resource_node_cmp(const void* a, const void* b, const void* user_data) +{ + (void)user_data; + + const SordNode* an = ((const LilvNode*)a)->node; + const SordNode* bn = ((const LilvNode*)b)->node; + + return (intptr_t)an - (intptr_t)bn; +} + +/* Generic collection functions */ + +static inline LilvCollection* +lilv_collection_new(ZixComparator cmp, ZixDestroyFunc destructor) +{ + return zix_tree_new(false, cmp, NULL, destructor); +} + +void +lilv_collection_free(LilvCollection* collection) +{ + if (collection) { + zix_tree_free((ZixTree*)collection); + } +} + +unsigned +lilv_collection_size(const LilvCollection* collection) +{ + return (collection ? zix_tree_size((const ZixTree*)collection) : 0); +} + +LilvIter* +lilv_collection_begin(const LilvCollection* collection) +{ + return collection ? (LilvIter*)zix_tree_begin((ZixTree*)collection) : NULL; +} + +void* +lilv_collection_get(const LilvCollection* collection, const LilvIter* i) +{ + (void)collection; + + return zix_tree_get((const ZixTreeIter*)i); +} + +/* Constructors */ + +LilvScalePoints* +lilv_scale_points_new(void) +{ + return lilv_collection_new(lilv_ptr_cmp, + (ZixDestroyFunc)lilv_scale_point_free); +} + +LilvNodes* +lilv_nodes_new(void) +{ + return lilv_collection_new(lilv_ptr_cmp, (ZixDestroyFunc)lilv_node_free); +} + +LilvUIs* +lilv_uis_new(void) +{ + return lilv_collection_new(lilv_header_compare_by_uri, + (ZixDestroyFunc)lilv_ui_free); +} + +LilvPluginClasses* +lilv_plugin_classes_new(void) +{ + return lilv_collection_new(lilv_header_compare_by_uri, + (ZixDestroyFunc)lilv_plugin_class_free); +} + +/* URI based accessors (for collections of things with URIs) */ + +const LilvPluginClass* +lilv_plugin_classes_get_by_uri(const LilvPluginClasses* classes, + const LilvNode* uri) +{ + return (LilvPluginClass*)lilv_collection_get_by_uri((const ZixTree*)classes, + uri); +} + +const LilvUI* +lilv_uis_get_by_uri(const LilvUIs* uis, const LilvNode* uri) +{ + return (LilvUI*)lilv_collection_get_by_uri((const ZixTree*)uis, uri); +} + +/* Plugins */ + +LilvPlugins* +lilv_plugins_new(void) +{ + return lilv_collection_new(lilv_header_compare_by_uri, NULL); +} + +const LilvPlugin* +lilv_plugins_get_by_uri(const LilvPlugins* plugins, const LilvNode* uri) +{ + return (LilvPlugin*)lilv_collection_get_by_uri((const ZixTree*)plugins, uri); +} + +/* Nodes */ + +bool +lilv_nodes_contains(const LilvNodes* nodes, const LilvNode* value) +{ + LILV_FOREACH (nodes, i, nodes) { + if (lilv_node_equals(lilv_nodes_get(nodes, i), value)) { + return true; + } + } + + return false; +} + +LilvNodes* +lilv_nodes_merge(const LilvNodes* a, const LilvNodes* b) +{ + LilvNodes* result = lilv_nodes_new(); + + LILV_FOREACH (nodes, i, a) { + zix_tree_insert( + (ZixTree*)result, lilv_node_duplicate(lilv_nodes_get(a, i)), NULL); + } + + LILV_FOREACH (nodes, i, b) { + zix_tree_insert( + (ZixTree*)result, lilv_node_duplicate(lilv_nodes_get(b, i)), NULL); + } + + return result; +} + +/* Iterator */ + +#define LILV_COLLECTION_IMPL(prefix, CT, ET) \ + \ + unsigned prefix##_size(const CT* collection) \ + { \ + return lilv_collection_size(collection); \ + } \ + \ + LilvIter* prefix##_begin(const CT* collection) \ + { \ + return lilv_collection_begin(collection); \ + } \ + \ + const ET* prefix##_get(const CT* collection, LilvIter* i) \ + { \ + return (ET*)lilv_collection_get(collection, i); \ + } \ + \ + LilvIter* prefix##_next(const CT* collection, LilvIter* i) \ + { \ + (void)collection; \ + return zix_tree_iter_next((ZixTreeIter*)i); \ + } \ + \ + bool prefix##_is_end(const CT* collection, LilvIter* i) \ + { \ + (void)collection; \ + return zix_tree_iter_is_end((ZixTreeIter*)i); \ + } + +LILV_COLLECTION_IMPL(lilv_plugin_classes, LilvPluginClasses, LilvPluginClass) +LILV_COLLECTION_IMPL(lilv_scale_points, LilvScalePoints, LilvScalePoint) +LILV_COLLECTION_IMPL(lilv_uis, LilvUIs, LilvUI) +LILV_COLLECTION_IMPL(lilv_nodes, LilvNodes, LilvNode) +LILV_COLLECTION_IMPL(lilv_plugins, LilvPlugins, LilvPlugin) + +void +lilv_plugin_classes_free(LilvPluginClasses* collection) +{ + lilv_collection_free(collection); +} + +void +lilv_scale_points_free(LilvScalePoints* collection) +{ + lilv_collection_free(collection); +} + +void +lilv_uis_free(LilvUIs* collection) +{ + lilv_collection_free(collection); +} + +void +lilv_nodes_free(LilvNodes* collection) +{ + lilv_collection_free(collection); +} + +LilvNode* +lilv_nodes_get_first(const LilvNodes* collection) +{ + return (LilvNode*)lilv_collection_get(collection, + lilv_collection_begin(collection)); +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,564 @@ +/* + Copyright 2007-2021 David Robillard + + 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. +*/ + +#define _POSIX_C_SOURCE 200809L /* for fileno */ +#define _BSD_SOURCE 1 /* for realpath, symlink */ +#define _DEFAULT_SOURCE 1 /* for realpath, symlink */ + +#ifdef __APPLE__ +# define _DARWIN_C_SOURCE 1 /* for flock */ +#endif + +#include "filesystem.h" +#include "lilv_config.h" +#include "lilv_internal.h" + +#ifdef _WIN32 +# include +# include +# include +# define F_OK 0 +# define mkdir(path, flags) _mkdir(path) +# define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR) +#else +# include +# include +#endif + +#if USE_FLOCK && USE_FILENO +# include +#endif + +#include + +#include +#include +#include +#include +#include + +#ifndef PAGE_SIZE +# define PAGE_SIZE 4096 +#endif + +static bool +lilv_is_dir_sep(const char c) +{ + return c == '/' || c == LILV_DIR_SEP[0]; +} + +#ifdef _WIN32 +static inline bool +is_windows_path(const char* path) +{ + return (isalpha(path[0]) && (path[1] == ':' || path[1] == '|') && + (path[2] == '/' || path[2] == '\\')); +} +#endif + +char* +lilv_temp_directory_path(void) +{ +#ifdef _WIN32 + DWORD len = GetTempPath(0, NULL); + char* buf = (char*)calloc(len, 1); + if (GetTempPath(len, buf) == 0) { + free(buf); + return NULL; + } + + return buf; +#else + const char* const tmpdir = getenv("TMPDIR"); + + return tmpdir ? lilv_strdup(tmpdir) : lilv_strdup("/tmp"); +#endif +} + +bool +lilv_path_is_absolute(const char* path) +{ + if (lilv_is_dir_sep(path[0])) { + return true; + } + +#ifdef _WIN32 + if (is_windows_path(path)) { + return true; + } +#endif + + return false; +} + +bool +lilv_path_is_child(const char* path, const char* dir) +{ + if (path && dir) { + const size_t path_len = strlen(path); + const size_t dir_len = strlen(dir); + return dir && path_len >= dir_len && !strncmp(path, dir, dir_len); + } + return false; +} + +char* +lilv_path_current(void) +{ + return getcwd(NULL, 0); +} + +char* +lilv_path_absolute(const char* path) +{ + if (lilv_path_is_absolute(path)) { + return lilv_strdup(path); + } + + char* cwd = getcwd(NULL, 0); + char* abs_path = lilv_path_join(cwd, path); + free(cwd); + return abs_path; +} + +char* +lilv_path_absolute_child(const char* path, const char* parent) +{ + if (lilv_path_is_absolute(path)) { + return lilv_strdup(path); + } + + return lilv_path_join(parent, path); +} + +char* +lilv_path_relative_to(const char* path, const char* base) +{ + const size_t path_len = strlen(path); + const size_t base_len = strlen(base); + const size_t min_len = (path_len < base_len) ? path_len : base_len; + + // Find the last separator common to both paths + size_t last_shared_sep = 0; + for (size_t i = 0; i < min_len && path[i] == base[i]; ++i) { + if (lilv_is_dir_sep(path[i])) { + last_shared_sep = i; + } + } + + if (last_shared_sep == 0) { + // No common components, return path + return lilv_strdup(path); + } + + // Find the number of up references ("..") required + size_t up = 0; + for (size_t i = last_shared_sep + 1; i < base_len; ++i) { + if (lilv_is_dir_sep(base[i])) { + ++up; + } + } + +#ifdef _WIN32 + const bool use_slash = strchr(path, '/'); +#else + static const bool use_slash = true; +#endif + + // Write up references + const size_t suffix_len = path_len - last_shared_sep; + char* rel = (char*)calloc(1, suffix_len + (up * 3) + 1); + for (size_t i = 0; i < up; ++i) { + if (use_slash) { + memcpy(rel + (i * 3), "../", 3); + } else { + memcpy(rel + (i * 3), "..\\", 3); + } + } + + // Write suffix + memcpy(rel + (up * 3), path + last_shared_sep + 1, suffix_len); + return rel; +} + +char* +lilv_path_parent(const char* path) +{ + const char* s = path + strlen(path) - 1; // Last character + + // Last non-slash + for (; s > path && lilv_is_dir_sep(*s); --s) { + } + + // Last internal slash + for (; s > path && !lilv_is_dir_sep(*s); --s) { + } + + // Skip duplicates + for (; s > path && lilv_is_dir_sep(*s); --s) { + } + + if (s == path) { // Hit beginning + return lilv_is_dir_sep(*s) ? lilv_strdup("/") : lilv_strdup("."); + } + + // Pointing to the last character of the result (inclusive) + char* dirname = (char*)malloc(s - path + 2); + memcpy(dirname, path, s - path + 1); + dirname[s - path + 1] = '\0'; + return dirname; +} + +char* +lilv_path_filename(const char* path) +{ + const size_t path_len = strlen(path); + size_t last_sep = path_len; + for (size_t i = 0; i < path_len; ++i) { + if (lilv_is_dir_sep(path[i])) { + last_sep = i; + } + } + + if (last_sep >= path_len) { + return lilv_strdup(path); + } + + const size_t ret_len = path_len - last_sep; + char* const ret = (char*)calloc(ret_len + 1, 1); + + strncpy(ret, path + last_sep + 1, ret_len); + return ret; +} + +char* +lilv_path_join(const char* a, const char* b) +{ + if (!a) { + return (b && b[0]) ? lilv_strdup(b) : NULL; + } + + const size_t a_len = strlen(a); + const size_t b_len = b ? strlen(b) : 0; + const bool a_end_is_sep = a_len > 0 && lilv_is_dir_sep(a[a_len - 1]); + const size_t pre_len = a_len - (a_end_is_sep ? 1 : 0); + char* path = (char*)calloc(1, a_len + b_len + 2); + memcpy(path, a, pre_len); + +#ifdef _WIN32 + // Use forward slash if it seems that the input paths do + const bool a_has_slash = strchr(a, '/'); + const bool b_has_slash = b && strchr(b, '/'); + if (a_has_slash || b_has_slash) { + path[pre_len] = '/'; + } else { + path[pre_len] = '\\'; + } +#else + path[pre_len] = '/'; +#endif + + if (b) { + memcpy(path + pre_len + 1, + b + (lilv_is_dir_sep(b[0]) ? 1 : 0), + lilv_is_dir_sep(b[0]) ? b_len - 1 : b_len); + } + return path; +} + +char* +lilv_path_canonical(const char* path) +{ + if (!path) { + return NULL; + } + +#if defined(_WIN32) + char* out = (char*)malloc(MAX_PATH); + GetFullPathName(path, MAX_PATH, out, NULL); + return out; +#else + char* real_path = realpath(path, NULL); + return real_path ? real_path : lilv_strdup(path); +#endif +} + +bool +lilv_path_exists(const char* path) +{ +#if USE_LSTAT + struct stat st; + return !lstat(path, &st); +#else + return !access(path, F_OK); +#endif +} + +bool +lilv_is_directory(const char* path) +{ + struct stat st; + return !stat(path, &st) && S_ISDIR(st.st_mode); +} + +int +lilv_copy_file(const char* src, const char* dst) +{ + FILE* in = fopen(src, "r"); + if (!in) { + return errno; + } + + FILE* out = fopen(dst, "w"); + if (!out) { + fclose(in); + return errno; + } + + char* page = (char*)malloc(PAGE_SIZE); + size_t n_read = 0; + int st = 0; + while ((n_read = fread(page, 1, PAGE_SIZE, in)) > 0) { + if (fwrite(page, 1, n_read, out) != n_read) { + st = errno; + break; + } + } + + if (!st && fflush(out)) { + st = errno; + } + + if (!st && (ferror(in) || ferror(out))) { + st = EBADF; + } + + free(page); + fclose(in); + fclose(out); + + return st; +} + +int +lilv_symlink(const char* oldpath, const char* newpath) +{ + int ret = 0; + if (strcmp(oldpath, newpath)) { +#ifdef _WIN32 + ret = !CreateHardLink(newpath, oldpath, 0); +#else + char* target = lilv_path_relative_to(oldpath, newpath); + + ret = symlink(target, newpath); + + free(target); +#endif + } + return ret; +} + +int +lilv_flock(FILE* file, bool lock, bool block) +{ +#ifdef _WIN32 + HANDLE handle = (HANDLE)_get_osfhandle(fileno(file)); + OVERLAPPED overlapped = {0}; + + if (lock) { + const DWORD flags = + (LOCKFILE_EXCLUSIVE_LOCK | (block ? 0 : LOCKFILE_FAIL_IMMEDIATELY)); + + return !LockFileEx(handle, flags, 0, UINT32_MAX, UINT32_MAX, &overlapped); + } else { + return !UnlockFileEx(handle, 0, UINT32_MAX, UINT32_MAX, &overlapped); + } +#elif USE_FLOCK && USE_FILENO + return flock(fileno(file), + (lock ? LOCK_EX : LOCK_UN) | (block ? 0 : LOCK_NB)); +#else + return 0; +#endif +} + +void +lilv_dir_for_each(const char* path, + void* data, + void (*f)(const char* path, const char* name, void* data)) +{ +#ifdef _WIN32 + char* pat = lilv_path_join(path, "*"); + WIN32_FIND_DATA fd; + HANDLE fh = FindFirstFile(pat, &fd); + if (fh != INVALID_HANDLE_VALUE) { + do { + if (strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..")) { + f(path, fd.cFileName, data); + } + } while (FindNextFile(fh, &fd)); + } + FindClose(fh); + free(pat); +#else + DIR* dir = opendir(path); + if (dir) { + for (struct dirent* entry = NULL; (entry = readdir(dir));) { + if (strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) { + f(path, entry->d_name, data); + } + } + closedir(dir); + } +#endif +} + +char* +lilv_create_temporary_directory_in(const char* pattern, const char* parent) +{ +#ifdef _WIN32 + static const char chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + static const int n_chars = sizeof(chars) - 1; + + const size_t pattern_len = strlen(pattern); + if (pattern_len < 7 || strcmp(pattern + pattern_len - 6, "XXXXXX")) { + errno = EINVAL; + return NULL; + } + + char* const path_pattern = lilv_path_join(parent, pattern); + const size_t path_pattern_len = strlen(path_pattern); + char* const suffix = path_pattern + path_pattern_len - 6; + + for (unsigned attempt = 0; attempt < 128; ++attempt) { + for (unsigned i = 0; i < 6; ++i) { + suffix[i] = chars[rand() % n_chars]; + } + + if (!mkdir(path_pattern, 0700)) { + return path_pattern; + } + } + + return NULL; +#else + char* const path_pattern = lilv_path_join(parent, pattern); + + return mkdtemp(path_pattern); // NOLINT (not a leak) +#endif +} + +char* +lilv_create_temporary_directory(const char* pattern) +{ + char* const tmpdir = lilv_temp_directory_path(); + char* const result = lilv_create_temporary_directory_in(pattern, tmpdir); + + free(tmpdir); + + return result; +} + +int +lilv_create_directories(const char* dir_path) +{ + char* path = lilv_strdup(dir_path); + const size_t path_len = strlen(path); + size_t i = 1; + +#ifdef _WIN32 + if (is_windows_path(dir_path)) { + i = 3; + } +#endif + + for (; i <= path_len; ++i) { + const char c = path[i]; + if (c == LILV_DIR_SEP[0] || c == '/' || c == '\0') { + path[i] = '\0'; + if (mkdir(path, 0755) && (errno != EEXIST || !lilv_is_directory(path))) { + free(path); + return errno; + } + path[i] = c; + } + } + + free(path); + return 0; +} + +static off_t +lilv_file_size(const char* path) +{ + struct stat buf; + if (stat(path, &buf)) { + return 0; + } + return buf.st_size; +} + +int +lilv_remove(const char* path) +{ +#ifdef _WIN32 + if (lilv_is_directory(path)) { + return !RemoveDirectory(path); + } +#endif + + return remove(path); +} + +bool +lilv_file_equals(const char* a_path, const char* b_path) +{ + if (!strcmp(a_path, b_path)) { + return true; // Paths match + } + + bool match = false; + FILE* a_file = NULL; + FILE* b_file = NULL; + char* const a_real = lilv_path_canonical(a_path); + char* const b_real = lilv_path_canonical(b_path); + if (!strcmp(a_real, b_real)) { + match = true; // Real paths match + } else if (lilv_file_size(a_path) != lilv_file_size(b_path)) { + match = false; // Sizes differ + } else if (!(a_file = fopen(a_real, "rb")) || + !(b_file = fopen(b_real, "rb"))) { + match = false; // Missing file matches nothing + } else { + // TODO: Improve performance by reading chunks + match = true; + while (!feof(a_file) && !feof(b_file)) { + if (fgetc(a_file) != fgetc(b_file)) { + match = false; + break; + } + } + } + + if (a_file) { + fclose(a_file); + } + if (b_file) { + fclose(b_file); + } + free(a_real); + free(b_real); + return match; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,182 @@ +/* + Copyright 2007-2020 David Robillard + + 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. +*/ + +#include +#include + +/// Return the path to a directory suitable for making temporary files +char* +lilv_temp_directory_path(void); + +/// Return true iff `path` is an absolute path +bool +lilv_path_is_absolute(const char* path); + +/// Return true iff `path` is a child of `dir` +bool +lilv_path_is_child(const char* path, const char* dir); + +/// Return the current working directory +char* +lilv_path_current(void); + +/** + Return `path` as an absolute path. + + If `path` is absolute, an identical copy of it is returned. Otherwise, the + returned path is relative to the current working directory. +*/ +char* +lilv_path_absolute(const char* path); + +/** + Return `path` as an absolute path relative to `parent`. + + If `path` is absolute, an identical copy of it is returned. Otherwise, the + returned path is relative to `parent`. +*/ +char* +lilv_path_absolute_child(const char* path, const char* parent); + +/** + Return `path` relative to `base` if possible. + + If `path` is not within `base`, a copy is returned. Otherwise, an + equivalent path relative to `base` is returned (which may contain + up-references). +*/ +char* +lilv_path_relative_to(const char* path, const char* base); + +/** + Return the path to the directory that contains `path`. + + Returns the root path if `path` is the root path. +*/ +char* +lilv_path_parent(const char* path); + +/** + Return the filename component of `path` without any directories. + + Returns the empty string if `path` is the root path. +*/ +char* +lilv_path_filename(const char* path); + +/// Join path `a` and path `b` with a single directory separator between them +char* +lilv_path_join(const char* a, const char* b); + +/** + Return `path` as a canonicalized absolute path. + + This expands all symbolic links, relative references, and removes extra + directory separators. +*/ +char* +lilv_path_canonical(const char* path); + +/// Return true iff `path` points to an existing file system entry +bool +lilv_path_exists(const char* path); + +/// Return true iff `path` points to an existing directory +bool +lilv_is_directory(const char* path); + +/** + Copy the file at path `src` to path `dst`. + + @return Zero on success, or a standard `errno` error code. +*/ +int +lilv_copy_file(const char* src, const char* dst); + +/** + Create a symlink at `newpath` that points to `oldpath`. + + @return Zero on success, otherwise non-zero and `errno` is set. +*/ +int +lilv_symlink(const char* oldpath, const char* newpath); + +/** + Set or remove an advisory exclusive lock on `file`. + + If the `lock` is true and the file is already locked by another process, or + by this process via a different file handle, then this will not succeed and + non-zero will be returned. + + @param file Handle for open file to lock. + @param lock True to set lock, false to release lock. + @param block If true, then this call will block until the lock is acquired. + @return Zero on success. +*/ +int +lilv_flock(FILE* file, bool lock, bool block); + +/** + Visit every file in the directory at `path`. + + @param path A path to a directory. + + @param data Opaque user data that is passed to `f`. + + @param f A function called on every entry in the directory. The `path` + parameter is always the directory path passed to this function, the `name` + parameter is the name of the directory entry (not its full path). +*/ +void +lilv_dir_for_each(const char* path, + void* data, + void (*f)(const char* path, const char* name, void* data)); + +/** + Create a unique temporary directory in a specific directory. + + The last six characters of `pattern` must be `XXXXXX` and will be replaced + with random characters. This works roughly like mkdtemp, except the pattern + should only be a directory name, not a full path. The created path will be + a child of the given parent directory. +*/ +char* +lilv_create_temporary_directory_in(const char* pattern, const char* parent); + +/** + Create a unique temporary directory. + + This is like lilv_create_temporary_directory_in(), except it creates the + directory in the system temporary directory. +*/ +char* +lilv_create_temporary_directory(const char* pattern); + +/** + Create the directory `dir_path` and any parent directories if necessary. + + @return Zero on success, or an `errno` error code. +*/ +int +lilv_create_directories(const char* dir_path); + +/// Remove the file or empty directory at `path` +int +lilv_remove(const char* path); + +/// Return true iff the given paths point to files with identical contents +bool +lilv_file_equals(const char* a_path, const char* b_path); diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,115 @@ +/* + Copyright 2007-2019 David Robillard + + 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. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "lv2/core/lv2.h" +#include "serd/serd.h" + +#include +#include +#include +#include +#include + +LilvInstance* +lilv_plugin_instantiate(const LilvPlugin* plugin, + double sample_rate, + const LV2_Feature* const* features) +{ + lilv_plugin_load_if_necessary(plugin); + if (plugin->parse_errors) { + return NULL; + } + + LilvInstance* result = NULL; + const LilvNode* const lib_uri = lilv_plugin_get_library_uri(plugin); + const LilvNode* const bundle_uri = lilv_plugin_get_bundle_uri(plugin); + if (!lib_uri || !bundle_uri) { + return NULL; + } + + char* const bundle_path = + lilv_file_uri_parse(lilv_node_as_uri(bundle_uri), NULL); + + LilvLib* lib = lilv_lib_open(plugin->world, lib_uri, bundle_path, features); + if (!lib) { + serd_free(bundle_path); + return NULL; + } + + const LV2_Feature** local_features = NULL; + if (features == NULL) { + local_features = (const LV2_Feature**)malloc(sizeof(LV2_Feature*)); + local_features[0] = NULL; + } + + // Search for plugin by URI + for (uint32_t i = 0; true; ++i) { + const LV2_Descriptor* ld = lilv_lib_get_plugin(lib, i); + if (!ld) { + LILV_ERRORF("No plugin <%s> in <%s>\n", + lilv_node_as_uri(lilv_plugin_get_uri(plugin)), + lilv_node_as_uri(lib_uri)); + lilv_lib_close(lib); + break; // return NULL + } + + if (!strcmp(ld->URI, lilv_node_as_uri(lilv_plugin_get_uri(plugin)))) { + // Create LilvInstance to return + result = (LilvInstance*)malloc(sizeof(LilvInstance)); + result->lv2_descriptor = ld; + result->lv2_handle = ld->instantiate( + ld, sample_rate, bundle_path, (features) ? features : local_features); + result->pimpl = lib; + break; + } + } + + free(local_features); + serd_free(bundle_path); + + if (result) { + if (result->lv2_handle == NULL) { + // Failed to instantiate + free(result); + lilv_lib_close(lib); + return NULL; + } + + // "Connect" all ports to NULL (catches bugs) + for (uint32_t i = 0; i < lilv_plugin_get_num_ports(plugin); ++i) { + result->lv2_descriptor->connect_port(result->lv2_handle, i, NULL); + } + } + + return result; +} + +void +lilv_instance_free(LilvInstance* instance) +{ + if (!instance) { + return; + } + + instance->lv2_descriptor->cleanup(instance->lv2_handle); + instance->lv2_descriptor = NULL; + lilv_lib_close((LilvLib*)instance->pimpl); + instance->pimpl = NULL; + free(instance); +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,127 @@ +/* + Copyright 2012-2019 David Robillard + + 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. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "lv2/core/lv2.h" +#include "serd/serd.h" +#include "zix/tree.h" + +#ifndef _WIN32 +# include +#endif + +#include +#include + +LilvLib* +lilv_lib_open(LilvWorld* world, + const LilvNode* uri, + const char* bundle_path, + const LV2_Feature* const* features) +{ + ZixTreeIter* i = NULL; + const LilvLib key = { + world, (LilvNode*)uri, (char*)bundle_path, NULL, NULL, NULL, 0}; + if (!zix_tree_find(world->libs, &key, &i)) { + LilvLib* llib = (LilvLib*)zix_tree_get(i); + ++llib->refs; + return llib; + } + + const char* const lib_uri = lilv_node_as_uri(uri); + char* const lib_path = + (char*)serd_file_uri_parse((const uint8_t*)lib_uri, NULL); + if (!lib_path) { + return NULL; + } + + dlerror(); + void* lib = dlopen(lib_path, RTLD_NOW); + if (!lib) { + LILV_ERRORF("Failed to open library %s (%s)\n", lib_path, dlerror()); + serd_free(lib_path); + return NULL; + } + + LV2_Descriptor_Function df = + (LV2_Descriptor_Function)lilv_dlfunc(lib, "lv2_descriptor"); + + LV2_Lib_Descriptor_Function ldf = + (LV2_Lib_Descriptor_Function)lilv_dlfunc(lib, "lv2_lib_descriptor"); + + const LV2_Lib_Descriptor* desc = NULL; + if (ldf) { + desc = ldf(bundle_path, features); + if (!desc) { + LILV_ERRORF("Call to %s:lv2_lib_descriptor failed\n", lib_path); + dlclose(lib); + serd_free(lib_path); + return NULL; + } + } else if (!df) { + LILV_ERRORF("No `lv2_descriptor' or `lv2_lib_descriptor' in %s\n", + lib_path); + dlclose(lib); + serd_free(lib_path); + return NULL; + } + serd_free(lib_path); + + LilvLib* llib = (LilvLib*)malloc(sizeof(LilvLib)); + llib->world = world; + llib->uri = lilv_node_duplicate(uri); + llib->bundle_path = lilv_strdup(bundle_path); + llib->lib = lib; + llib->lv2_descriptor = df; + llib->desc = desc; + llib->refs = 1; + + zix_tree_insert(world->libs, llib, NULL); + return llib; +} + +const LV2_Descriptor* +lilv_lib_get_plugin(LilvLib* lib, uint32_t index) +{ + if (lib->lv2_descriptor) { + return lib->lv2_descriptor(index); + } + + if (lib->desc) { + return lib->desc->get_plugin(lib->desc->handle, index); + } + + return NULL; +} + +void +lilv_lib_close(LilvLib* lib) +{ + if (--lib->refs == 0) { + dlclose(lib->lib); + + ZixTreeIter* i = NULL; + if (lib->world->libs && !zix_tree_find(lib->world->libs, lib, &i)) { + zix_tree_remove(lib->world->libs, i); + } + + lilv_node_free(lib->uri); + free(lib->bundle_path); + free(lib); + } +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,477 @@ +/* + Copyright 2007-2019 David Robillard + + 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. +*/ + +#ifndef LILV_INTERNAL_H +#define LILV_INTERNAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lilv_config.h" // IWYU pragma: keep + +#include "lilv/lilv.h" +#include "lv2/core/lv2.h" +#include "serd/serd.h" +#include "sord/sord.h" +#include "zix/tree.h" + +#include +#include +#include + +#ifdef _WIN32 +# include +# include +# include +# define dlopen(path, flags) LoadLibrary(path) +# define dlclose(lib) FreeLibrary((HMODULE)lib) +# ifdef _MSC_VER +# define __func__ __FUNCTION__ +# ifndef snprintf +# define snprintf _snprintf +# endif +# endif +# ifndef INFINITY +# define INFINITY DBL_MAX + DBL_MAX +# endif +# ifndef NAN +# define NAN INFINITY - INFINITY +# endif +static inline const char* +dlerror(void) +{ + return "Unknown error"; +} +#else +# include +#endif + +#ifdef LILV_DYN_MANIFEST +# include "lv2/dynmanifest/dynmanifest.h" +#endif + +/* + * + * Types + * + */ + +typedef void LilvCollection; + +struct LilvPortImpl { + LilvNode* node; ///< RDF node + uint32_t index; ///< lv2:index + LilvNode* symbol; ///< lv2:symbol + LilvNodes* classes; ///< rdf:type +}; + +typedef struct LilvSpecImpl { + SordNode* spec; + SordNode* bundle; + LilvNodes* data_uris; + struct LilvSpecImpl* next; +} LilvSpec; + +/** + Header of an LilvPlugin, LilvPluginClass, or LilvUI. + Any of these structs may be safely casted to LilvHeader, which is used to + implement collections using the same comparator. +*/ +struct LilvHeader { + LilvWorld* world; + LilvNode* uri; +}; + +#ifdef LILV_DYN_MANIFEST +typedef struct { + LilvNode* bundle; + void* lib; + LV2_Dyn_Manifest_Handle handle; + uint32_t refs; +} LilvDynManifest; +#endif + +typedef struct { + LilvWorld* world; + LilvNode* uri; + char* bundle_path; + void* lib; + LV2_Descriptor_Function lv2_descriptor; + const LV2_Lib_Descriptor* desc; + uint32_t refs; +} LilvLib; + +struct LilvPluginImpl { + LilvWorld* world; + LilvNode* plugin_uri; + LilvNode* bundle_uri; ///< Bundle plugin was loaded from + LilvNode* binary_uri; ///< lv2:binary +#ifdef LILV_DYN_MANIFEST + LilvDynManifest* dynmanifest; +#endif + const LilvPluginClass* plugin_class; + LilvNodes* data_uris; ///< rdfs::seeAlso + LilvPort** ports; + uint32_t num_ports; + bool loaded; + bool parse_errors; + bool replaced; +}; + +struct LilvPluginClassImpl { + LilvWorld* world; + LilvNode* uri; + LilvNode* parent_uri; + LilvNode* label; +}; + +struct LilvInstancePimpl { + LilvWorld* world; + LilvLib* lib; +}; + +typedef struct { + bool dyn_manifest; + bool filter_language; + char* lv2_path; +} LilvOptions; + +struct LilvWorldImpl { + SordWorld* world; + SordModel* model; + SerdReader* reader; + unsigned n_read_files; + LilvPluginClass* lv2_plugin_class; + LilvPluginClasses* plugin_classes; + LilvSpec* specs; + LilvPlugins* plugins; + LilvPlugins* zombies; + LilvNodes* loaded_files; + ZixTree* libs; + struct { + SordNode* dc_replaces; + SordNode* dman_DynManifest; + SordNode* doap_name; + SordNode* lv2_Plugin; + SordNode* lv2_Specification; + SordNode* lv2_appliesTo; + SordNode* lv2_binary; + SordNode* lv2_default; + SordNode* lv2_designation; + SordNode* lv2_extensionData; + SordNode* lv2_index; + SordNode* lv2_latency; + SordNode* lv2_maximum; + SordNode* lv2_microVersion; + SordNode* lv2_minimum; + SordNode* lv2_minorVersion; + SordNode* lv2_name; + SordNode* lv2_optionalFeature; + SordNode* lv2_port; + SordNode* lv2_portProperty; + SordNode* lv2_reportsLatency; + SordNode* lv2_requiredFeature; + SordNode* lv2_symbol; + SordNode* lv2_prototype; + SordNode* owl_Ontology; + SordNode* pset_value; + SordNode* rdf_a; + SordNode* rdf_value; + SordNode* rdfs_Class; + SordNode* rdfs_label; + SordNode* rdfs_seeAlso; + SordNode* rdfs_subClassOf; + SordNode* xsd_base64Binary; + SordNode* xsd_boolean; + SordNode* xsd_decimal; + SordNode* xsd_double; + SordNode* xsd_integer; + SordNode* null_uri; + } uris; + LilvOptions opt; +}; + +typedef enum { + LILV_VALUE_URI, + LILV_VALUE_STRING, + LILV_VALUE_INT, + LILV_VALUE_FLOAT, + LILV_VALUE_BOOL, + LILV_VALUE_BLANK, + LILV_VALUE_BLOB +} LilvNodeType; + +struct LilvNodeImpl { + LilvWorld* world; + SordNode* node; + LilvNodeType type; + union { + int int_val; + float float_val; + bool bool_val; + } val; +}; + +struct LilvScalePointImpl { + LilvNode* value; + LilvNode* label; +}; + +struct LilvUIImpl { + LilvWorld* world; + LilvNode* uri; + LilvNode* bundle_uri; + LilvNode* binary_uri; + LilvNodes* classes; +}; + +typedef struct LilvVersion { + int minor; + int micro; +} LilvVersion; + +/* + * + * Functions + * + */ + +LilvPort* +lilv_port_new(LilvWorld* world, + const SordNode* node, + uint32_t index, + const char* symbol); +void +lilv_port_free(const LilvPlugin* plugin, LilvPort* port); + +LilvPlugin* +lilv_plugin_new(LilvWorld* world, LilvNode* uri, LilvNode* bundle_uri); + +void +lilv_plugin_clear(LilvPlugin* plugin, LilvNode* bundle_uri); + +void +lilv_plugin_load_if_necessary(const LilvPlugin* plugin); + +void +lilv_plugin_free(LilvPlugin* plugin); + +LilvNode* +lilv_plugin_get_unique(const LilvPlugin* plugin, + const SordNode* subject, + const SordNode* predicate); + +void +lilv_collection_free(LilvCollection* collection); + +unsigned +lilv_collection_size(const LilvCollection* collection); + +LilvIter* +lilv_collection_begin(const LilvCollection* collection); + +void* +lilv_collection_get(const LilvCollection* collection, const LilvIter* i); + +LilvPluginClass* +lilv_plugin_class_new(LilvWorld* world, + const SordNode* parent_node, + const SordNode* uri, + const char* label); + +void +lilv_plugin_class_free(LilvPluginClass* plugin_class); + +LilvLib* +lilv_lib_open(LilvWorld* world, + const LilvNode* uri, + const char* bundle_path, + const LV2_Feature* const* features); + +const LV2_Descriptor* +lilv_lib_get_plugin(LilvLib* lib, uint32_t index); + +void +lilv_lib_close(LilvLib* lib); + +LilvNodes* +lilv_nodes_new(void); + +LilvPlugins* +lilv_plugins_new(void); + +LilvScalePoints* +lilv_scale_points_new(void); + +LilvPluginClasses* +lilv_plugin_classes_new(void); + +LilvUIs* +lilv_uis_new(void); + +LilvNode* +lilv_world_get_manifest_uri(LilvWorld* world, const LilvNode* bundle_uri); + +const uint8_t* +lilv_world_blank_node_prefix(LilvWorld* world); + +SerdStatus +lilv_world_load_file(LilvWorld* world, SerdReader* reader, const LilvNode* uri); + +SerdStatus +lilv_world_load_graph(LilvWorld* world, SordNode* graph, const LilvNode* uri); + +LilvUI* +lilv_ui_new(LilvWorld* world, + LilvNode* uri, + LilvNode* type_uri, + LilvNode* binary_uri); + +void +lilv_ui_free(LilvUI* ui); + +LilvNode* +lilv_node_new(LilvWorld* world, LilvNodeType type, const char* str); + +LilvNode* +lilv_node_new_from_node(LilvWorld* world, const SordNode* node); + +int +lilv_header_compare_by_uri(const void* a, const void* b, const void* user_data); + +int +lilv_lib_compare(const void* a, const void* b, const void* user_data); + +int +lilv_ptr_cmp(const void* a, const void* b, const void* user_data); + +int +lilv_resource_node_cmp(const void* a, const void* b, const void* user_data); + +static inline int +lilv_version_cmp(const LilvVersion* a, const LilvVersion* b) +{ + if (a->minor == b->minor && a->micro == b->micro) { + return 0; + } + + if ((a->minor < b->minor) || (a->minor == b->minor && a->micro < b->micro)) { + return -1; + } + + return 1; +} + +struct LilvHeader* +lilv_collection_get_by_uri(const ZixTree* seq, const LilvNode* uri); + +LilvScalePoint* +lilv_scale_point_new(LilvNode* value, LilvNode* label); + +void +lilv_scale_point_free(LilvScalePoint* point); + +SordIter* +lilv_world_query_internal(LilvWorld* world, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object); + +bool +lilv_world_ask_internal(LilvWorld* world, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object); + +LilvNodes* +lilv_world_find_nodes_internal(LilvWorld* world, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object); + +SordModel* +lilv_world_filter_model(LilvWorld* world, + SordModel* model, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object, + const SordNode* graph); + +#define FOREACH_MATCH(iter) for (; !sord_iter_end(iter); sord_iter_next(iter)) + +LilvNodes* +lilv_nodes_from_stream_objects(LilvWorld* world, + SordIter* stream, + SordQuadIndex field); + +char* +lilv_strjoin(const char* first, ...); + +char* +lilv_strdup(const char* str); + +char* +lilv_get_lang(void); + +char* +lilv_expand(const char* path); + +char* +lilv_get_latest_copy(const char* path, const char* copy_path); + +char* +lilv_find_free_path(const char* in_path, + bool (*exists)(const char*, const void*), + const void* user_data); + +typedef void (*LilvVoidFunc)(void); + +/** dlsym wrapper to return a function pointer (without annoying warning) */ +static inline LilvVoidFunc +lilv_dlfunc(void* handle, const char* symbol) +{ +#ifdef _WIN32 + return (LilvVoidFunc)GetProcAddress((HMODULE)handle, symbol); +#else + typedef LilvVoidFunc (*VoidFuncGetter)(void*, const char*); + VoidFuncGetter dlfunc = (VoidFuncGetter)dlsym; + return dlfunc(handle, symbol); +#endif +} + +#ifdef LILV_DYN_MANIFEST +static const LV2_Feature* const dman_features = {NULL}; + +void +lilv_dynmanifest_free(LilvDynManifest* dynmanifest); +#endif + +#define LILV_ERROR(str) fprintf(stderr, "%s(): error: " str, __func__) +#define LILV_ERRORF(fmt, ...) \ + fprintf(stderr, "%s(): error: " fmt, __func__, __VA_ARGS__) +#define LILV_WARN(str) fprintf(stderr, "%s(): warning: " str, __func__) +#define LILV_WARNF(fmt, ...) \ + fprintf(stderr, "%s(): warning: " fmt, __func__, __VA_ARGS__) +#define LILV_NOTE(str) fprintf(stderr, "%s(): note: " str, __func__) +#define LILV_NOTEF(fmt, ...) \ + fprintf(stderr, "%s(): note: " fmt, __func__, __VA_ARGS__) + +#ifdef __cplusplus +} +#endif + +#endif /* LILV_INTERNAL_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,413 @@ +/* + Copyright 2007-2019 David Robillard + + 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. +*/ + +#include "filesystem.h" +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "serd/serd.h" +#include "sord/sord.h" + +#include +#include +#include +#include +#include +#include + +static void +lilv_node_set_numerics_from_string(LilvNode* val) +{ + const char* str = (const char*)sord_node_get_string(val->node); + + switch (val->type) { + case LILV_VALUE_URI: + case LILV_VALUE_BLANK: + case LILV_VALUE_STRING: + case LILV_VALUE_BLOB: + break; + case LILV_VALUE_INT: + val->val.int_val = strtol(str, NULL, 10); + break; + case LILV_VALUE_FLOAT: + val->val.float_val = serd_strtod(str, NULL); + break; + case LILV_VALUE_BOOL: + val->val.bool_val = !strcmp(str, "true"); + break; + } +} + +/** Note that if `type` is numeric or boolean, the returned value is corrupt + * until lilv_node_set_numerics_from_string is called. It is not + * automatically called from here to avoid overhead and imprecision when the + * exact string value is known. + */ +LilvNode* +lilv_node_new(LilvWorld* world, LilvNodeType type, const char* str) +{ + LilvNode* val = (LilvNode*)malloc(sizeof(LilvNode)); + val->world = world; + val->type = type; + + const uint8_t* ustr = (const uint8_t*)str; + switch (type) { + case LILV_VALUE_URI: + val->node = sord_new_uri(world->world, ustr); + break; + case LILV_VALUE_BLANK: + val->node = sord_new_blank(world->world, ustr); + break; + case LILV_VALUE_STRING: + val->node = sord_new_literal(world->world, NULL, ustr, NULL); + break; + case LILV_VALUE_INT: + val->node = + sord_new_literal(world->world, world->uris.xsd_integer, ustr, NULL); + break; + case LILV_VALUE_FLOAT: + val->node = + sord_new_literal(world->world, world->uris.xsd_decimal, ustr, NULL); + break; + case LILV_VALUE_BOOL: + val->node = + sord_new_literal(world->world, world->uris.xsd_boolean, ustr, NULL); + break; + case LILV_VALUE_BLOB: + val->node = + sord_new_literal(world->world, world->uris.xsd_base64Binary, ustr, NULL); + break; + } + + if (!val->node) { + free(val); + return NULL; + } + + return val; +} + +/** Create a new LilvNode from `node`, or return NULL if impossible */ +LilvNode* +lilv_node_new_from_node(LilvWorld* world, const SordNode* node) +{ + if (!node) { + return NULL; + } + + LilvNode* result = NULL; + SordNode* datatype_uri = NULL; + LilvNodeType type = LILV_VALUE_STRING; + + switch (sord_node_get_type(node)) { + case SORD_URI: + result = (LilvNode*)malloc(sizeof(LilvNode)); + result->world = world; + result->type = LILV_VALUE_URI; + result->node = sord_node_copy(node); + break; + case SORD_BLANK: + result = (LilvNode*)malloc(sizeof(LilvNode)); + result->world = world; + result->type = LILV_VALUE_BLANK; + result->node = sord_node_copy(node); + break; + case SORD_LITERAL: + datatype_uri = sord_node_get_datatype(node); + if (datatype_uri) { + if (sord_node_equals(datatype_uri, world->uris.xsd_boolean)) { + type = LILV_VALUE_BOOL; + } else if (sord_node_equals(datatype_uri, world->uris.xsd_decimal) || + sord_node_equals(datatype_uri, world->uris.xsd_double)) { + type = LILV_VALUE_FLOAT; + } else if (sord_node_equals(datatype_uri, world->uris.xsd_integer)) { + type = LILV_VALUE_INT; + } else if (sord_node_equals(datatype_uri, world->uris.xsd_base64Binary)) { + type = LILV_VALUE_BLOB; + } else { + LILV_ERRORF("Unknown datatype `%s'\n", + sord_node_get_string(datatype_uri)); + } + } + result = + lilv_node_new(world, type, (const char*)sord_node_get_string(node)); + lilv_node_set_numerics_from_string(result); + break; + } + + return result; +} + +LilvNode* +lilv_new_uri(LilvWorld* world, const char* uri) +{ + return lilv_node_new(world, LILV_VALUE_URI, uri); +} + +LilvNode* +lilv_new_file_uri(LilvWorld* world, const char* host, const char* path) +{ + char* abs_path = lilv_path_absolute(path); + SerdNode s = serd_node_new_file_uri( + (const uint8_t*)abs_path, (const uint8_t*)host, NULL, true); + + LilvNode* ret = lilv_node_new(world, LILV_VALUE_URI, (const char*)s.buf); + serd_node_free(&s); + free(abs_path); + return ret; +} + +LilvNode* +lilv_new_string(LilvWorld* world, const char* str) +{ + return lilv_node_new(world, LILV_VALUE_STRING, str); +} + +LilvNode* +lilv_new_int(LilvWorld* world, int val) +{ + char str[32]; + snprintf(str, sizeof(str), "%d", val); + LilvNode* ret = lilv_node_new(world, LILV_VALUE_INT, str); + if (ret) { + ret->val.int_val = val; + } + return ret; +} + +LilvNode* +lilv_new_float(LilvWorld* world, float val) +{ + char str[32]; + snprintf(str, sizeof(str), "%f", val); + LilvNode* ret = lilv_node_new(world, LILV_VALUE_FLOAT, str); + if (ret) { + ret->val.float_val = val; + } + return ret; +} + +LilvNode* +lilv_new_bool(LilvWorld* world, bool val) +{ + LilvNode* ret = lilv_node_new(world, LILV_VALUE_BOOL, val ? "true" : "false"); + if (ret) { + ret->val.bool_val = val; + } + return ret; +} + +LilvNode* +lilv_node_duplicate(const LilvNode* val) +{ + if (!val) { + return NULL; + } + + LilvNode* result = (LilvNode*)malloc(sizeof(LilvNode)); + result->world = val->world; + result->node = sord_node_copy(val->node); + result->val = val->val; + result->type = val->type; + return result; +} + +void +lilv_node_free(LilvNode* val) +{ + if (val) { + sord_node_free(val->world->world, val->node); + free(val); + } +} + +bool +lilv_node_equals(const LilvNode* value, const LilvNode* other) +{ + if (value == NULL && other == NULL) { + return true; + } + + if (value == NULL || other == NULL || value->type != other->type) { + return false; + } + + switch (value->type) { + case LILV_VALUE_URI: + case LILV_VALUE_BLANK: + case LILV_VALUE_STRING: + case LILV_VALUE_BLOB: + return sord_node_equals(value->node, other->node); + case LILV_VALUE_INT: + return (value->val.int_val == other->val.int_val); + case LILV_VALUE_FLOAT: + return (value->val.float_val == other->val.float_val); + case LILV_VALUE_BOOL: + return (value->val.bool_val == other->val.bool_val); + } + + return false; /* shouldn't get here */ +} + +char* +lilv_node_get_turtle_token(const LilvNode* value) +{ + const char* str = (const char*)sord_node_get_string(value->node); + size_t len = 0; + char* result = NULL; + SerdNode node; + + switch (value->type) { + case LILV_VALUE_URI: + len = strlen(str) + 3; + result = (char*)calloc(len, 1); + snprintf(result, len, "<%s>", str); + break; + case LILV_VALUE_BLANK: + len = strlen(str) + 3; + result = (char*)calloc(len, 1); + snprintf(result, len, "_:%s", str); + break; + case LILV_VALUE_STRING: + case LILV_VALUE_BOOL: + case LILV_VALUE_BLOB: + result = lilv_strdup(str); + break; + case LILV_VALUE_INT: + node = serd_node_new_integer(value->val.int_val); + result = lilv_strdup((char*)node.buf); + serd_node_free(&node); + break; + case LILV_VALUE_FLOAT: + node = serd_node_new_decimal(value->val.float_val, 8); + result = lilv_strdup((char*)node.buf); + serd_node_free(&node); + break; + } + + return result; +} + +bool +lilv_node_is_uri(const LilvNode* value) +{ + return (value && value->type == LILV_VALUE_URI); +} + +const char* +lilv_node_as_uri(const LilvNode* value) +{ + return (lilv_node_is_uri(value) + ? (const char*)sord_node_get_string(value->node) + : NULL); +} + +bool +lilv_node_is_blank(const LilvNode* value) +{ + return (value && value->type == LILV_VALUE_BLANK); +} + +const char* +lilv_node_as_blank(const LilvNode* value) +{ + return (lilv_node_is_blank(value) + ? (const char*)sord_node_get_string(value->node) + : NULL); +} + +bool +lilv_node_is_literal(const LilvNode* value) +{ + if (!value) { + return false; + } + + switch (value->type) { + case LILV_VALUE_STRING: + case LILV_VALUE_INT: + case LILV_VALUE_FLOAT: + case LILV_VALUE_BLOB: + return true; + default: + return false; + } +} + +bool +lilv_node_is_string(const LilvNode* value) +{ + return (value && value->type == LILV_VALUE_STRING); +} + +const char* +lilv_node_as_string(const LilvNode* value) +{ + return value ? (const char*)sord_node_get_string(value->node) : NULL; +} + +bool +lilv_node_is_int(const LilvNode* value) +{ + return (value && value->type == LILV_VALUE_INT); +} + +int +lilv_node_as_int(const LilvNode* value) +{ + return lilv_node_is_int(value) ? value->val.int_val : 0; +} + +bool +lilv_node_is_float(const LilvNode* value) +{ + return (value && value->type == LILV_VALUE_FLOAT); +} + +float +lilv_node_as_float(const LilvNode* value) +{ + if (lilv_node_is_float(value)) { + return value->val.float_val; + } + + if (lilv_node_is_int(value)) { + return (float)value->val.int_val; + } + + return NAN; +} + +bool +lilv_node_is_bool(const LilvNode* value) +{ + return (value && value->type == LILV_VALUE_BOOL); +} + +bool +lilv_node_as_bool(const LilvNode* value) +{ + return lilv_node_is_bool(value) ? value->val.bool_val : false; +} + +char* +lilv_node_get_path(const LilvNode* value, char** hostname) +{ + if (lilv_node_is_uri(value)) { + return lilv_file_uri_parse(lilv_node_as_uri(value), hostname); + } + return NULL; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1140 @@ +/* + Copyright 2007-2019 David Robillard + + 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. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "serd/serd.h" +#include "sord/sord.h" +#include "zix/tree.h" + +#include "lv2/core/lv2.h" +#include "lv2/ui/ui.h" + +#ifdef LILV_DYN_MANIFEST +# include "lv2/dynmanifest/dynmanifest.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#define NS_DOAP (const uint8_t*)"http://usefulinc.com/ns/doap#" +#define NS_FOAF (const uint8_t*)"http://xmlns.com/foaf/0.1/" + +static void +lilv_plugin_init(LilvPlugin* plugin, LilvNode* bundle_uri) +{ + plugin->bundle_uri = bundle_uri; + plugin->binary_uri = NULL; +#ifdef LILV_DYN_MANIFEST + plugin->dynmanifest = NULL; +#endif + plugin->plugin_class = NULL; + plugin->data_uris = lilv_nodes_new(); + plugin->ports = NULL; + plugin->num_ports = 0; + plugin->loaded = false; + plugin->parse_errors = false; + plugin->replaced = false; +} + +/** Ownership of `uri` and `bundle` is taken */ +LilvPlugin* +lilv_plugin_new(LilvWorld* world, LilvNode* uri, LilvNode* bundle_uri) +{ + LilvPlugin* plugin = (LilvPlugin*)malloc(sizeof(LilvPlugin)); + + plugin->world = world; + plugin->plugin_uri = uri; + + lilv_plugin_init(plugin, bundle_uri); + return plugin; +} + +void +lilv_plugin_clear(LilvPlugin* plugin, LilvNode* bundle_uri) +{ + lilv_node_free(plugin->bundle_uri); + lilv_node_free(plugin->binary_uri); + lilv_nodes_free(plugin->data_uris); + lilv_plugin_init(plugin, bundle_uri); +} + +static void +lilv_plugin_free_ports(LilvPlugin* plugin) +{ + if (plugin->ports) { + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + lilv_port_free(plugin, plugin->ports[i]); + } + free(plugin->ports); + plugin->num_ports = 0; + plugin->ports = NULL; + } +} + +void +lilv_plugin_free(LilvPlugin* plugin) +{ +#ifdef LILV_DYN_MANIFEST + if (plugin->dynmanifest && --plugin->dynmanifest->refs == 0) { + lilv_dynmanifest_free(plugin->dynmanifest); + } +#endif + + lilv_node_free(plugin->plugin_uri); + plugin->plugin_uri = NULL; + + lilv_node_free(plugin->bundle_uri); + plugin->bundle_uri = NULL; + + lilv_node_free(plugin->binary_uri); + plugin->binary_uri = NULL; + + lilv_plugin_free_ports(plugin); + + lilv_nodes_free(plugin->data_uris); + plugin->data_uris = NULL; + + free(plugin); +} + +static LilvNode* +lilv_plugin_get_one(const LilvPlugin* plugin, + const SordNode* subject, + const SordNode* predicate) +{ + /* TODO: This is slower than it could be in some cases, but it's simpler to + use the existing i18n code. */ + + SordIter* stream = + lilv_world_query_internal(plugin->world, subject, predicate, NULL); + + LilvNodes* nodes = + lilv_nodes_from_stream_objects(plugin->world, stream, SORD_OBJECT); + + if (nodes) { + LilvNode* value = lilv_node_duplicate(lilv_nodes_get_first(nodes)); + lilv_nodes_free(nodes); + return value; + } + + return NULL; +} + +LilvNode* +lilv_plugin_get_unique(const LilvPlugin* plugin, + const SordNode* subject, + const SordNode* predicate) +{ + LilvNode* ret = lilv_plugin_get_one(plugin, subject, predicate); + if (!ret) { + LILV_ERRORF("No value found for (%s %s ...) property\n", + sord_node_get_string(subject), + sord_node_get_string(predicate)); + } + return ret; +} + +static void +lilv_plugin_load(LilvPlugin* plugin) +{ + SordNode* bundle_uri_node = plugin->bundle_uri->node; + const SerdNode* bundle_uri_snode = sord_node_to_serd_node(bundle_uri_node); + + SerdEnv* env = serd_env_new(bundle_uri_snode); + SerdReader* reader = + sord_new_reader(plugin->world->model, env, SERD_TURTLE, bundle_uri_node); + + SordModel* prots = lilv_world_filter_model(plugin->world, + plugin->world->model, + plugin->plugin_uri->node, + plugin->world->uris.lv2_prototype, + NULL, + NULL); + SordModel* skel = sord_new(plugin->world->world, SORD_SPO, false); + SordIter* iter = sord_begin(prots); + for (; !sord_iter_end(iter); sord_iter_next(iter)) { + const SordNode* t = sord_iter_get_node(iter, SORD_OBJECT); + LilvNode* prototype = lilv_node_new_from_node(plugin->world, t); + + lilv_world_load_resource(plugin->world, prototype); + + SordIter* statements = + sord_search(plugin->world->model, prototype->node, NULL, NULL, NULL); + FOREACH_MATCH (statements) { + SordQuad quad; + sord_iter_get(statements, quad); + quad[0] = plugin->plugin_uri->node; + sord_add(skel, quad); + } + + sord_iter_free(statements); + lilv_node_free(prototype); + } + sord_iter_free(iter); + + for (iter = sord_begin(skel); !sord_iter_end(iter); sord_iter_next(iter)) { + SordQuad quad; + sord_iter_get(iter, quad); + sord_add(plugin->world->model, quad); + } + sord_iter_free(iter); + sord_free(skel); + sord_free(prots); + + // Parse all the plugin's data files into RDF model + SerdStatus st = SERD_SUCCESS; + LILV_FOREACH (nodes, i, plugin->data_uris) { + const LilvNode* data_uri = lilv_nodes_get(plugin->data_uris, i); + + serd_env_set_base_uri(env, sord_node_to_serd_node(data_uri->node)); + st = lilv_world_load_file(plugin->world, reader, data_uri); + if (st > SERD_FAILURE) { + break; + } + } + + if (st > SERD_FAILURE) { + plugin->loaded = true; + plugin->parse_errors = true; + serd_reader_free(reader); + serd_env_free(env); + return; + } + +#ifdef LILV_DYN_MANIFEST + // Load and parse dynamic manifest data, if this is a library + if (plugin->dynmanifest) { + typedef int (*GetDataFunc)( + LV2_Dyn_Manifest_Handle handle, FILE * fp, const char* uri); + GetDataFunc get_data_func = (GetDataFunc)lilv_dlfunc( + plugin->dynmanifest->lib, "lv2_dyn_manifest_get_data"); + if (get_data_func) { + const SordNode* bundle = plugin->dynmanifest->bundle->node; + serd_env_set_base_uri(env, sord_node_to_serd_node(bundle)); + FILE* fd = tmpfile(); + get_data_func(plugin->dynmanifest->handle, + fd, + lilv_node_as_string(plugin->plugin_uri)); + rewind(fd); + serd_reader_add_blank_prefix(reader, + lilv_world_blank_node_prefix(plugin->world)); + serd_reader_read_file_handle( + reader, fd, (const uint8_t*)"(dyn-manifest)"); + fclose(fd); + } + } +#endif + serd_reader_free(reader); + serd_env_free(env); + + plugin->loaded = true; +} + +static bool +is_symbol(const char* str) +{ + for (const char* s = str; *s; ++s) { + if (!((*s >= 'a' && *s <= 'z') || (*s >= 'A' && *s <= 'Z') || + (s > str && *s >= '0' && *s <= '9') || *s == '_')) { + return false; + } + } + return true; +} + +static void +lilv_plugin_load_ports_if_necessary(const LilvPlugin* const_plugin) +{ + LilvPlugin* plugin = (LilvPlugin*)const_plugin; + + lilv_plugin_load_if_necessary(plugin); + + if (!plugin->ports) { + plugin->ports = (LilvPort**)malloc(sizeof(LilvPort*)); + plugin->ports[0] = NULL; + + SordIter* ports = lilv_world_query_internal(plugin->world, + plugin->plugin_uri->node, + plugin->world->uris.lv2_port, + NULL); + + FOREACH_MATCH (ports) { + const SordNode* port = sord_iter_get_node(ports, SORD_OBJECT); + + LilvNode* index = + lilv_plugin_get_unique(plugin, port, plugin->world->uris.lv2_index); + + LilvNode* symbol = + lilv_plugin_get_unique(plugin, port, plugin->world->uris.lv2_symbol); + + if (!lilv_node_is_string(symbol) || + !is_symbol((const char*)sord_node_get_string(symbol->node))) { + LILV_ERRORF("Plugin <%s> port symbol `%s' is invalid\n", + lilv_node_as_uri(plugin->plugin_uri), + lilv_node_as_string(symbol)); + lilv_node_free(symbol); + lilv_node_free(index); + lilv_plugin_free_ports(plugin); + break; + } + + if (!lilv_node_is_int(index)) { + LILV_ERRORF("Plugin <%s> port index is not an integer\n", + lilv_node_as_uri(plugin->plugin_uri)); + lilv_node_free(symbol); + lilv_node_free(index); + lilv_plugin_free_ports(plugin); + break; + } + + uint32_t this_index = lilv_node_as_int(index); + LilvPort* this_port = NULL; + if (plugin->num_ports > this_index) { + this_port = plugin->ports[this_index]; + } else { + plugin->ports = (LilvPort**)realloc( + plugin->ports, (this_index + 1) * sizeof(LilvPort*)); + memset(plugin->ports + plugin->num_ports, + '\0', + (this_index - plugin->num_ports) * sizeof(LilvPort*)); + plugin->num_ports = this_index + 1; + } + + // Havn't seen this port yet, add it to array + if (!this_port) { + this_port = lilv_port_new( + plugin->world, port, this_index, lilv_node_as_string(symbol)); + plugin->ports[this_index] = this_port; + } + + SordIter* types = lilv_world_query_internal( + plugin->world, port, plugin->world->uris.rdf_a, NULL); + FOREACH_MATCH (types) { + const SordNode* type = sord_iter_get_node(types, SORD_OBJECT); + if (sord_node_get_type(type) == SORD_URI) { + zix_tree_insert((ZixTree*)this_port->classes, + lilv_node_new_from_node(plugin->world, type), + NULL); + } else { + LILV_WARNF("Plugin <%s> port type is not a URI\n", + lilv_node_as_uri(plugin->plugin_uri)); + } + } + sord_iter_free(types); + + lilv_node_free(symbol); + lilv_node_free(index); + } + sord_iter_free(ports); + + // Check sanity + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + if (!plugin->ports[i]) { + LILV_ERRORF("Plugin <%s> is missing port %u/%u\n", + lilv_node_as_uri(plugin->plugin_uri), + i, + plugin->num_ports); + lilv_plugin_free_ports(plugin); + break; + } + } + } +} + +void +lilv_plugin_load_if_necessary(const LilvPlugin* plugin) +{ + if (!plugin->loaded) { + lilv_plugin_load((LilvPlugin*)plugin); + } +} + +const LilvNode* +lilv_plugin_get_uri(const LilvPlugin* plugin) +{ + return plugin->plugin_uri; +} + +const LilvNode* +lilv_plugin_get_bundle_uri(const LilvPlugin* plugin) +{ + return plugin->bundle_uri; +} + +const LilvNode* +lilv_plugin_get_library_uri(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary((LilvPlugin*)plugin); + if (!plugin->binary_uri) { + // lv2:binary ?binary + SordIter* i = lilv_world_query_internal(plugin->world, + plugin->plugin_uri->node, + plugin->world->uris.lv2_binary, + NULL); + FOREACH_MATCH (i) { + const SordNode* binary_node = sord_iter_get_node(i, SORD_OBJECT); + if (sord_node_get_type(binary_node) == SORD_URI) { + ((LilvPlugin*)plugin)->binary_uri = + lilv_node_new_from_node(plugin->world, binary_node); + break; + } + } + sord_iter_free(i); + } + if (!plugin->binary_uri) { + LILV_WARNF("Plugin <%s> has no lv2:binary\n", + lilv_node_as_uri(lilv_plugin_get_uri(plugin))); + } + return plugin->binary_uri; +} + +const LilvNodes* +lilv_plugin_get_data_uris(const LilvPlugin* plugin) +{ + return plugin->data_uris; +} + +const LilvPluginClass* +lilv_plugin_get_class(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary((LilvPlugin*)plugin); + if (!plugin->plugin_class) { + // a ?class + SordIter* c = lilv_world_query_internal( + plugin->world, plugin->plugin_uri->node, plugin->world->uris.rdf_a, NULL); + FOREACH_MATCH (c) { + const SordNode* class_node = sord_iter_get_node(c, SORD_OBJECT); + if (sord_node_get_type(class_node) != SORD_URI) { + continue; + } + + LilvNode* klass = lilv_node_new_from_node(plugin->world, class_node); + if (!lilv_node_equals(klass, plugin->world->lv2_plugin_class->uri)) { + const LilvPluginClass* pclass = + lilv_plugin_classes_get_by_uri(plugin->world->plugin_classes, klass); + + if (pclass) { + ((LilvPlugin*)plugin)->plugin_class = pclass; + lilv_node_free(klass); + break; + } + } + + lilv_node_free(klass); + } + sord_iter_free(c); + + if (plugin->plugin_class == NULL) { + ((LilvPlugin*)plugin)->plugin_class = plugin->world->lv2_plugin_class; + } + } + return plugin->plugin_class; +} + +static LilvNodes* +lilv_plugin_get_value_internal(const LilvPlugin* plugin, + const SordNode* predicate) +{ + lilv_plugin_load_if_necessary(plugin); + return lilv_world_find_nodes_internal( + plugin->world, plugin->plugin_uri->node, predicate, NULL); +} + +bool +lilv_plugin_verify(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + if (plugin->parse_errors) { + return false; + } + + LilvNode* rdf_type = lilv_new_uri(plugin->world, LILV_NS_RDF "type"); + LilvNodes* results = lilv_plugin_get_value(plugin, rdf_type); + lilv_node_free(rdf_type); + if (!results) { + return false; + } + + lilv_nodes_free(results); + results = + lilv_plugin_get_value_internal(plugin, plugin->world->uris.doap_name); + if (!results) { + return false; + } + + lilv_nodes_free(results); + LilvNode* lv2_port = lilv_new_uri(plugin->world, LV2_CORE__port); + results = lilv_plugin_get_value(plugin, lv2_port); + lilv_node_free(lv2_port); + if (!results) { + return false; + } + + lilv_nodes_free(results); + return true; +} + +LilvNode* +lilv_plugin_get_name(const LilvPlugin* plugin) +{ + LilvNodes* results = + lilv_plugin_get_value_internal(plugin, plugin->world->uris.doap_name); + + LilvNode* ret = NULL; + if (results) { + LilvNode* val = lilv_nodes_get_first(results); + if (lilv_node_is_string(val)) { + ret = lilv_node_duplicate(val); + } + lilv_nodes_free(results); + } + + if (!ret) { + LILV_WARNF("Plugin <%s> has no (mandatory) doap:name\n", + lilv_node_as_string(lilv_plugin_get_uri(plugin))); + } + + return ret; +} + +LilvNodes* +lilv_plugin_get_value(const LilvPlugin* plugin, const LilvNode* predicate) +{ + lilv_plugin_load_if_necessary(plugin); + return lilv_world_find_nodes( + plugin->world, plugin->plugin_uri, predicate, NULL); +} + +uint32_t +lilv_plugin_get_num_ports(const LilvPlugin* plugin) +{ + lilv_plugin_load_ports_if_necessary(plugin); + return plugin->num_ports; +} + +void +lilv_plugin_get_port_ranges_float(const LilvPlugin* plugin, + float* min_values, + float* max_values, + float* def_values) +{ + lilv_plugin_load_ports_if_necessary(plugin); + LilvNode* min = NULL; + LilvNode* max = NULL; + LilvNode* def = NULL; + LilvNode** minptr = min_values ? &min : NULL; + LilvNode** maxptr = max_values ? &max : NULL; + LilvNode** defptr = def_values ? &def : NULL; + + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + lilv_port_get_range(plugin, plugin->ports[i], defptr, minptr, maxptr); + + if (min_values) { + if (lilv_node_is_float(min) || lilv_node_is_int(min)) { + min_values[i] = lilv_node_as_float(min); + } else { + min_values[i] = NAN; + } + } + + if (max_values) { + if (lilv_node_is_float(max) || lilv_node_is_int(max)) { + max_values[i] = lilv_node_as_float(max); + } else { + max_values[i] = NAN; + } + } + + if (def_values) { + if (lilv_node_is_float(def) || lilv_node_is_int(def)) { + def_values[i] = lilv_node_as_float(def); + } else { + def_values[i] = NAN; + } + } + + lilv_node_free(def); + lilv_node_free(min); + lilv_node_free(max); + } +} + +uint32_t +lilv_plugin_get_num_ports_of_class_va(const LilvPlugin* plugin, + const LilvNode* class_1, + va_list args) +{ + lilv_plugin_load_ports_if_necessary(plugin); + + uint32_t count = 0; + + // Build array of classes from args so we can walk it several times + size_t n_classes = 0; + const LilvNode** classes = NULL; + for (LilvNode* c = NULL; (c = va_arg(args, LilvNode*));) { + classes = + (const LilvNode**)realloc(classes, ++n_classes * sizeof(LilvNode*)); + classes[n_classes - 1] = c; + } + + // Check each port against every type + for (unsigned i = 0; i < plugin->num_ports; ++i) { + LilvPort* port = plugin->ports[i]; + if (port && lilv_port_is_a(plugin, port, class_1)) { + bool matches = true; + for (size_t j = 0; j < n_classes; ++j) { + if (!lilv_port_is_a(plugin, port, classes[j])) { + matches = false; + break; + } + } + + if (matches) { + ++count; + } + } + } + + free(classes); + return count; +} + +uint32_t +lilv_plugin_get_num_ports_of_class(const LilvPlugin* plugin, + const LilvNode* class_1, + ...) +{ + va_list args; + va_start(args, class_1); + + uint32_t count = lilv_plugin_get_num_ports_of_class_va(plugin, class_1, args); + + va_end(args); + return count; +} + +bool +lilv_plugin_has_latency(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + SordIter* ports = lilv_world_query_internal(plugin->world, + plugin->plugin_uri->node, + plugin->world->uris.lv2_port, + NULL); + + bool ret = false; + FOREACH_MATCH (ports) { + const SordNode* port = sord_iter_get_node(ports, SORD_OBJECT); + + SordIter* prop = + lilv_world_query_internal(plugin->world, + port, + plugin->world->uris.lv2_portProperty, + plugin->world->uris.lv2_reportsLatency); + + SordIter* des = + lilv_world_query_internal(plugin->world, + port, + plugin->world->uris.lv2_designation, + plugin->world->uris.lv2_latency); + + const bool latent = !sord_iter_end(prop) || !sord_iter_end(des); + sord_iter_free(prop); + sord_iter_free(des); + if (latent) { + ret = true; + break; + } + } + sord_iter_free(ports); + + return ret; +} + +static const LilvPort* +lilv_plugin_get_port_by_property(const LilvPlugin* plugin, + const SordNode* port_property) +{ + lilv_plugin_load_ports_if_necessary(plugin); + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + LilvPort* port = plugin->ports[i]; + SordIter* iter = + lilv_world_query_internal(plugin->world, + port->node->node, + plugin->world->uris.lv2_portProperty, + port_property); + + const bool found = !sord_iter_end(iter); + sord_iter_free(iter); + + if (found) { + return port; + } + } + + return NULL; +} + +const LilvPort* +lilv_plugin_get_port_by_designation(const LilvPlugin* plugin, + const LilvNode* port_class, + const LilvNode* designation) +{ + LilvWorld* world = plugin->world; + lilv_plugin_load_ports_if_necessary(plugin); + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + LilvPort* port = plugin->ports[i]; + SordIter* iter = lilv_world_query_internal( + world, port->node->node, world->uris.lv2_designation, designation->node); + + const bool found = + !sord_iter_end(iter) && + (!port_class || lilv_port_is_a(plugin, port, port_class)); + sord_iter_free(iter); + + if (found) { + return port; + } + } + + return NULL; +} + +uint32_t +lilv_plugin_get_latency_port_index(const LilvPlugin* plugin) +{ + LilvNode* lv2_OutputPort = lilv_new_uri(plugin->world, LV2_CORE__OutputPort); + LilvNode* lv2_latency = lilv_new_uri(plugin->world, LV2_CORE__latency); + + const LilvPort* prop_port = lilv_plugin_get_port_by_property( + plugin, plugin->world->uris.lv2_reportsLatency); + const LilvPort* des_port = + lilv_plugin_get_port_by_designation(plugin, lv2_OutputPort, lv2_latency); + + lilv_node_free(lv2_latency); + lilv_node_free(lv2_OutputPort); + + if (prop_port) { + return prop_port->index; + } + + if (des_port) { + return des_port->index; + } + + return (uint32_t)-1; +} + +bool +lilv_plugin_has_feature(const LilvPlugin* plugin, const LilvNode* feature) +{ + lilv_plugin_load_if_necessary(plugin); + const SordNode* predicates[] = {plugin->world->uris.lv2_requiredFeature, + plugin->world->uris.lv2_optionalFeature, + NULL}; + + for (const SordNode** pred = predicates; *pred; ++pred) { + if (lilv_world_ask_internal( + plugin->world, plugin->plugin_uri->node, *pred, feature->node)) { + return true; + } + } + return false; +} + +LilvNodes* +lilv_plugin_get_supported_features(const LilvPlugin* plugin) +{ + LilvNodes* optional = lilv_plugin_get_optional_features(plugin); + LilvNodes* required = lilv_plugin_get_required_features(plugin); + LilvNodes* result = lilv_nodes_merge(optional, required); + lilv_nodes_free(optional); + lilv_nodes_free(required); + return result; +} + +LilvNodes* +lilv_plugin_get_optional_features(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + return lilv_world_find_nodes_internal(plugin->world, + plugin->plugin_uri->node, + plugin->world->uris.lv2_optionalFeature, + NULL); +} + +LilvNodes* +lilv_plugin_get_required_features(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + return lilv_world_find_nodes_internal(plugin->world, + plugin->plugin_uri->node, + plugin->world->uris.lv2_requiredFeature, + NULL); +} + +bool +lilv_plugin_has_extension_data(const LilvPlugin* plugin, const LilvNode* uri) +{ + if (!lilv_node_is_uri(uri)) { + LILV_ERRORF("Extension data `%s' is not a URI\n", + sord_node_get_string(uri->node)); + return false; + } + + lilv_plugin_load_if_necessary(plugin); + return lilv_world_ask_internal(plugin->world, + plugin->plugin_uri->node, + plugin->world->uris.lv2_extensionData, + uri->node); +} + +LilvNodes* +lilv_plugin_get_extension_data(const LilvPlugin* plugin) +{ + return lilv_plugin_get_value_internal(plugin, + plugin->world->uris.lv2_extensionData); +} + +const LilvPort* +lilv_plugin_get_port_by_index(const LilvPlugin* plugin, uint32_t index) +{ + lilv_plugin_load_ports_if_necessary(plugin); + if (index < plugin->num_ports) { + return plugin->ports[index]; + } + + return NULL; +} + +const LilvPort* +lilv_plugin_get_port_by_symbol(const LilvPlugin* plugin, const LilvNode* symbol) +{ + lilv_plugin_load_ports_if_necessary(plugin); + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + LilvPort* port = plugin->ports[i]; + if (lilv_node_equals(port->symbol, symbol)) { + return port; + } + } + + return NULL; +} + +LilvNode* +lilv_plugin_get_project(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + + SordNode* lv2_project = + sord_new_uri(plugin->world->world, (const uint8_t*)LV2_CORE__project); + + SordIter* projects = lilv_world_query_internal( + plugin->world, plugin->plugin_uri->node, lv2_project, NULL); + + sord_node_free(plugin->world->world, lv2_project); + + if (sord_iter_end(projects)) { + sord_iter_free(projects); + return NULL; + } + + const SordNode* project = sord_iter_get_node(projects, SORD_OBJECT); + + sord_iter_free(projects); + return lilv_node_new_from_node(plugin->world, project); +} + +static const SordNode* +lilv_plugin_get_author(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + + SordNode* doap_maintainer = + sord_new_uri(plugin->world->world, NS_DOAP "maintainer"); + + SordIter* maintainers = lilv_world_query_internal( + plugin->world, plugin->plugin_uri->node, doap_maintainer, NULL); + + if (sord_iter_end(maintainers)) { + sord_iter_free(maintainers); + + LilvNode* project = lilv_plugin_get_project(plugin); + if (!project) { + sord_node_free(plugin->world->world, doap_maintainer); + return NULL; + } + + maintainers = lilv_world_query_internal( + plugin->world, project->node, doap_maintainer, NULL); + + lilv_node_free(project); + } + + sord_node_free(plugin->world->world, doap_maintainer); + + if (sord_iter_end(maintainers)) { + sord_iter_free(maintainers); + return NULL; + } + + const SordNode* author = sord_iter_get_node(maintainers, SORD_OBJECT); + + sord_iter_free(maintainers); + return author; +} + +static LilvNode* +lilv_plugin_get_author_property(const LilvPlugin* plugin, const uint8_t* uri) +{ + const SordNode* author = lilv_plugin_get_author(plugin); + if (author) { + SordWorld* sworld = plugin->world->world; + SordNode* pred = sord_new_uri(sworld, uri); + LilvNode* ret = lilv_plugin_get_one(plugin, author, pred); + sord_node_free(sworld, pred); + return ret; + } + return NULL; +} + +LilvNode* +lilv_plugin_get_author_name(const LilvPlugin* plugin) +{ + return lilv_plugin_get_author_property(plugin, NS_FOAF "name"); +} + +LilvNode* +lilv_plugin_get_author_email(const LilvPlugin* plugin) +{ + return lilv_plugin_get_author_property(plugin, NS_FOAF "mbox"); +} + +LilvNode* +lilv_plugin_get_author_homepage(const LilvPlugin* plugin) +{ + return lilv_plugin_get_author_property(plugin, NS_FOAF "homepage"); +} + +bool +lilv_plugin_is_replaced(const LilvPlugin* plugin) +{ + return plugin->replaced; +} + +LilvUIs* +lilv_plugin_get_uis(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + + SordNode* ui_ui_node = + sord_new_uri(plugin->world->world, (const uint8_t*)LV2_UI__ui); + SordNode* ui_binary_node = + sord_new_uri(plugin->world->world, (const uint8_t*)LV2_UI__binary); + + LilvUIs* result = lilv_uis_new(); + SordIter* uis = lilv_world_query_internal( + plugin->world, plugin->plugin_uri->node, ui_ui_node, NULL); + + FOREACH_MATCH (uis) { + const SordNode* ui = sord_iter_get_node(uis, SORD_OBJECT); + + LilvNode* type = + lilv_plugin_get_unique(plugin, ui, plugin->world->uris.rdf_a); + LilvNode* binary = + lilv_plugin_get_one(plugin, ui, plugin->world->uris.lv2_binary); + if (!binary) { + binary = lilv_plugin_get_unique(plugin, ui, ui_binary_node); + } + + if (sord_node_get_type(ui) != SORD_URI || !lilv_node_is_uri(type) || + !lilv_node_is_uri(binary)) { + lilv_node_free(binary); + lilv_node_free(type); + LILV_ERRORF("Corrupt UI <%s>\n", sord_node_get_string(ui)); + continue; + } + + LilvUI* lilv_ui = lilv_ui_new( + plugin->world, lilv_node_new_from_node(plugin->world, ui), type, binary); + + zix_tree_insert((ZixTree*)result, lilv_ui, NULL); + } + sord_iter_free(uis); + + sord_node_free(plugin->world->world, ui_binary_node); + sord_node_free(plugin->world->world, ui_ui_node); + + if (lilv_uis_size(result) > 0) { + return result; + } + + lilv_uis_free(result); + return NULL; +} + +LilvNodes* +lilv_plugin_get_related(const LilvPlugin* plugin, const LilvNode* type) +{ + lilv_plugin_load_if_necessary(plugin); + + LilvWorld* const world = plugin->world; + LilvNodes* const related = lilv_world_find_nodes_internal( + world, NULL, world->uris.lv2_appliesTo, lilv_plugin_get_uri(plugin)->node); + + if (!type) { + return related; + } + + LilvNodes* matches = lilv_nodes_new(); + LILV_FOREACH (nodes, i, related) { + LilvNode* node = (LilvNode*)lilv_collection_get((ZixTree*)related, i); + if (lilv_world_ask_internal( + world, node->node, world->uris.rdf_a, type->node)) { + zix_tree_insert( + (ZixTree*)matches, lilv_node_new_from_node(world, node->node), NULL); + } + } + + lilv_nodes_free(related); + return matches; +} + +static SerdEnv* +new_lv2_env(const SerdNode* base) +{ + SerdEnv* env = serd_env_new(base); + +#define USTR(s) ((const uint8_t*)(s)) + + serd_env_set_prefix_from_strings(env, USTR("doap"), USTR(LILV_NS_DOAP)); + serd_env_set_prefix_from_strings(env, USTR("foaf"), USTR(LILV_NS_FOAF)); + serd_env_set_prefix_from_strings(env, USTR("lv2"), USTR(LILV_NS_LV2)); + serd_env_set_prefix_from_strings(env, USTR("owl"), USTR(LILV_NS_OWL)); + serd_env_set_prefix_from_strings(env, USTR("rdf"), USTR(LILV_NS_RDF)); + serd_env_set_prefix_from_strings(env, USTR("rdfs"), USTR(LILV_NS_RDFS)); + serd_env_set_prefix_from_strings(env, USTR("xsd"), USTR(LILV_NS_XSD)); + + return env; +} + +static void +maybe_write_prefixes(SerdWriter* writer, SerdEnv* env, FILE* file) +{ + fseek(file, 0, SEEK_END); + if (ftell(file) == 0) { + serd_env_foreach(env, (SerdPrefixSink)serd_writer_set_prefix, writer); + } else { + fprintf(file, "\n"); + } +} + +void +lilv_plugin_write_description(LilvWorld* world, + const LilvPlugin* plugin, + const LilvNode* base_uri, + FILE* plugin_file) +{ + const LilvNode* subject = lilv_plugin_get_uri(plugin); + const uint32_t num_ports = lilv_plugin_get_num_ports(plugin); + const SerdNode* base = sord_node_to_serd_node(base_uri->node); + SerdEnv* env = new_lv2_env(base); + + SerdWriter* writer = + serd_writer_new(SERD_TURTLE, + (SerdStyle)(SERD_STYLE_ABBREVIATED | SERD_STYLE_CURIED), + env, + NULL, + serd_file_sink, + plugin_file); + + // Write prefixes if this is a new file + maybe_write_prefixes(writer, env, plugin_file); + + // Write plugin description + SordIter* plug_iter = + lilv_world_query_internal(world, subject->node, NULL, NULL); + sord_write_iter(plug_iter, writer); + + // Write port descriptions + for (uint32_t i = 0; i < num_ports; ++i) { + const LilvPort* port = plugin->ports[i]; + SordIter* port_iter = + lilv_world_query_internal(world, port->node->node, NULL, NULL); + sord_write_iter(port_iter, writer); + } + + serd_writer_free(writer); + serd_env_free(env); +} + +void +lilv_plugin_write_manifest_entry(LilvWorld* world, + const LilvPlugin* plugin, + const LilvNode* base_uri, + FILE* manifest_file, + const char* plugin_file_path) +{ + (void)world; + + const LilvNode* subject = lilv_plugin_get_uri(plugin); + const SerdNode* base = sord_node_to_serd_node(base_uri->node); + SerdEnv* env = new_lv2_env(base); + + SerdWriter* writer = + serd_writer_new(SERD_TURTLE, + (SerdStyle)(SERD_STYLE_ABBREVIATED | SERD_STYLE_CURIED), + env, + NULL, + serd_file_sink, + manifest_file); + + // Write prefixes if this is a new file + maybe_write_prefixes(writer, env, manifest_file); + + // Write manifest entry + serd_writer_write_statement( + writer, + 0, + NULL, + sord_node_to_serd_node(subject->node), + sord_node_to_serd_node(plugin->world->uris.rdf_a), + sord_node_to_serd_node(plugin->world->uris.lv2_Plugin), + 0, + 0); + + const SerdNode file_node = + serd_node_from_string(SERD_URI, (const uint8_t*)plugin_file_path); + serd_writer_write_statement( + writer, + 0, + NULL, + sord_node_to_serd_node(subject->node), + sord_node_to_serd_node(plugin->world->uris.rdfs_seeAlso), + &file_node, + 0, + 0); + + serd_writer_free(writer); + serd_env_free(env); +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,91 @@ +/* + Copyright 2007-2019 David Robillard + + 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. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "sord/sord.h" +#include "zix/tree.h" + +#include +#include + +LilvPluginClass* +lilv_plugin_class_new(LilvWorld* world, + const SordNode* parent_node, + const SordNode* uri, + const char* label) +{ + LilvPluginClass* pc = (LilvPluginClass*)malloc(sizeof(LilvPluginClass)); + pc->world = world; + pc->uri = lilv_node_new_from_node(world, uri); + pc->label = lilv_node_new(world, LILV_VALUE_STRING, label); + pc->parent_uri = + (parent_node ? lilv_node_new_from_node(world, parent_node) : NULL); + return pc; +} + +void +lilv_plugin_class_free(LilvPluginClass* plugin_class) +{ + if (!plugin_class) { + return; + } + + lilv_node_free(plugin_class->uri); + lilv_node_free(plugin_class->parent_uri); + lilv_node_free(plugin_class->label); + free(plugin_class); +} + +const LilvNode* +lilv_plugin_class_get_parent_uri(const LilvPluginClass* plugin_class) +{ + return plugin_class->parent_uri ? plugin_class->parent_uri : NULL; +} + +const LilvNode* +lilv_plugin_class_get_uri(const LilvPluginClass* plugin_class) +{ + return plugin_class->uri; +} + +const LilvNode* +lilv_plugin_class_get_label(const LilvPluginClass* plugin_class) +{ + return plugin_class->label; +} + +LilvPluginClasses* +lilv_plugin_class_get_children(const LilvPluginClass* plugin_class) +{ + // Returned list doesn't own categories + LilvPluginClasses* all = plugin_class->world->plugin_classes; + LilvPluginClasses* result = zix_tree_new(false, lilv_ptr_cmp, NULL, NULL); + + for (ZixTreeIter* i = zix_tree_begin((ZixTree*)all); + i != zix_tree_end((ZixTree*)all); + i = zix_tree_iter_next(i)) { + const LilvPluginClass* c = (LilvPluginClass*)zix_tree_get(i); + const LilvNode* parent = lilv_plugin_class_get_parent_uri(c); + if (parent && + lilv_node_equals(lilv_plugin_class_get_uri(plugin_class), parent)) { + zix_tree_insert((ZixTree*)result, (LilvPluginClass*)c, NULL); + } + } + + return result; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,272 @@ +/* + Copyright 2007-2019 David Robillard + + 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. +*/ + +#include "lilv_internal.h" + +#include "lv2/atom/atom.h" +#include "lv2/core/lv2.h" +#include "lv2/event/event.h" + +#include "lilv/lilv.h" +#include "sord/sord.h" +#include "zix/tree.h" + +#include +#include +#include +#include +#include + +LilvPort* +lilv_port_new(LilvWorld* world, + const SordNode* node, + uint32_t index, + const char* symbol) +{ + LilvPort* port = (LilvPort*)malloc(sizeof(LilvPort)); + port->node = lilv_node_new_from_node(world, node); + port->index = index; + port->symbol = lilv_node_new(world, LILV_VALUE_STRING, symbol); + port->classes = lilv_nodes_new(); + return port; +} + +void +lilv_port_free(const LilvPlugin* plugin, LilvPort* port) +{ + (void)plugin; + + if (port) { + lilv_node_free(port->node); + lilv_nodes_free(port->classes); + lilv_node_free(port->symbol); + free(port); + } +} + +bool +lilv_port_is_a(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* port_class) +{ + (void)plugin; + + LILV_FOREACH (nodes, i, port->classes) { + if (lilv_node_equals(lilv_nodes_get(port->classes, i), port_class)) { + return true; + } + } + + return false; +} + +bool +lilv_port_has_property(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* property) +{ + return lilv_world_ask_internal(plugin->world, + port->node->node, + plugin->world->uris.lv2_portProperty, + property->node); +} + +bool +lilv_port_supports_event(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* event_type) +{ + const uint8_t* predicates[] = {(const uint8_t*)LV2_EVENT__supportsEvent, + (const uint8_t*)LV2_ATOM__supports, + NULL}; + + for (const uint8_t** pred = predicates; *pred; ++pred) { + if (lilv_world_ask_internal(plugin->world, + port->node->node, + sord_new_uri(plugin->world->world, *pred), + event_type->node)) { + return true; + } + } + return false; +} + +static LilvNodes* +lilv_port_get_value_by_node(const LilvPlugin* plugin, + const LilvPort* port, + const SordNode* predicate) +{ + return lilv_world_find_nodes_internal( + plugin->world, port->node->node, predicate, NULL); +} + +const LilvNode* +lilv_port_get_node(const LilvPlugin* plugin, const LilvPort* port) +{ + (void)plugin; + + return port->node; +} + +LilvNodes* +lilv_port_get_value(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* predicate) +{ + if (!lilv_node_is_uri(predicate)) { + LILV_ERRORF("Predicate `%s' is not a URI\n", + sord_node_get_string(predicate->node)); + return NULL; + } + + return lilv_port_get_value_by_node(plugin, port, predicate->node); +} + +LilvNode* +lilv_port_get(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* predicate) +{ + LilvNodes* values = lilv_port_get_value(plugin, port, predicate); + + LilvNode* value = + lilv_node_duplicate(values ? lilv_nodes_get_first(values) : NULL); + + lilv_nodes_free(values); + return value; +} + +uint32_t +lilv_port_get_index(const LilvPlugin* plugin, const LilvPort* port) +{ + (void)plugin; + + return port->index; +} + +const LilvNode* +lilv_port_get_symbol(const LilvPlugin* plugin, const LilvPort* port) +{ + (void)plugin; + + return port->symbol; +} + +LilvNode* +lilv_port_get_name(const LilvPlugin* plugin, const LilvPort* port) +{ + LilvNodes* results = + lilv_port_get_value_by_node(plugin, port, plugin->world->uris.lv2_name); + + LilvNode* ret = NULL; + if (results) { + LilvNode* val = lilv_nodes_get_first(results); + if (lilv_node_is_string(val)) { + ret = lilv_node_duplicate(val); + } + lilv_nodes_free(results); + } + + if (!ret) { + LILV_WARNF("Plugin <%s> port has no (mandatory) doap:name\n", + lilv_node_as_string(lilv_plugin_get_uri(plugin))); + } + + return ret; +} + +const LilvNodes* +lilv_port_get_classes(const LilvPlugin* plugin, const LilvPort* port) +{ + (void)plugin; + + return port->classes; +} + +void +lilv_port_get_range(const LilvPlugin* plugin, + const LilvPort* port, + LilvNode** def, + LilvNode** min, + LilvNode** max) +{ + if (def) { + LilvNodes* defaults = lilv_port_get_value_by_node( + plugin, port, plugin->world->uris.lv2_default); + *def = + defaults ? lilv_node_duplicate(lilv_nodes_get_first(defaults)) : NULL; + lilv_nodes_free(defaults); + } + + if (min) { + LilvNodes* minimums = lilv_port_get_value_by_node( + plugin, port, plugin->world->uris.lv2_minimum); + *min = + minimums ? lilv_node_duplicate(lilv_nodes_get_first(minimums)) : NULL; + lilv_nodes_free(minimums); + } + + if (max) { + LilvNodes* maximums = lilv_port_get_value_by_node( + plugin, port, plugin->world->uris.lv2_maximum); + *max = + maximums ? lilv_node_duplicate(lilv_nodes_get_first(maximums)) : NULL; + lilv_nodes_free(maximums); + } +} + +LilvScalePoints* +lilv_port_get_scale_points(const LilvPlugin* plugin, const LilvPort* port) +{ + SordIter* points = lilv_world_query_internal( + plugin->world, + port->node->node, + sord_new_uri(plugin->world->world, (const uint8_t*)LV2_CORE__scalePoint), + NULL); + + LilvScalePoints* ret = NULL; + if (!sord_iter_end(points)) { + ret = lilv_scale_points_new(); + } + + FOREACH_MATCH (points) { + const SordNode* point = sord_iter_get_node(points, SORD_OBJECT); + + LilvNode* value = + lilv_plugin_get_unique(plugin, point, plugin->world->uris.rdf_value); + + LilvNode* label = + lilv_plugin_get_unique(plugin, point, plugin->world->uris.rdfs_label); + + if (value && label) { + zix_tree_insert((ZixTree*)ret, lilv_scale_point_new(value, label), NULL); + } + } + sord_iter_free(points); + + assert(!ret || lilv_nodes_size(ret) > 0); + return ret; +} + +LilvNodes* +lilv_port_get_properties(const LilvPlugin* plugin, const LilvPort* port) +{ + LilvNode* pred = lilv_node_new_from_node( + plugin->world, plugin->world->uris.lv2_portProperty); + LilvNodes* ret = lilv_port_get_value(plugin, port, pred); + lilv_node_free(pred); + return ret; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,144 @@ +/* + Copyright 2007-2019 David Robillard + + 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. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "sord/sord.h" +#include "zix/tree.h" + +#include +#include + +typedef enum { + LILV_LANG_MATCH_NONE, ///< Language does not match at all + LILV_LANG_MATCH_PARTIAL, ///< Partial (language, but not country) match + LILV_LANG_MATCH_EXACT ///< Exact (language and country) match +} LilvLangMatch; + +static LilvLangMatch +lilv_lang_matches(const char* a, const char* b) +{ + if (!a || !b) { + return LILV_LANG_MATCH_NONE; + } + + if (!strcmp(a, b)) { + return LILV_LANG_MATCH_EXACT; + } + + const char* a_dash = strchr(a, '-'); + const size_t a_lang_len = a_dash ? (size_t)(a_dash - a) : strlen(a); + const char* b_dash = strchr(b, '-'); + const size_t b_lang_len = b_dash ? (size_t)(b_dash - b) : strlen(b); + + if (a_lang_len == b_lang_len && !strncmp(a, b, a_lang_len)) { + return LILV_LANG_MATCH_PARTIAL; + } + + return LILV_LANG_MATCH_NONE; +} + +static LilvNodes* +lilv_nodes_from_stream_objects_i18n(LilvWorld* world, + SordIter* stream, + SordQuadIndex field) +{ + LilvNodes* values = lilv_nodes_new(); + const SordNode* nolang = NULL; // Untranslated value + const SordNode* partial = NULL; // Partial language match + char* syslang = lilv_get_lang(); + FOREACH_MATCH (stream) { + const SordNode* value = sord_iter_get_node(stream, field); + if (sord_node_get_type(value) == SORD_LITERAL) { + const char* lang = sord_node_get_language(value); + + if (!lang) { + nolang = value; + } else { + switch (lilv_lang_matches(lang, syslang)) { + case LILV_LANG_MATCH_EXACT: + // Exact language match, add to results + zix_tree_insert( + (ZixTree*)values, lilv_node_new_from_node(world, value), NULL); + break; + case LILV_LANG_MATCH_PARTIAL: + // Partial language match, save in case we find no exact + partial = value; + break; + case LILV_LANG_MATCH_NONE: + break; + } + } + } else { + zix_tree_insert( + (ZixTree*)values, lilv_node_new_from_node(world, value), NULL); + } + } + sord_iter_free(stream); + free(syslang); + + if (lilv_nodes_size(values) > 0) { + return values; + } + + const SordNode* best = nolang; + if (syslang && partial) { + // Partial language match for system language + best = partial; + } else if (!best) { + // No languages matches at all, and no untranslated value + // Use any value, if possible + best = partial; + } + + if (best) { + zix_tree_insert( + (ZixTree*)values, lilv_node_new_from_node(world, best), NULL); + } else { + // No matches whatsoever + lilv_nodes_free(values); + values = NULL; + } + + return values; +} + +LilvNodes* +lilv_nodes_from_stream_objects(LilvWorld* world, + SordIter* stream, + SordQuadIndex field) +{ + if (sord_iter_end(stream)) { + sord_iter_free(stream); + return NULL; + } + + if (world->opt.filter_language) { + return lilv_nodes_from_stream_objects_i18n(world, stream, field); + } + + LilvNodes* values = lilv_nodes_new(); + FOREACH_MATCH (stream) { + const SordNode* value = sord_iter_get_node(stream, field); + LilvNode* node = lilv_node_new_from_node(world, value); + if (node) { + zix_tree_insert((ZixTree*)values, node, NULL); + } + } + sord_iter_free(stream); + return values; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,53 @@ +/* + Copyright 2007-2019 David Robillard + + 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. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" + +#include + +/** Ownership of value and label is taken */ +LilvScalePoint* +lilv_scale_point_new(LilvNode* value, LilvNode* label) +{ + LilvScalePoint* point = (LilvScalePoint*)malloc(sizeof(LilvScalePoint)); + point->value = value; + point->label = label; + return point; +} + +void +lilv_scale_point_free(LilvScalePoint* point) +{ + if (point) { + lilv_node_free(point->value); + lilv_node_free(point->label); + free(point); + } +} + +const LilvNode* +lilv_scale_point_get_value(const LilvScalePoint* point) +{ + return point->value; +} + +const LilvNode* +lilv_scale_point_get_label(const LilvScalePoint* point) +{ + return point->label; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1541 @@ +/* + Copyright 2007-2019 David Robillard + + 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. +*/ + +#include "filesystem.h" +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "serd/serd.h" +#include "sord/sord.h" +#include "sratom/sratom.h" +#include "zix/tree.h" + +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" +#include "lv2/core/lv2.h" +#include "lv2/presets/presets.h" +#include "lv2/state/state.h" +#include "lv2/urid/urid.h" + +#include +#include +#include +#include +#include +#include +#include + +#define USTR(s) ((const uint8_t*)(s)) + +typedef struct { + void* value; ///< Value/Object + size_t size; ///< Size of value + uint32_t key; ///< Key/Predicate (URID) + uint32_t type; ///< Type of value (URID) + uint32_t flags; ///< State flags (POD, etc) +} Property; + +typedef struct { + char* symbol; ///< Symbol of port + LV2_Atom* atom; ///< Value in port +} PortValue; + +typedef struct { + char* abs; ///< Absolute path of actual file + char* rel; ///< Abstract path (relative path in state dir) +} PathMap; + +typedef struct { + size_t n; + Property* props; +} PropertyArray; + +struct LilvStateImpl { + LilvNode* plugin_uri; ///< Plugin URI + LilvNode* uri; ///< State/preset URI + char* dir; ///< Save directory (if saved) + char* scratch_dir; ///< Directory for files created by plugin + char* copy_dir; ///< Directory for snapshots of external files + char* link_dir; ///< Directory for links to external files + char* label; ///< State/Preset label + ZixTree* abs2rel; ///< PathMap sorted by abs + ZixTree* rel2abs; ///< PathMap sorted by rel + PropertyArray props; ///< State properties + PropertyArray metadata; ///< State metadata + PortValue* values; ///< Port values + uint32_t atom_Path; ///< atom:Path URID + uint32_t n_values; ///< Number of port values +}; + +static int +abs_cmp(const void* a, const void* b, const void* user_data) +{ + (void)user_data; + + return strcmp(((const PathMap*)a)->abs, ((const PathMap*)b)->abs); +} + +static int +rel_cmp(const void* a, const void* b, const void* user_data) +{ + (void)user_data; + + return strcmp(((const PathMap*)a)->rel, ((const PathMap*)b)->rel); +} + +static int +property_cmp(const void* a, const void* b) +{ + const uint32_t a_key = ((const Property*)a)->key; + const uint32_t b_key = ((const Property*)b)->key; + + if (a_key < b_key) { + return -1; + } + + if (b_key < a_key) { + return 1; + } + + return 0; +} + +static int +value_cmp(const void* a, const void* b) +{ + return strcmp(((const PortValue*)a)->symbol, ((const PortValue*)b)->symbol); +} + +static void +path_rel_free(void* ptr) +{ + free(((PathMap*)ptr)->abs); + free(((PathMap*)ptr)->rel); + free(ptr); +} + +static PortValue* +append_port_value(LilvState* state, + const char* port_symbol, + const void* value, + uint32_t size, + uint32_t type) +{ + PortValue* pv = NULL; + if (value) { + state->values = (PortValue*)realloc( + state->values, (++state->n_values) * sizeof(PortValue)); + + pv = &state->values[state->n_values - 1]; + pv->symbol = lilv_strdup(port_symbol); + pv->atom = (LV2_Atom*)malloc(sizeof(LV2_Atom) + size); + pv->atom->size = size; + pv->atom->type = type; + memcpy(pv->atom + 1, value, size); + } + return pv; +} + +static const char* +lilv_state_rel2abs(const LilvState* state, const char* path) +{ + ZixTreeIter* iter = NULL; + const PathMap key = {NULL, (char*)path}; + if (state->rel2abs && !zix_tree_find(state->rel2abs, &key, &iter)) { + return ((const PathMap*)zix_tree_get(iter))->abs; + } + return path; +} + +static void +append_property(LilvState* state, + PropertyArray* array, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags) +{ + array->props = + (Property*)realloc(array->props, (++array->n) * sizeof(Property)); + + Property* const prop = &array->props[array->n - 1]; + if ((flags & LV2_STATE_IS_POD) || type == state->atom_Path) { + prop->value = malloc(size); + memcpy(prop->value, value, size); + } else { + prop->value = (void*)value; + } + + prop->size = size; + prop->key = key; + prop->type = type; + prop->flags = flags; +} + +static const Property* +find_property(const LilvState* const state, const uint32_t key) +{ + if (!state->props.props) { + return NULL; + } + + const Property search_key = {NULL, 0, key, 0, 0}; + + return (const Property*)bsearch(&search_key, + state->props.props, + state->props.n, + sizeof(Property), + property_cmp); +} + +static LV2_State_Status +store_callback(LV2_State_Handle handle, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags) +{ + LilvState* const state = (LilvState*)handle; + + if (!key) { + return LV2_STATE_ERR_UNKNOWN; // TODO: Add status for bad arguments + } + + if (find_property((const LilvState*)handle, key)) { + return LV2_STATE_ERR_UNKNOWN; // TODO: Add status for duplicate keys + } + + append_property(state, &state->props, key, value, size, type, flags); + return LV2_STATE_SUCCESS; +} + +static const void* +retrieve_callback(LV2_State_Handle handle, + uint32_t key, + size_t* size, + uint32_t* type, + uint32_t* flags) +{ + const Property* const prop = find_property((const LilvState*)handle, key); + + if (prop) { + *size = prop->size; + *type = prop->type; + *flags = prop->flags; + return prop->value; + } + return NULL; +} + +static bool +path_exists(const char* path, const void* ignored) +{ + (void)ignored; + + return lilv_path_exists(path); +} + +static bool +lilv_state_has_path(const char* path, const void* state) +{ + return lilv_state_rel2abs((const LilvState*)state, path) != path; +} + +static char* +make_path(LV2_State_Make_Path_Handle handle, const char* path) +{ + LilvState* state = (LilvState*)handle; + lilv_create_directories(state->dir); + + return lilv_path_join(state->dir, path); +} + +static char* +abstract_path(LV2_State_Map_Path_Handle handle, const char* abs_path) +{ + LilvState* state = (LilvState*)handle; + char* path = NULL; + char* real_path = lilv_path_canonical(abs_path); + const PathMap key = {real_path, NULL}; + ZixTreeIter* iter = NULL; + + if (abs_path[0] == '\0') { + return lilv_strdup(abs_path); + } + + if (!zix_tree_find(state->abs2rel, &key, &iter)) { + // Already mapped path in a previous call + PathMap* pm = (PathMap*)zix_tree_get(iter); + free(real_path); + return lilv_strdup(pm->rel); + } + + if (lilv_path_is_child(real_path, state->dir)) { + // File in state directory (loaded, or created by plugin during save) + path = lilv_path_relative_to(real_path, state->dir); + } else if (lilv_path_is_child(real_path, state->scratch_dir)) { + // File created by plugin earlier + path = lilv_path_relative_to(real_path, state->scratch_dir); + if (state->copy_dir) { + int st = lilv_create_directories(state->copy_dir); + if (st) { + LILV_ERRORF( + "Error creating directory %s (%s)\n", state->copy_dir, strerror(st)); + } + + char* cpath = lilv_path_join(state->copy_dir, path); + char* copy = lilv_get_latest_copy(real_path, cpath); + if (!copy || !lilv_file_equals(real_path, copy)) { + // No recent enough copy, make a new one + free(copy); + copy = lilv_find_free_path(cpath, path_exists, NULL); + if ((st = lilv_copy_file(real_path, copy))) { + LILV_ERRORF("Error copying state file %s (%s)\n", copy, strerror(st)); + } + } + free(real_path); + free(cpath); + + // Refer to the latest copy in plugin state + real_path = copy; + } + } else if (state->link_dir) { + // New path outside state directory, make a link + char* const name = lilv_path_filename(real_path); + + // Find a free name in the (virtual) state directory + path = lilv_find_free_path(name, lilv_state_has_path, state); + + free(name); + } else { + // No link directory, preserve absolute path + path = lilv_strdup(abs_path); + } + + // Add record to path mapping + PathMap* pm = (PathMap*)malloc(sizeof(PathMap)); + pm->abs = real_path; + pm->rel = lilv_strdup(path); + zix_tree_insert(state->abs2rel, pm, NULL); + zix_tree_insert(state->rel2abs, pm, NULL); + + return path; +} + +static char* +absolute_path(LV2_State_Map_Path_Handle handle, const char* state_path) +{ + LilvState* state = (LilvState*)handle; + char* path = NULL; + if (lilv_path_is_absolute(state_path)) { + // Absolute path, return identical path + path = lilv_strdup(state_path); + } else if (state->dir) { + // Relative path inside state directory + path = lilv_path_join(state->dir, state_path); + } else { + // State has not been saved, unmap + path = lilv_strdup(lilv_state_rel2abs(state, state_path)); + } + + return path; +} + +/** Return a new features array with built-in features added to `features`. */ +static const LV2_Feature** +add_features(const LV2_Feature* const* features, + const LV2_Feature* map, + const LV2_Feature* make, + const LV2_Feature* free) +{ + size_t n_features = 0; + for (; features && features[n_features]; ++n_features) { + } + + const LV2_Feature** ret = + (const LV2_Feature**)calloc(n_features + 4, sizeof(LV2_Feature*)); + + if (features) { + memcpy(ret, features, n_features * sizeof(LV2_Feature*)); + } + + size_t i = n_features; + if (map) { + ret[i++] = map; + } + if (make) { + ret[i++] = make; + } + if (free) { + ret[i++] = free; + } + + return ret; +} + +/// Return the canonical path for a directory with a trailing separator +static char* +real_dir(const char* path) +{ + char* abs_path = lilv_path_canonical(path); + char* base = lilv_path_join(abs_path, NULL); + free(abs_path); + return base; +} + +static const char* +state_strerror(LV2_State_Status st) +{ + switch (st) { + case LV2_STATE_SUCCESS: + return "Completed successfully"; + case LV2_STATE_ERR_BAD_TYPE: + return "Unsupported type"; + case LV2_STATE_ERR_BAD_FLAGS: + return "Unsupported flags"; + case LV2_STATE_ERR_NO_FEATURE: + return "Missing features"; + case LV2_STATE_ERR_NO_PROPERTY: + return "Missing property"; + default: + return "Unknown error"; + } +} + +static void +lilv_free_path(LV2_State_Free_Path_Handle handle, char* path) +{ + (void)handle; + + lilv_free(path); +} + +LilvState* +lilv_state_new_from_instance(const LilvPlugin* plugin, + LilvInstance* instance, + LV2_URID_Map* map, + const char* scratch_dir, + const char* copy_dir, + const char* link_dir, + const char* save_dir, + LilvGetPortValueFunc get_value, + void* user_data, + uint32_t flags, + const LV2_Feature* const* features) +{ + const LV2_Feature** sfeatures = NULL; + LilvWorld* const world = plugin->world; + LilvState* const state = (LilvState*)calloc(1, sizeof(LilvState)); + state->plugin_uri = lilv_node_duplicate(lilv_plugin_get_uri(plugin)); + state->abs2rel = zix_tree_new(false, abs_cmp, NULL, path_rel_free); + state->rel2abs = zix_tree_new(false, rel_cmp, NULL, NULL); + state->scratch_dir = scratch_dir ? real_dir(scratch_dir) : NULL; + state->copy_dir = copy_dir ? real_dir(copy_dir) : NULL; + state->link_dir = link_dir ? real_dir(link_dir) : NULL; + state->dir = save_dir ? real_dir(save_dir) : NULL; + state->atom_Path = map->map(map->handle, LV2_ATOM__Path); + + LV2_State_Map_Path pmap = {state, abstract_path, absolute_path}; + LV2_Feature pmap_feature = {LV2_STATE__mapPath, &pmap}; + LV2_State_Make_Path pmake = {state, make_path}; + LV2_Feature pmake_feature = {LV2_STATE__makePath, &pmake}; + LV2_State_Free_Path pfree = {NULL, lilv_free_path}; + LV2_Feature pfree_feature = {LV2_STATE__freePath, &pfree}; + features = sfeatures = add_features( + features, &pmap_feature, save_dir ? &pmake_feature : NULL, &pfree_feature); + + // Store port values + if (get_value) { + LilvNode* lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT); + LilvNode* lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT); + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + const LilvPort* const port = plugin->ports[i]; + if (lilv_port_is_a(plugin, port, lv2_ControlPort) && + lilv_port_is_a(plugin, port, lv2_InputPort)) { + uint32_t size = 0; + uint32_t type = 0; + const char* sym = lilv_node_as_string(port->symbol); + const void* value = get_value(sym, user_data, &size, &type); + append_port_value(state, sym, value, size, type); + } + } + lilv_node_free(lv2_ControlPort); + lilv_node_free(lv2_InputPort); + } + + // Store properties + const LV2_Descriptor* desc = instance->lv2_descriptor; + const LV2_State_Interface* iface = + (desc->extension_data) + ? (const LV2_State_Interface*)desc->extension_data(LV2_STATE__interface) + : NULL; + + if (iface) { + LV2_State_Status st = + iface->save(instance->lv2_handle, store_callback, state, flags, features); + if (st) { + LILV_ERRORF("Error saving plugin state: %s\n", state_strerror(st)); + free(state->props.props); + state->props.props = NULL; + state->props.n = 0; + } else { + qsort(state->props.props, state->props.n, sizeof(Property), property_cmp); + } + } + + if (state->values) { + qsort(state->values, state->n_values, sizeof(PortValue), value_cmp); + } + + free(sfeatures); + return state; +} + +void +lilv_state_emit_port_values(const LilvState* state, + LilvSetPortValueFunc set_value, + void* user_data) +{ + for (uint32_t i = 0; i < state->n_values; ++i) { + const PortValue* value = &state->values[i]; + const LV2_Atom* atom = value->atom; + set_value(value->symbol, user_data, atom + 1, atom->size, atom->type); + } +} + +void +lilv_state_restore(const LilvState* state, + LilvInstance* instance, + LilvSetPortValueFunc set_value, + void* user_data, + uint32_t flags, + const LV2_Feature* const* features) +{ + if (!state) { + LILV_ERROR("lilv_state_restore() called on NULL state\n"); + return; + } + + LV2_State_Map_Path map_path = { + (LilvState*)state, abstract_path, absolute_path}; + LV2_Feature map_feature = {LV2_STATE__mapPath, &map_path}; + + LV2_State_Free_Path free_path = {NULL, lilv_free_path}; + LV2_Feature free_feature = {LV2_STATE__freePath, &free_path}; + + if (instance) { + const LV2_Descriptor* desc = instance->lv2_descriptor; + if (desc->extension_data) { + const LV2_State_Interface* iface = + (const LV2_State_Interface*)desc->extension_data(LV2_STATE__interface); + + if (iface && iface->restore) { + const LV2_Feature** sfeatures = + add_features(features, &map_feature, NULL, &free_feature); + + iface->restore(instance->lv2_handle, + retrieve_callback, + (LV2_State_Handle)state, + flags, + sfeatures); + + free(sfeatures); + } + } + } + + if (set_value) { + lilv_state_emit_port_values(state, set_value, user_data); + } +} + +static void +set_state_dir_from_model(LilvState* state, const SordNode* graph) +{ + if (!state->dir && graph) { + const char* uri = (const char*)sord_node_get_string(graph); + char* path = lilv_file_uri_parse(uri, NULL); + + state->dir = lilv_path_join(path, NULL); + free(path); + } + assert(!state->dir || lilv_path_is_absolute(state->dir)); +} + +static LilvState* +new_state_from_model(LilvWorld* world, + LV2_URID_Map* map, + SordModel* model, + const SordNode* node, + const char* dir) +{ + // Check that we know at least something about this state subject + if (!sord_ask(model, node, 0, 0, 0)) { + return NULL; + } + + // Allocate state + LilvState* const state = (LilvState*)calloc(1, sizeof(LilvState)); + state->dir = lilv_path_join(dir, NULL); + state->atom_Path = map->map(map->handle, LV2_ATOM__Path); + state->uri = lilv_node_new_from_node(world, node); + + // Get the plugin URI this state applies to + SordIter* i = sord_search(model, node, world->uris.lv2_appliesTo, 0, 0); + if (i) { + const SordNode* object = sord_iter_get_node(i, SORD_OBJECT); + const SordNode* graph = sord_iter_get_node(i, SORD_GRAPH); + state->plugin_uri = lilv_node_new_from_node(world, object); + set_state_dir_from_model(state, graph); + sord_iter_free(i); + } else if (sord_ask( + model, node, world->uris.rdf_a, world->uris.lv2_Plugin, 0)) { + // Loading plugin description as state (default state) + state->plugin_uri = lilv_node_new_from_node(world, node); + } else { + LILV_ERRORF("State %s missing lv2:appliesTo property\n", + sord_node_get_string(node)); + } + + // Get the state label + i = sord_search(model, node, world->uris.rdfs_label, NULL, NULL); + if (i) { + const SordNode* object = sord_iter_get_node(i, SORD_OBJECT); + const SordNode* graph = sord_iter_get_node(i, SORD_GRAPH); + state->label = lilv_strdup((const char*)sord_node_get_string(object)); + set_state_dir_from_model(state, graph); + sord_iter_free(i); + } + + Sratom* sratom = sratom_new(map); + SerdChunk chunk = {NULL, 0}; + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, map); + lv2_atom_forge_set_sink( + &forge, sratom_forge_sink, sratom_forge_deref, &chunk); + + // Get port values + SordIter* ports = sord_search(model, node, world->uris.lv2_port, 0, 0); + FOREACH_MATCH (ports) { + const SordNode* port = sord_iter_get_node(ports, SORD_OBJECT); + + SordNode* label = sord_get(model, port, world->uris.rdfs_label, 0, 0); + SordNode* symbol = sord_get(model, port, world->uris.lv2_symbol, 0, 0); + SordNode* value = sord_get(model, port, world->uris.pset_value, 0, 0); + if (!value) { + value = sord_get(model, port, world->uris.lv2_default, 0, 0); + } + if (!symbol) { + LILV_ERRORF("State `%s' port missing symbol.\n", + sord_node_get_string(node)); + } else if (value) { + chunk.len = 0; + sratom_read(sratom, &forge, world->world, model, value); + const LV2_Atom* atom = (const LV2_Atom*)chunk.buf; + + append_port_value(state, + (const char*)sord_node_get_string(symbol), + LV2_ATOM_BODY_CONST(atom), + atom->size, + atom->type); + + if (label) { + lilv_state_set_label(state, (const char*)sord_node_get_string(label)); + } + } + sord_node_free(world->world, value); + sord_node_free(world->world, symbol); + sord_node_free(world->world, label); + } + sord_iter_free(ports); + + // Get properties + SordNode* statep = sord_new_uri(world->world, USTR(LV2_STATE__state)); + SordNode* state_node = sord_get(model, node, statep, NULL, NULL); + if (state_node) { + SordIter* props = sord_search(model, state_node, 0, 0, 0); + FOREACH_MATCH (props) { + const SordNode* p = sord_iter_get_node(props, SORD_PREDICATE); + const SordNode* o = sord_iter_get_node(props, SORD_OBJECT); + const char* key = (const char*)sord_node_get_string(p); + + chunk.len = 0; + lv2_atom_forge_set_sink( + &forge, sratom_forge_sink, sratom_forge_deref, &chunk); + + sratom_read(sratom, &forge, world->world, model, o); + const LV2_Atom* atom = (const LV2_Atom*)chunk.buf; + uint32_t flags = LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE; + Property prop = {NULL, 0, 0, 0, flags}; + + prop.key = map->map(map->handle, key); + prop.type = atom->type; + prop.size = atom->size; + prop.value = malloc(atom->size); + memcpy(prop.value, LV2_ATOM_BODY_CONST(atom), atom->size); + if (atom->type == forge.Path) { + prop.flags = LV2_STATE_IS_POD; + } + + if (prop.value) { + state->props.props = (Property*)realloc( + state->props.props, (++state->props.n) * sizeof(Property)); + state->props.props[state->props.n - 1] = prop; + } + } + sord_iter_free(props); + } + sord_node_free(world->world, state_node); + sord_node_free(world->world, statep); + + serd_free((void*)chunk.buf); + sratom_free(sratom); + + if (state->props.props) { + qsort(state->props.props, state->props.n, sizeof(Property), property_cmp); + } + if (state->values) { + qsort(state->values, state->n_values, sizeof(PortValue), value_cmp); + } + + return state; +} + +LilvState* +lilv_state_new_from_world(LilvWorld* world, + LV2_URID_Map* map, + const LilvNode* node) +{ + if (!lilv_node_is_uri(node) && !lilv_node_is_blank(node)) { + LILV_ERRORF("Subject `%s' is not a URI or blank node.\n", + lilv_node_as_string(node)); + return NULL; + } + + return new_state_from_model(world, map, world->model, node->node, NULL); +} + +LilvState* +lilv_state_new_from_file(LilvWorld* world, + LV2_URID_Map* map, + const LilvNode* subject, + const char* path) +{ + if (subject && !lilv_node_is_uri(subject) && !lilv_node_is_blank(subject)) { + LILV_ERRORF("Subject `%s' is not a URI or blank node.\n", + lilv_node_as_string(subject)); + return NULL; + } + + uint8_t* abs_path = (uint8_t*)lilv_path_absolute(path); + SerdNode node = serd_node_new_file_uri(abs_path, NULL, NULL, true); + SerdEnv* env = serd_env_new(&node); + SordModel* model = sord_new(world->world, SORD_SPO, false); + SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL); + + serd_reader_read_file(reader, node.buf); + + SordNode* subject_node = + (subject) ? subject->node + : sord_node_from_serd_node(world->world, env, &node, NULL, NULL); + + char* dirname = lilv_path_parent(path); + char* real_path = lilv_path_canonical(dirname); + char* dir_path = lilv_path_join(real_path, NULL); + LilvState* state = + new_state_from_model(world, map, model, subject_node, dir_path); + free(dir_path); + free(real_path); + free(dirname); + + serd_node_free(&node); + free(abs_path); + serd_reader_free(reader); + sord_free(model); + serd_env_free(env); + return state; +} + +static void +set_prefixes(SerdEnv* env) +{ +#define SET_PSET(e, p, u) serd_env_set_prefix_from_strings(e, p, u) + SET_PSET(env, USTR("atom"), USTR(LV2_ATOM_PREFIX)); + SET_PSET(env, USTR("lv2"), USTR(LV2_CORE_PREFIX)); + SET_PSET(env, USTR("pset"), USTR(LV2_PRESETS_PREFIX)); + SET_PSET(env, USTR("rdf"), USTR(LILV_NS_RDF)); + SET_PSET(env, USTR("rdfs"), USTR(LILV_NS_RDFS)); + SET_PSET(env, USTR("state"), USTR(LV2_STATE_PREFIX)); + SET_PSET(env, USTR("xsd"), USTR(LILV_NS_XSD)); +} + +LilvState* +lilv_state_new_from_string(LilvWorld* world, LV2_URID_Map* map, const char* str) +{ + if (!str) { + return NULL; + } + + SerdNode base = SERD_NODE_NULL; + SerdEnv* env = serd_env_new(&base); + SordModel* model = sord_new(world->world, SORD_SPO | SORD_OPS, false); + SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL); + + set_prefixes(env); + serd_reader_read_string(reader, USTR(str)); + + SordNode* o = sord_new_uri(world->world, USTR(LV2_PRESETS__Preset)); + SordNode* s = sord_get(model, NULL, world->uris.rdf_a, o, NULL); + + LilvState* state = new_state_from_model(world, map, model, s, NULL); + + sord_node_free(world->world, s); + sord_node_free(world->world, o); + serd_reader_free(reader); + sord_free(model); + serd_env_free(env); + + return state; +} + +static SerdWriter* +ttl_writer(SerdSink sink, void* stream, const SerdNode* base, SerdEnv** new_env) +{ + SerdURI base_uri = SERD_URI_NULL; + if (base && base->buf) { + serd_uri_parse(base->buf, &base_uri); + } + + SerdEnv* env = *new_env ? *new_env : serd_env_new(base); + set_prefixes(env); + + SerdWriter* writer = + serd_writer_new(SERD_TURTLE, + (SerdStyle)(SERD_STYLE_RESOLVED | SERD_STYLE_ABBREVIATED | + SERD_STYLE_CURIED), + env, + &base_uri, + sink, + stream); + + if (!*new_env) { + *new_env = env; + } + + return writer; +} + +static SerdWriter* +ttl_file_writer(FILE* fd, const SerdNode* node, SerdEnv** env) +{ + SerdWriter* writer = ttl_writer(serd_file_sink, fd, node, env); + + fseek(fd, 0, SEEK_END); + if (ftell(fd) == 0) { + serd_env_foreach(*env, (SerdPrefixSink)serd_writer_set_prefix, writer); + } else { + fprintf(fd, "\n"); + } + + return writer; +} + +static void +add_to_model(SordWorld* world, + SerdEnv* env, + SordModel* model, + const SerdNode s, + const SerdNode p, + const SerdNode o) +{ + SordNode* ss = sord_node_from_serd_node(world, env, &s, NULL, NULL); + SordNode* sp = sord_node_from_serd_node(world, env, &p, NULL, NULL); + SordNode* so = sord_node_from_serd_node(world, env, &o, NULL, NULL); + + SordQuad quad = {ss, sp, so, NULL}; + sord_add(model, quad); + + sord_node_free(world, ss); + sord_node_free(world, sp); + sord_node_free(world, so); +} + +static void +remove_manifest_entry(SordWorld* world, SordModel* model, const char* subject) +{ + SordNode* s = sord_new_uri(world, USTR(subject)); + SordIter* i = sord_search(model, s, NULL, NULL, NULL); + while (!sord_iter_end(i)) { + sord_erase(model, i); + } + sord_iter_free(i); + sord_node_free(world, s); +} + +static int +write_manifest(LilvWorld* world, + SerdEnv* env, + SordModel* model, + const SerdNode* file_uri) +{ + (void)world; + + char* const path = (char*)serd_file_uri_parse(file_uri->buf, NULL); + FILE* const wfd = fopen(path, "w"); + if (!wfd) { + LILV_ERRORF("Failed to open %s for writing (%s)\n", path, strerror(errno)); + + serd_free(path); + return 1; + } + + SerdWriter* writer = ttl_file_writer(wfd, file_uri, &env); + sord_write(model, writer, NULL); + serd_writer_free(writer); + fclose(wfd); + serd_free(path); + return 0; +} + +static int +add_state_to_manifest(LilvWorld* lworld, + const LilvNode* plugin_uri, + const char* manifest_path, + const char* state_uri, + const char* state_path) +{ + SordWorld* world = lworld->world; + SerdNode manifest = serd_node_new_file_uri(USTR(manifest_path), 0, 0, 1); + SerdNode file = serd_node_new_file_uri(USTR(state_path), 0, 0, 1); + SerdEnv* env = serd_env_new(&manifest); + SordModel* model = sord_new(world, SORD_SPO, false); + + if (lilv_path_exists(manifest_path)) { + // Read manifest into model + SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL); + SerdStatus st = serd_reader_read_file(reader, manifest.buf); + if (st) { + LILV_WARNF("Failed to read manifest (%s)\n", serd_strerror(st)); + } + serd_reader_free(reader); + } + + // Choose state URI (use file URI if not given) + if (!state_uri) { + state_uri = (const char*)file.buf; + } + + // Remove any existing manifest entries for this state + remove_manifest_entry(world, model, state_uri); + + // Add manifest entry for this state to model + SerdNode s = serd_node_from_string(SERD_URI, USTR(state_uri)); + + // a pset:Preset + add_to_model(world, + env, + model, + s, + serd_node_from_string(SERD_URI, USTR(LILV_NS_RDF "type")), + serd_node_from_string(SERD_URI, USTR(LV2_PRESETS__Preset))); + + // a pset:Preset + add_to_model(world, + env, + model, + s, + serd_node_from_string(SERD_URI, USTR(LILV_NS_RDF "type")), + serd_node_from_string(SERD_URI, USTR(LV2_PRESETS__Preset))); + + // rdfs:seeAlso + add_to_model(world, + env, + model, + s, + serd_node_from_string(SERD_URI, USTR(LILV_NS_RDFS "seeAlso")), + file); + + // lv2:appliesTo + add_to_model( + world, + env, + model, + s, + serd_node_from_string(SERD_URI, USTR(LV2_CORE__appliesTo)), + serd_node_from_string(SERD_URI, USTR(lilv_node_as_string(plugin_uri)))); + + /* Re-open manifest for locked writing. We need to do this because it may + need to be truncated, and the file can only be open once on Windows. */ + + FILE* wfd = fopen(manifest_path, "wb"); + int r = 0; + if (!wfd) { + LILV_ERRORF( + "Failed to open %s for writing (%s)\n", manifest_path, strerror(errno)); + r = 1; + } + + SerdWriter* writer = ttl_file_writer(wfd, &manifest, &env); + lilv_flock(wfd, true, true); + sord_write(model, writer, NULL); + lilv_flock(wfd, false, true); + serd_writer_free(writer); + fclose(wfd); + + sord_free(model); + serd_node_free(&file); + serd_node_free(&manifest); + serd_env_free(env); + + return r; +} + +static bool +link_exists(const char* path, const void* data) +{ + const char* target = (const char*)data; + if (!lilv_path_exists(path)) { + return false; + } + char* real_path = lilv_path_canonical(path); + bool matches = !strcmp(real_path, target); + free(real_path); + return !matches; +} + +static int +maybe_symlink(const char* oldpath, const char* newpath) +{ + if (link_exists(newpath, oldpath)) { + return 0; + } + + const int st = lilv_symlink(oldpath, newpath); + if (st) { + LILV_ERRORF( + "Failed to link %s => %s (%s)\n", newpath, oldpath, strerror(errno)); + } + + return st; +} + +static void +write_property_array(const LilvState* state, + const PropertyArray* array, + Sratom* sratom, + uint32_t flags, + const SerdNode* subject, + LV2_URID_Unmap* unmap, + const char* dir) +{ + for (uint32_t i = 0; i < array->n; ++i) { + Property* prop = &array->props[i]; + const char* key = unmap->unmap(unmap->handle, prop->key); + + const SerdNode p = serd_node_from_string(SERD_URI, USTR(key)); + if (prop->type == state->atom_Path && !dir) { + const char* path = (const char*)prop->value; + const char* abs_path = lilv_state_rel2abs(state, path); + LILV_WARNF("Writing absolute path %s\n", abs_path); + sratom_write(sratom, + unmap, + flags, + subject, + &p, + prop->type, + strlen(abs_path) + 1, + abs_path); + } else if (prop->flags & LV2_STATE_IS_POD || + prop->type == state->atom_Path) { + sratom_write( + sratom, unmap, flags, subject, &p, prop->type, prop->size, prop->value); + } else { + LILV_WARNF("Lost non-POD property <%s> on save\n", key); + } + } +} + +static int +lilv_state_write(LilvWorld* world, + LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + const LilvState* state, + SerdWriter* writer, + const char* uri, + const char* dir) +{ + (void)world; + + SerdNode lv2_appliesTo = + serd_node_from_string(SERD_CURIE, USTR("lv2:appliesTo")); + + const SerdNode* plugin_uri = sord_node_to_serd_node(state->plugin_uri->node); + + SerdNode subject = serd_node_from_string(SERD_URI, USTR(uri ? uri : "")); + + // a pset:Preset + SerdNode p = serd_node_from_string(SERD_URI, USTR(LILV_NS_RDF "type")); + + SerdNode o = serd_node_from_string(SERD_URI, USTR(LV2_PRESETS__Preset)); + serd_writer_write_statement(writer, 0, NULL, &subject, &p, &o, NULL, NULL); + + // lv2:appliesTo + serd_writer_write_statement( + writer, 0, NULL, &subject, &lv2_appliesTo, plugin_uri, NULL, NULL); + + // rdfs:label label + if (state->label) { + p = serd_node_from_string(SERD_URI, USTR(LILV_NS_RDFS "label")); + o = serd_node_from_string(SERD_LITERAL, USTR(state->label)); + serd_writer_write_statement(writer, 0, NULL, &subject, &p, &o, NULL, NULL); + } + + SerdEnv* env = serd_writer_get_env(writer); + const SerdNode* base = serd_env_get_base_uri(env, NULL); + + Sratom* sratom = sratom_new(map); + sratom_set_sink(sratom, + (const char*)base->buf, + (SerdStatementSink)serd_writer_write_statement, + (SerdEndSink)serd_writer_end_anon, + writer); + + // Write metadata + sratom_set_pretty_numbers(sratom, false); // Use precise types + write_property_array( + state, &state->metadata, sratom, 0, &subject, unmap, dir); + + // Write port values + sratom_set_pretty_numbers(sratom, true); // Use pretty numbers + for (uint32_t i = 0; i < state->n_values; ++i) { + PortValue* const value = &state->values[i]; + + const SerdNode port = + serd_node_from_string(SERD_BLANK, USTR(value->symbol)); + + // <> lv2:port _:symbol + p = serd_node_from_string(SERD_URI, USTR(LV2_CORE__port)); + serd_writer_write_statement( + writer, SERD_ANON_O_BEGIN, NULL, &subject, &p, &port, NULL, NULL); + + // _:symbol lv2:symbol "symbol" + p = serd_node_from_string(SERD_URI, USTR(LV2_CORE__symbol)); + o = serd_node_from_string(SERD_LITERAL, USTR(value->symbol)); + serd_writer_write_statement( + writer, SERD_ANON_CONT, NULL, &port, &p, &o, NULL, NULL); + + // _:symbol pset:value value + p = serd_node_from_string(SERD_URI, USTR(LV2_PRESETS__value)); + sratom_write(sratom, + unmap, + SERD_ANON_CONT, + &port, + &p, + value->atom->type, + value->atom->size, + value->atom + 1); + + serd_writer_end_anon(writer, &port); + } + + // Write properties + const SerdNode body = serd_node_from_string(SERD_BLANK, USTR("body")); + if (state->props.n > 0) { + p = serd_node_from_string(SERD_URI, USTR(LV2_STATE__state)); + serd_writer_write_statement( + writer, SERD_ANON_O_BEGIN, NULL, &subject, &p, &body, NULL, NULL); + } + sratom_set_pretty_numbers(sratom, false); // Use precise types + write_property_array( + state, &state->props, sratom, SERD_ANON_CONT, &body, unmap, dir); + + if (state->props.n > 0) { + serd_writer_end_anon(writer, &body); + } + + sratom_free(sratom); + return 0; +} + +static void +lilv_state_make_links(const LilvState* state, const char* dir) +{ + // Create symlinks to files + for (ZixTreeIter* i = zix_tree_begin(state->abs2rel); + i != zix_tree_end(state->abs2rel); + i = zix_tree_iter_next(i)) { + const PathMap* pm = (const PathMap*)zix_tree_get(i); + + char* path = lilv_path_absolute_child(pm->rel, dir); + if (lilv_path_is_child(pm->abs, state->copy_dir) && + strcmp(state->copy_dir, dir)) { + // Link directly to snapshot in the copy directory + maybe_symlink(pm->abs, path); + } else if (!lilv_path_is_child(pm->abs, dir)) { + const char* link_dir = state->link_dir ? state->link_dir : dir; + char* pat = lilv_path_absolute_child(pm->rel, link_dir); + if (!strcmp(dir, link_dir)) { + // Link directory is save directory, make link at exact path + remove(pat); + maybe_symlink(pm->abs, pat); + } else { + // Make a link in the link directory to external file + char* lpath = lilv_find_free_path(pat, link_exists, pm->abs); + if (!lilv_path_exists(lpath)) { + if (lilv_symlink(pm->abs, lpath)) { + LILV_ERRORF("Failed to link %s => %s (%s)\n", + pm->abs, + lpath, + strerror(errno)); + } + } + + // Make a link in the save directory to the external link + char* target = lilv_path_relative_to(lpath, dir); + maybe_symlink(lpath, path); + free(target); + free(lpath); + } + free(pat); + } + free(path); + } +} + +int +lilv_state_save(LilvWorld* world, + LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + const LilvState* state, + const char* uri, + const char* dir, + const char* filename) +{ + if (!filename || !dir || lilv_create_directories(dir)) { + return 1; + } + + char* abs_dir = real_dir(dir); + char* const path = lilv_path_join(abs_dir, filename); + FILE* fd = fopen(path, "w"); + if (!fd) { + LILV_ERRORF("Failed to open %s (%s)\n", path, strerror(errno)); + free(abs_dir); + free(path); + return 4; + } + + // Create symlinks to files if necessary + lilv_state_make_links(state, abs_dir); + + // Write state to Turtle file + SerdNode file = serd_node_new_file_uri(USTR(path), NULL, NULL, true); + SerdNode node = uri ? serd_node_from_string(SERD_URI, USTR(uri)) : file; + SerdEnv* env = NULL; + SerdWriter* ttl = ttl_file_writer(fd, &file, &env); + int ret = + lilv_state_write(world, map, unmap, state, ttl, (const char*)node.buf, dir); + + // Set saved dir and uri (FIXME: const violation) + free(state->dir); + lilv_node_free(state->uri); + ((LilvState*)state)->dir = lilv_strdup(abs_dir); + ((LilvState*)state)->uri = lilv_new_uri(world, (const char*)node.buf); + + serd_node_free(&file); + serd_writer_free(ttl); + serd_env_free(env); + fclose(fd); + + // Add entry to manifest + if (!ret) { + char* const manifest = lilv_path_join(abs_dir, "manifest.ttl"); + + ret = add_state_to_manifest(world, state->plugin_uri, manifest, uri, path); + + free(manifest); + } + + free(abs_dir); + free(path); + return ret; +} + +char* +lilv_state_to_string(LilvWorld* world, + LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + const LilvState* state, + const char* uri, + const char* base_uri) +{ + if (!uri) { + LILV_ERROR("Attempt to serialise state with no URI\n"); + return NULL; + } + + SerdChunk chunk = {NULL, 0}; + SerdEnv* env = NULL; + SerdNode base = serd_node_from_string(SERD_URI, USTR(base_uri)); + SerdWriter* writer = ttl_writer(serd_chunk_sink, &chunk, &base, &env); + + lilv_state_write(world, map, unmap, state, writer, uri, NULL); + + serd_writer_free(writer); + serd_env_free(env); + char* str = (char*)serd_chunk_sink_finish(&chunk); + char* result = lilv_strdup(str); + serd_free(str); + return result; +} + +static void +try_unlink(const char* state_dir, const char* path) +{ + if (!strncmp(state_dir, path, strlen(state_dir))) { + if (lilv_path_exists(path) && lilv_remove(path)) { + LILV_ERRORF("Failed to remove %s (%s)\n", path, strerror(errno)); + } + } +} + +static char* +get_canonical_path(const LilvNode* const node) +{ + char* const path = lilv_node_get_path(node, NULL); + char* const real_path = lilv_path_canonical(path); + + free(path); + return real_path; +} + +int +lilv_state_delete(LilvWorld* world, const LilvState* state) +{ + if (!state->dir) { + LILV_ERROR("Attempt to delete unsaved state\n"); + return -1; + } + + LilvNode* bundle = lilv_new_file_uri(world, NULL, state->dir); + LilvNode* manifest = lilv_world_get_manifest_uri(world, bundle); + char* manifest_path = get_canonical_path(manifest); + const bool has_manifest = lilv_path_exists(manifest_path); + SordModel* model = sord_new(world->world, SORD_SPO, false); + + if (has_manifest) { + // Read manifest into temporary local model + SerdEnv* env = serd_env_new(sord_node_to_serd_node(manifest->node)); + SerdReader* ttl = sord_new_reader(model, env, SERD_TURTLE, NULL); + serd_reader_read_file(ttl, USTR(manifest_path)); + serd_reader_free(ttl); + serd_env_free(env); + } + + if (state->uri) { + SordNode* file = + sord_get(model, state->uri->node, world->uris.rdfs_seeAlso, NULL, NULL); + if (file) { + // Remove state file + const uint8_t* uri = sord_node_get_string(file); + char* path = (char*)serd_file_uri_parse(uri, NULL); + char* real_path = lilv_path_canonical(path); + if (path) { + try_unlink(state->dir, real_path); + } + serd_free(real_path); + serd_free(path); + } + + // Remove any existing manifest entries for this state + const char* state_uri_str = lilv_node_as_string(state->uri); + remove_manifest_entry(world->world, model, state_uri_str); + remove_manifest_entry(world->world, world->model, state_uri_str); + } + + // Drop bundle from model + lilv_world_unload_bundle(world, bundle); + + if (sord_num_quads(model) == 0) { + // Manifest is empty, attempt to remove bundle entirely + if (has_manifest) { + try_unlink(state->dir, manifest_path); + } + + // Remove all known files from state bundle + if (state->abs2rel) { + // State created from instance, get paths from map + for (ZixTreeIter* i = zix_tree_begin(state->abs2rel); + i != zix_tree_end(state->abs2rel); + i = zix_tree_iter_next(i)) { + const PathMap* pm = (const PathMap*)zix_tree_get(i); + char* path = lilv_path_join(state->dir, pm->rel); + try_unlink(state->dir, path); + free(path); + } + } else { + // State loaded from model, get paths from loaded properties + for (uint32_t i = 0; i < state->props.n; ++i) { + const Property* const p = &state->props.props[i]; + if (p->type == state->atom_Path) { + try_unlink(state->dir, (const char*)p->value); + } + } + } + + if (lilv_remove(state->dir)) { + LILV_ERRORF( + "Failed to remove directory %s (%s)\n", state->dir, strerror(errno)); + } + } else { + // Still something in the manifest, update and reload bundle + const SerdNode* manifest_node = sord_node_to_serd_node(manifest->node); + SerdEnv* env = serd_env_new(manifest_node); + + write_manifest(world, env, model, manifest_node); + lilv_world_load_bundle(world, bundle); + serd_env_free(env); + } + + sord_free(model); + lilv_free(manifest_path); + lilv_node_free(manifest); + lilv_node_free(bundle); + + return 0; +} + +static void +free_property_array(LilvState* state, PropertyArray* array) +{ + for (uint32_t i = 0; i < array->n; ++i) { + Property* prop = &array->props[i]; + if ((prop->flags & LV2_STATE_IS_POD) || prop->type == state->atom_Path) { + free(prop->value); + } + } + free(array->props); +} + +void +lilv_state_free(LilvState* state) +{ + if (state) { + free_property_array(state, &state->props); + free_property_array(state, &state->metadata); + for (uint32_t i = 0; i < state->n_values; ++i) { + free(state->values[i].atom); + free(state->values[i].symbol); + } + lilv_node_free(state->plugin_uri); + lilv_node_free(state->uri); + zix_tree_free(state->abs2rel); + zix_tree_free(state->rel2abs); + free(state->values); + free(state->label); + free(state->dir); + free(state->scratch_dir); + free(state->copy_dir); + free(state->link_dir); + free(state); + } +} + +bool +lilv_state_equals(const LilvState* a, const LilvState* b) +{ + if (!lilv_node_equals(a->plugin_uri, b->plugin_uri) || + (a->label && !b->label) || (b->label && !a->label) || + (a->label && b->label && strcmp(a->label, b->label)) || + a->props.n != b->props.n || a->n_values != b->n_values) { + return false; + } + + for (uint32_t i = 0; i < a->n_values; ++i) { + PortValue* const av = &a->values[i]; + PortValue* const bv = &b->values[i]; + if (av->atom->size != bv->atom->size || av->atom->type != bv->atom->type || + strcmp(av->symbol, bv->symbol) || + memcmp(av->atom + 1, bv->atom + 1, av->atom->size)) { + return false; + } + } + + for (uint32_t i = 0; i < a->props.n; ++i) { + Property* const ap = &a->props.props[i]; + Property* const bp = &b->props.props[i]; + if (ap->key != bp->key || ap->type != bp->type || ap->flags != bp->flags) { + return false; + } + + if (ap->type == a->atom_Path) { + if (!lilv_file_equals(lilv_state_rel2abs(a, (char*)ap->value), + lilv_state_rel2abs(b, (char*)bp->value))) { + return false; + } + } else if (ap->size != bp->size || memcmp(ap->value, bp->value, ap->size)) { + return false; + } + } + + return true; +} + +unsigned +lilv_state_get_num_properties(const LilvState* state) +{ + return state->props.n; +} + +const LilvNode* +lilv_state_get_plugin_uri(const LilvState* state) +{ + return state->plugin_uri; +} + +const LilvNode* +lilv_state_get_uri(const LilvState* state) +{ + return state->uri; +} + +const char* +lilv_state_get_label(const LilvState* state) +{ + return state->label; +} + +void +lilv_state_set_label(LilvState* state, const char* label) +{ + const size_t len = strlen(label); + state->label = (char*)realloc(state->label, len + 1); + memcpy(state->label, label, len + 1); +} + +int +lilv_state_set_metadata(LilvState* state, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags) +{ + append_property(state, &state->metadata, key, value, size, type, flags); + return LV2_STATE_SUCCESS; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,115 @@ +/* + Copyright 2007-2019 David Robillard + + 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. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "zix/tree.h" + +#include +#include +#include +#include + +LilvUI* +lilv_ui_new(LilvWorld* world, + LilvNode* uri, + LilvNode* type_uri, + LilvNode* binary_uri) +{ + assert(uri); + assert(type_uri); + assert(binary_uri); + + LilvUI* ui = (LilvUI*)malloc(sizeof(LilvUI)); + ui->world = world; + ui->uri = uri; + ui->binary_uri = binary_uri; + + // FIXME: kludge + char* bundle = lilv_strdup(lilv_node_as_string(ui->binary_uri)); + char* last_slash = strrchr(bundle, '/') + 1; + *last_slash = '\0'; + ui->bundle_uri = lilv_new_uri(world, bundle); + free(bundle); + + ui->classes = lilv_nodes_new(); + zix_tree_insert((ZixTree*)ui->classes, type_uri, NULL); + + return ui; +} + +void +lilv_ui_free(LilvUI* ui) +{ + lilv_node_free(ui->uri); + lilv_node_free(ui->bundle_uri); + lilv_node_free(ui->binary_uri); + lilv_nodes_free(ui->classes); + free(ui); +} + +const LilvNode* +lilv_ui_get_uri(const LilvUI* ui) +{ + return ui->uri; +} + +unsigned +lilv_ui_is_supported(const LilvUI* ui, + LilvUISupportedFunc supported_func, + const LilvNode* container_type, + const LilvNode** ui_type) +{ + const LilvNodes* classes = lilv_ui_get_classes(ui); + LILV_FOREACH (nodes, c, classes) { + const LilvNode* type = lilv_nodes_get(classes, c); + const unsigned q = + supported_func(lilv_node_as_uri(container_type), lilv_node_as_uri(type)); + if (q) { + if (ui_type) { + *ui_type = type; + } + return q; + } + } + + return 0; +} + +const LilvNodes* +lilv_ui_get_classes(const LilvUI* ui) +{ + return ui->classes; +} + +bool +lilv_ui_is_a(const LilvUI* ui, const LilvNode* class_uri) +{ + return lilv_nodes_contains(ui->classes, class_uri); +} + +const LilvNode* +lilv_ui_get_bundle_uri(const LilvUI* ui) +{ + return ui->bundle_uri; +} + +const LilvNode* +lilv_ui_get_binary_uri(const LilvUI* ui) +{ + return ui->binary_uri; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,291 @@ +/* + Copyright 2007-2019 David Robillard + + 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. +*/ + +#include "filesystem.h" +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "serd/serd.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void +lilv_free(void* ptr) +{ + free(ptr); +} + +char* +lilv_strjoin(const char* first, ...) +{ + size_t len = strlen(first); + char* result = (char*)malloc(len + 1); + + memcpy(result, first, len); + + va_list args; + va_start(args, first); + while (1) { + const char* const s = va_arg(args, const char*); + if (s == NULL) { + break; + } + + const size_t this_len = strlen(s); + char* new_result = (char*)realloc(result, len + this_len + 1); + if (!new_result) { + va_end(args); + free(result); + return NULL; + } + + result = new_result; + memcpy(result + len, s, this_len); + len += this_len; + } + va_end(args); + + result[len] = '\0'; + + return result; +} + +char* +lilv_strdup(const char* str) +{ + if (!str) { + return NULL; + } + + const size_t len = strlen(str); + char* copy = (char*)malloc(len + 1); + memcpy(copy, str, len + 1); + return copy; +} + +const char* +lilv_uri_to_path(const char* uri) +{ +#if defined(__GNUC__) && __GNUC__ > 4 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + + return (const char*)serd_uri_to_path((const uint8_t*)uri); + +#if defined(__GNUC__) && __GNUC__ > 4 +# pragma GCC diagnostic pop +#endif +} + +char* +lilv_file_uri_parse(const char* uri, char** hostname) +{ + return (char*)serd_file_uri_parse((const uint8_t*)uri, (uint8_t**)hostname); +} + +/** Return the current LANG converted to Turtle (i.e. RFC3066) style. + * For example, if LANG is set to "en_CA.utf-8", this returns "en-ca". + */ +char* +lilv_get_lang(void) +{ + const char* const env_lang = getenv("LANG"); + if (!env_lang || !strcmp(env_lang, "") || !strcmp(env_lang, "C") || + !strcmp(env_lang, "POSIX")) { + return NULL; + } + + const size_t env_lang_len = strlen(env_lang); + char* const lang = (char*)malloc(env_lang_len + 1); + for (size_t i = 0; i < env_lang_len + 1; ++i) { + if (env_lang[i] == '_') { + lang[i] = '-'; // Convert _ to - + } else if (env_lang[i] >= 'A' && env_lang[i] <= 'Z') { + lang[i] = env_lang[i] + ('a' - 'A'); // Convert to lowercase + } else if (env_lang[i] >= 'a' && env_lang[i] <= 'z') { + lang[i] = env_lang[i]; // Lowercase letter, copy verbatim + } else if (env_lang[i] >= '0' && env_lang[i] <= '9') { + lang[i] = env_lang[i]; // Digit, copy verbatim + } else if (env_lang[i] == '\0' || env_lang[i] == '.') { + // End, or start of suffix (e.g. en_CA.utf-8), finished + lang[i] = '\0'; + break; + } else { + LILV_ERRORF("Illegal LANG `%s' ignored\n", env_lang); + free(lang); + return NULL; + } + } + + return lang; +} + +#ifndef _WIN32 + +/** Append suffix to dst, update dst_len, and return the realloc'd result. */ +static char* +strappend(char* dst, size_t* dst_len, const char* suffix, size_t suffix_len) +{ + dst = (char*)realloc(dst, *dst_len + suffix_len + 1); + memcpy(dst + *dst_len, suffix, suffix_len); + dst[(*dst_len += suffix_len)] = '\0'; + return dst; +} + +/** Append the value of the environment variable var to dst. */ +static char* +append_var(char* dst, size_t* dst_len, const char* var) +{ + // Get value from environment + const char* val = getenv(var); + if (val) { // Value found, append it + return strappend(dst, dst_len, val, strlen(val)); + } + + // No value found, append variable reference as-is + return strappend(strappend(dst, dst_len, "$", 1), dst_len, var, strlen(var)); +} + +#endif + +/** Expand variables (e.g. POSIX ~ or $FOO, Windows %FOO%) in `path`. */ +char* +lilv_expand(const char* path) +{ +#ifdef _WIN32 + char* out = (char*)malloc(MAX_PATH); + ExpandEnvironmentStrings(path, out, MAX_PATH); +#else + char* out = NULL; + size_t len = 0; + + const char* start = path; // Start of current chunk to copy + for (const char* s = path; *s;) { + if (*s == '$') { + // Hit $ (variable reference, e.g. $VAR_NAME) + for (const char* t = s + 1;; ++t) { + if (!*t || (!isupper(*t) && !isdigit(*t) && *t != '_')) { + // Append preceding chunk + out = strappend(out, &len, start, s - start); + + // Append variable value (or $VAR_NAME if not found) + char* var = (char*)calloc(t - s, 1); + memcpy(var, s + 1, t - s - 1); + out = append_var(out, &len, var); + free(var); + + // Continue after variable reference + start = s = t; + break; + } + } + } else if (*s == '~' && (*(s + 1) == '/' || !*(s + 1))) { + // Hit ~ before slash or end of string (home directory reference) + out = strappend(out, &len, start, s - start); + out = append_var(out, &len, "HOME"); + start = ++s; + } else { + ++s; + } + } + + if (*start) { + out = strappend(out, &len, start, strlen(start)); + } +#endif + + return out; +} + +char* +lilv_find_free_path(const char* in_path, + bool (*exists)(const char*, const void*), + const void* user_data) +{ + const size_t in_path_len = strlen(in_path); + char* path = (char*)malloc(in_path_len + 7); + memcpy(path, in_path, in_path_len + 1); + + for (unsigned i = 2; i < 1000000u; ++i) { + if (!exists(path, user_data)) { + return path; + } + snprintf(path, in_path_len + 7, "%s.%u", in_path, i); + } + + return NULL; +} + +typedef struct { + char* pattern; + time_t time; + char* latest; +} Latest; + +static void +update_latest(const char* path, const char* name, void* data) +{ + Latest* latest = (Latest*)data; + char* entry_path = lilv_path_join(path, name); + unsigned num = 0; + if (sscanf(entry_path, latest->pattern, &num) == 1) { + struct stat st; + if (!stat(entry_path, &st)) { + if (st.st_mtime >= latest->time) { + free(latest->latest); + latest->latest = entry_path; + } + } else { + LILV_ERRORF("stat(%s) (%s)\n", path, strerror(errno)); + } + } + if (entry_path != latest->latest) { + free(entry_path); + } +} + +/** Return the latest copy of the file at `path` that is newer. */ +char* +lilv_get_latest_copy(const char* path, const char* copy_path) +{ + char* copy_dir = lilv_path_parent(copy_path); + Latest latest = {lilv_strjoin(copy_path, ".%u", NULL), 0, NULL}; + + struct stat st; + if (!stat(path, &st)) { + latest.time = st.st_mtime; + } else { + LILV_ERRORF("stat(%s) (%s)\n", path, strerror(errno)); + } + + lilv_dir_for_each(copy_dir, &latest, update_latest); + + free(latest.pattern); + free(copy_dir); + return latest.latest; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1249 @@ +/* + Copyright 2007-2019 David Robillard + + 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. +*/ + +#include "filesystem.h" +#include "lilv_config.h" // IWYU pragma: keep +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "serd/serd.h" +#include "sord/sord.h" +#include "zix/common.h" +#include "zix/tree.h" + +#include "lv2/core/lv2.h" +#include "lv2/presets/presets.h" + +#ifdef LILV_DYN_MANIFEST +# include "lv2/dynmanifest/dynmanifest.h" +#endif + +#include +#include +#include +#include +#include +#include + +static int +lilv_world_drop_graph(LilvWorld* world, const SordNode* graph); + +LilvWorld* +lilv_world_new(void) +{ + LilvWorld* world = (LilvWorld*)calloc(1, sizeof(LilvWorld)); + + world->world = sord_world_new(); + if (!world->world) { + goto fail; + } + + world->model = sord_new(world->world, SORD_SPO | SORD_OPS, true); + if (!world->model) { + goto fail; + } + + world->specs = NULL; + world->plugin_classes = lilv_plugin_classes_new(); + world->plugins = lilv_plugins_new(); + world->zombies = lilv_plugins_new(); + world->loaded_files = zix_tree_new( + false, lilv_resource_node_cmp, NULL, (ZixDestroyFunc)lilv_node_free); + + world->libs = zix_tree_new(false, lilv_lib_compare, NULL, NULL); + +#define NS_DCTERMS "http://purl.org/dc/terms/" +#define NS_DYNMAN "http://lv2plug.in/ns/ext/dynmanifest#" +#define NS_OWL "http://www.w3.org/2002/07/owl#" + +#define NEW_URI(uri) sord_new_uri(world->world, (const uint8_t*)(uri)) + + world->uris.dc_replaces = NEW_URI(NS_DCTERMS "replaces"); + world->uris.dman_DynManifest = NEW_URI(NS_DYNMAN "DynManifest"); + world->uris.doap_name = NEW_URI(LILV_NS_DOAP "name"); + world->uris.lv2_Plugin = NEW_URI(LV2_CORE__Plugin); + world->uris.lv2_Specification = NEW_URI(LV2_CORE__Specification); + world->uris.lv2_appliesTo = NEW_URI(LV2_CORE__appliesTo); + world->uris.lv2_binary = NEW_URI(LV2_CORE__binary); + world->uris.lv2_default = NEW_URI(LV2_CORE__default); + world->uris.lv2_designation = NEW_URI(LV2_CORE__designation); + world->uris.lv2_extensionData = NEW_URI(LV2_CORE__extensionData); + world->uris.lv2_index = NEW_URI(LV2_CORE__index); + world->uris.lv2_latency = NEW_URI(LV2_CORE__latency); + world->uris.lv2_maximum = NEW_URI(LV2_CORE__maximum); + world->uris.lv2_microVersion = NEW_URI(LV2_CORE__microVersion); + world->uris.lv2_minimum = NEW_URI(LV2_CORE__minimum); + world->uris.lv2_minorVersion = NEW_URI(LV2_CORE__minorVersion); + world->uris.lv2_name = NEW_URI(LV2_CORE__name); + world->uris.lv2_optionalFeature = NEW_URI(LV2_CORE__optionalFeature); + world->uris.lv2_port = NEW_URI(LV2_CORE__port); + world->uris.lv2_portProperty = NEW_URI(LV2_CORE__portProperty); + world->uris.lv2_reportsLatency = NEW_URI(LV2_CORE__reportsLatency); + world->uris.lv2_requiredFeature = NEW_URI(LV2_CORE__requiredFeature); + world->uris.lv2_symbol = NEW_URI(LV2_CORE__symbol); + world->uris.lv2_prototype = NEW_URI(LV2_CORE__prototype); + world->uris.owl_Ontology = NEW_URI(NS_OWL "Ontology"); + world->uris.pset_value = NEW_URI(LV2_PRESETS__value); + world->uris.rdf_a = NEW_URI(LILV_NS_RDF "type"); + world->uris.rdf_value = NEW_URI(LILV_NS_RDF "value"); + world->uris.rdfs_Class = NEW_URI(LILV_NS_RDFS "Class"); + world->uris.rdfs_label = NEW_URI(LILV_NS_RDFS "label"); + world->uris.rdfs_seeAlso = NEW_URI(LILV_NS_RDFS "seeAlso"); + world->uris.rdfs_subClassOf = NEW_URI(LILV_NS_RDFS "subClassOf"); + world->uris.xsd_base64Binary = NEW_URI(LILV_NS_XSD "base64Binary"); + world->uris.xsd_boolean = NEW_URI(LILV_NS_XSD "boolean"); + world->uris.xsd_decimal = NEW_URI(LILV_NS_XSD "decimal"); + world->uris.xsd_double = NEW_URI(LILV_NS_XSD "double"); + world->uris.xsd_integer = NEW_URI(LILV_NS_XSD "integer"); + world->uris.null_uri = NULL; + + world->lv2_plugin_class = + lilv_plugin_class_new(world, NULL, world->uris.lv2_Plugin, "Plugin"); + assert(world->lv2_plugin_class); + + world->n_read_files = 0; + world->opt.filter_language = true; + world->opt.dyn_manifest = true; + + return world; + +fail: + /* keep on rockin' in the */ free(world); + return NULL; +} + +void +lilv_world_free(LilvWorld* world) +{ + if (!world) { + return; + } + + lilv_plugin_class_free(world->lv2_plugin_class); + world->lv2_plugin_class = NULL; + + for (SordNode** n = (SordNode**)&world->uris; *n; ++n) { + sord_node_free(world->world, *n); + } + + for (LilvSpec* spec = world->specs; spec;) { + LilvSpec* next = spec->next; + sord_node_free(world->world, spec->spec); + sord_node_free(world->world, spec->bundle); + lilv_nodes_free(spec->data_uris); + free(spec); + spec = next; + } + world->specs = NULL; + + LILV_FOREACH (plugins, i, world->plugins) { + const LilvPlugin* p = lilv_plugins_get(world->plugins, i); + lilv_plugin_free((LilvPlugin*)p); + } + zix_tree_free((ZixTree*)world->plugins); + world->plugins = NULL; + + LILV_FOREACH (plugins, i, world->zombies) { + const LilvPlugin* p = lilv_plugins_get(world->zombies, i); + lilv_plugin_free((LilvPlugin*)p); + } + zix_tree_free((ZixTree*)world->zombies); + world->zombies = NULL; + + zix_tree_free((ZixTree*)world->loaded_files); + world->loaded_files = NULL; + + zix_tree_free(world->libs); + world->libs = NULL; + + zix_tree_free((ZixTree*)world->plugin_classes); + world->plugin_classes = NULL; + + sord_free(world->model); + world->model = NULL; + + sord_world_free(world->world); + world->world = NULL; + + free(world->opt.lv2_path); + free(world); +} + +void +lilv_world_set_option(LilvWorld* world, const char* uri, const LilvNode* value) +{ + if (!strcmp(uri, LILV_OPTION_DYN_MANIFEST)) { + if (lilv_node_is_bool(value)) { + world->opt.dyn_manifest = lilv_node_as_bool(value); + return; + } + } else if (!strcmp(uri, LILV_OPTION_FILTER_LANG)) { + if (lilv_node_is_bool(value)) { + world->opt.filter_language = lilv_node_as_bool(value); + return; + } + } else if (!strcmp(uri, LILV_OPTION_LV2_PATH)) { + if (lilv_node_is_string(value)) { + world->opt.lv2_path = lilv_strdup(lilv_node_as_string(value)); + return; + } + } + LILV_WARNF("Unrecognized or invalid option `%s'\n", uri); +} + +LilvNodes* +lilv_world_find_nodes(LilvWorld* world, + const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object) +{ + if (subject && !lilv_node_is_uri(subject) && !lilv_node_is_blank(subject)) { + LILV_ERRORF("Subject `%s' is not a resource\n", + sord_node_get_string(subject->node)); + return NULL; + } + + if (!predicate) { + LILV_ERROR("Missing required predicate\n"); + return NULL; + } + + if (!lilv_node_is_uri(predicate)) { + LILV_ERRORF("Predicate `%s' is not a URI\n", + sord_node_get_string(predicate->node)); + return NULL; + } + + if (!subject && !object) { + LILV_ERROR("Both subject and object are NULL\n"); + return NULL; + } + + return lilv_world_find_nodes_internal(world, + subject ? subject->node : NULL, + predicate->node, + object ? object->node : NULL); +} + +LilvNode* +lilv_world_get(LilvWorld* world, + const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object) +{ + if (!object) { + // TODO: Improve performance (see lilv_plugin_get_one) + SordIter* stream = sord_search(world->model, + subject ? subject->node : NULL, + predicate ? predicate->node : NULL, + NULL, + NULL); + + LilvNodes* nodes = + lilv_nodes_from_stream_objects(world, stream, SORD_OBJECT); + + if (nodes) { + LilvNode* value = lilv_node_duplicate(lilv_nodes_get_first(nodes)); + lilv_nodes_free(nodes); + return value; + } + + return NULL; + } + + SordNode* snode = sord_get(world->model, + subject ? subject->node : NULL, + predicate ? predicate->node : NULL, + object ? object->node : NULL, + NULL); + LilvNode* lnode = lilv_node_new_from_node(world, snode); + sord_node_free(world->world, snode); + return lnode; +} + +SordIter* +lilv_world_query_internal(LilvWorld* world, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object) +{ + return sord_search(world->model, subject, predicate, object, NULL); +} + +bool +lilv_world_ask_internal(LilvWorld* world, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object) +{ + return sord_ask(world->model, subject, predicate, object, NULL); +} + +bool +lilv_world_ask(LilvWorld* world, + const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object) +{ + return sord_ask(world->model, + subject ? subject->node : NULL, + predicate ? predicate->node : NULL, + object ? object->node : NULL, + NULL); +} + +SordModel* +lilv_world_filter_model(LilvWorld* world, + SordModel* model, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object, + const SordNode* graph) +{ + SordModel* results = sord_new(world->world, SORD_SPO, false); + SordIter* i = sord_search(model, subject, predicate, object, graph); + for (; !sord_iter_end(i); sord_iter_next(i)) { + SordQuad quad; + sord_iter_get(i, quad); + sord_add(results, quad); + } + sord_iter_free(i); + return results; +} + +LilvNodes* +lilv_world_find_nodes_internal(LilvWorld* world, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object) +{ + return lilv_nodes_from_stream_objects( + world, + lilv_world_query_internal(world, subject, predicate, object), + (object == NULL) ? SORD_OBJECT : SORD_SUBJECT); +} + +static SerdNode +lilv_new_uri_relative_to_base(const uint8_t* uri_str, + const uint8_t* base_uri_str) +{ + SerdURI base_uri; + serd_uri_parse(base_uri_str, &base_uri); + return serd_node_new_uri_from_string(uri_str, &base_uri, NULL); +} + +const uint8_t* +lilv_world_blank_node_prefix(LilvWorld* world) +{ + static char str[32]; + snprintf(str, sizeof(str), "%u", world->n_read_files++); + return (const uint8_t*)str; +} + +/** Comparator for sequences (e.g. world->plugins). */ +int +lilv_header_compare_by_uri(const void* a, const void* b, const void* user_data) +{ + (void)user_data; + + const struct LilvHeader* const header_a = (const struct LilvHeader*)a; + const struct LilvHeader* const header_b = (const struct LilvHeader*)b; + + return strcmp(lilv_node_as_uri(header_a->uri), + lilv_node_as_uri(header_b->uri)); +} + +/** + Comparator for libraries (world->libs). + + Libraries do have a LilvHeader, but we must also compare the bundle to + handle the case where the same library is loaded with different bundles, and + consequently different contents (mainly plugins). + */ +int +lilv_lib_compare(const void* a, const void* b, const void* user_data) +{ + (void)user_data; + + const LilvLib* const lib_a = (const LilvLib*)a; + const LilvLib* const lib_b = (const LilvLib*)b; + + const int cmp = + strcmp(lilv_node_as_uri(lib_a->uri), lilv_node_as_uri(lib_b->uri)); + + return cmp ? cmp : strcmp(lib_a->bundle_path, lib_b->bundle_path); +} + +/** Get an element of a collection of any object with an LilvHeader by URI. */ +static ZixTreeIter* +lilv_collection_find_by_uri(const ZixTree* seq, const LilvNode* uri) +{ + ZixTreeIter* i = NULL; + if (lilv_node_is_uri(uri)) { + struct LilvHeader key = {NULL, (LilvNode*)uri}; + zix_tree_find(seq, &key, &i); + } + return i; +} + +/** Get an element of a collection of any object with an LilvHeader by URI. */ +struct LilvHeader* +lilv_collection_get_by_uri(const ZixTree* seq, const LilvNode* uri) +{ + ZixTreeIter* const i = lilv_collection_find_by_uri(seq, uri); + + return i ? (struct LilvHeader*)zix_tree_get(i) : NULL; +} + +static void +lilv_world_add_spec(LilvWorld* world, + const SordNode* specification_node, + const SordNode* bundle_node) +{ + LilvSpec* spec = (LilvSpec*)malloc(sizeof(LilvSpec)); + spec->spec = sord_node_copy(specification_node); + spec->bundle = sord_node_copy(bundle_node); + spec->data_uris = lilv_nodes_new(); + + // Add all data files (rdfs:seeAlso) + SordIter* files = sord_search( + world->model, specification_node, world->uris.rdfs_seeAlso, NULL, NULL); + FOREACH_MATCH (files) { + const SordNode* file_node = sord_iter_get_node(files, SORD_OBJECT); + zix_tree_insert((ZixTree*)spec->data_uris, + lilv_node_new_from_node(world, file_node), + NULL); + } + sord_iter_free(files); + + // Add specification to world specification list + spec->next = world->specs; + world->specs = spec; +} + +static void +lilv_world_add_plugin(LilvWorld* world, + const SordNode* plugin_node, + const LilvNode* manifest_uri, + void* dynmanifest, + const SordNode* bundle) +{ + (void)dynmanifest; + + LilvNode* plugin_uri = lilv_node_new_from_node(world, plugin_node); + ZixTreeIter* z = NULL; + LilvPlugin* plugin = + (LilvPlugin*)lilv_plugins_get_by_uri(world->plugins, plugin_uri); + + if (plugin) { + // Existing plugin, if this is different bundle, ignore it + // (use the first plugin found in LV2_PATH) + const LilvNode* last_bundle = lilv_plugin_get_bundle_uri(plugin); + const char* plugin_uri_str = lilv_node_as_uri(plugin_uri); + if (sord_node_equals(bundle, last_bundle->node)) { + LILV_WARNF("Reloading plugin <%s>\n", plugin_uri_str); + plugin->loaded = false; + lilv_node_free(plugin_uri); + } else { + LILV_WARNF("Duplicate plugin <%s>\n", plugin_uri_str); + LILV_WARNF("... found in %s\n", lilv_node_as_string(last_bundle)); + LILV_WARNF("... and %s (ignored)\n", sord_node_get_string(bundle)); + lilv_node_free(plugin_uri); + return; + } + } else if ((z = lilv_collection_find_by_uri((const ZixTree*)world->zombies, + plugin_uri))) { + // Plugin bundle has been re-loaded, move from zombies to plugins + plugin = (LilvPlugin*)zix_tree_get(z); + zix_tree_remove((ZixTree*)world->zombies, z); + zix_tree_insert((ZixTree*)world->plugins, plugin, NULL); + lilv_node_free(plugin_uri); + lilv_plugin_clear(plugin, lilv_node_new_from_node(world, bundle)); + } else { + // Add new plugin to the world + plugin = lilv_plugin_new( + world, plugin_uri, lilv_node_new_from_node(world, bundle)); + + // Add manifest as plugin data file (as if it were rdfs:seeAlso) + zix_tree_insert( + (ZixTree*)plugin->data_uris, lilv_node_duplicate(manifest_uri), NULL); + + // Add plugin to world plugin sequence + zix_tree_insert((ZixTree*)world->plugins, plugin, NULL); + } + +#ifdef LILV_DYN_MANIFEST + // Set dynamic manifest library URI, if applicable + if (dynmanifest) { + plugin->dynmanifest = (LilvDynManifest*)dynmanifest; + ++((LilvDynManifest*)dynmanifest)->refs; + } +#endif + + // Add all plugin data files (rdfs:seeAlso) + SordIter* files = sord_search( + world->model, plugin_node, world->uris.rdfs_seeAlso, NULL, NULL); + FOREACH_MATCH (files) { + const SordNode* file_node = sord_iter_get_node(files, SORD_OBJECT); + zix_tree_insert((ZixTree*)plugin->data_uris, + lilv_node_new_from_node(world, file_node), + NULL); + } + sord_iter_free(files); +} + +SerdStatus +lilv_world_load_graph(LilvWorld* world, SordNode* graph, const LilvNode* uri) +{ + const SerdNode* base = sord_node_to_serd_node(uri->node); + SerdEnv* env = serd_env_new(base); + SerdReader* reader = sord_new_reader(world->model, env, SERD_TURTLE, graph); + + const SerdStatus st = lilv_world_load_file(world, reader, uri); + + serd_env_free(env); + serd_reader_free(reader); + return st; +} + +static void +lilv_world_load_dyn_manifest(LilvWorld* world, + SordNode* bundle_node, + const LilvNode* manifest) +{ +#ifdef LILV_DYN_MANIFEST + if (!world->opt.dyn_manifest) { + return; + } + + LV2_Dyn_Manifest_Handle handle = NULL; + + // ?dman a dynman:DynManifest bundle_node + SordModel* model = lilv_world_filter_model(world, + world->model, + NULL, + world->uris.rdf_a, + world->uris.dman_DynManifest, + bundle_node); + SordIter* iter = sord_begin(model); + for (; !sord_iter_end(iter); sord_iter_next(iter)) { + const SordNode* dmanifest = sord_iter_get_node(iter, SORD_SUBJECT); + + // ?dman lv2:binary ?binary + SordIter* binaries = sord_search( + world->model, dmanifest, world->uris.lv2_binary, NULL, bundle_node); + if (sord_iter_end(binaries)) { + sord_iter_free(binaries); + LILV_ERRORF("Dynamic manifest in <%s> has no binaries, ignored\n", + sord_node_get_string(bundle_node)); + continue; + } + + // Get binary path + const SordNode* binary = sord_iter_get_node(binaries, SORD_OBJECT); + const uint8_t* lib_uri = sord_node_get_string(binary); + char* lib_path = lilv_file_uri_parse((const char*)lib_uri, 0); + if (!lib_path) { + LILV_ERROR("No dynamic manifest library path\n"); + sord_iter_free(binaries); + continue; + } + + // Open library + dlerror(); + void* lib = dlopen(lib_path, RTLD_LAZY); + if (!lib) { + LILV_ERRORF( + "Failed to open dynmanifest library `%s' (%s)\n", lib_path, dlerror()); + sord_iter_free(binaries); + lilv_free(lib_path); + continue; + } + + // Open dynamic manifest + typedef int (*OpenFunc)(LV2_Dyn_Manifest_Handle*, + const LV2_Feature* const*); + OpenFunc dmopen = (OpenFunc)lilv_dlfunc(lib, "lv2_dyn_manifest_open"); + if (!dmopen || dmopen(&handle, &dman_features)) { + LILV_ERRORF("No `lv2_dyn_manifest_open' in `%s'\n", lib_path); + sord_iter_free(binaries); + dlclose(lib); + lilv_free(lib_path); + continue; + } + + // Get subjects (the data that would be in manifest.ttl) + typedef int (*GetSubjectsFunc)(LV2_Dyn_Manifest_Handle, FILE*); + GetSubjectsFunc get_subjects_func = + (GetSubjectsFunc)lilv_dlfunc(lib, "lv2_dyn_manifest_get_subjects"); + if (!get_subjects_func) { + LILV_ERRORF("No `lv2_dyn_manifest_get_subjects' in `%s'\n", lib_path); + sord_iter_free(binaries); + dlclose(lib); + lilv_free(lib_path); + continue; + } + + LilvDynManifest* desc = (LilvDynManifest*)malloc(sizeof(LilvDynManifest)); + desc->bundle = lilv_node_new_from_node(world, bundle_node); + desc->lib = lib; + desc->handle = handle; + desc->refs = 0; + + sord_iter_free(binaries); + + // Generate data file + FILE* fd = tmpfile(); + get_subjects_func(handle, fd); + rewind(fd); + + // Parse generated data file into temporary model + // FIXME + const SerdNode* base = sord_node_to_serd_node(dmanifest); + SerdEnv* env = serd_env_new(base); + SerdReader* reader = sord_new_reader( + world->model, env, SERD_TURTLE, sord_node_copy(dmanifest)); + serd_reader_add_blank_prefix(reader, lilv_world_blank_node_prefix(world)); + serd_reader_read_file_handle(reader, fd, (const uint8_t*)"(dyn-manifest)"); + serd_reader_free(reader); + serd_env_free(env); + + // Close (and automatically delete) temporary data file + fclose(fd); + + // ?plugin a lv2:Plugin + SordModel* plugins = lilv_world_filter_model(world, + world->model, + NULL, + world->uris.rdf_a, + world->uris.lv2_Plugin, + dmanifest); + SordIter* p = sord_begin(plugins); + FOREACH_MATCH (p) { + const SordNode* plug = sord_iter_get_node(p, SORD_SUBJECT); + lilv_world_add_plugin(world, plug, manifest, desc, bundle_node); + } + if (desc->refs == 0) { + lilv_dynmanifest_free(desc); + } + sord_iter_free(p); + sord_free(plugins); + lilv_free(lib_path); + } + sord_iter_free(iter); + sord_free(model); + +#else // LILV_DYN_MANIFEST + (void)world; + (void)bundle_node; + (void)manifest; +#endif +} + +#ifdef LILV_DYN_MANIFEST +void +lilv_dynmanifest_free(LilvDynManifest* dynmanifest) +{ + typedef int (*CloseFunc)(LV2_Dyn_Manifest_Handle); + CloseFunc close_func = + (CloseFunc)lilv_dlfunc(dynmanifest->lib, "lv2_dyn_manifest_close"); + if (close_func) { + close_func(dynmanifest->handle); + } + + dlclose(dynmanifest->lib); + lilv_node_free(dynmanifest->bundle); + free(dynmanifest); +} +#endif // LILV_DYN_MANIFEST + +LilvNode* +lilv_world_get_manifest_uri(LilvWorld* world, const LilvNode* bundle_uri) +{ + SerdNode manifest_uri = lilv_new_uri_relative_to_base( + (const uint8_t*)"manifest.ttl", sord_node_get_string(bundle_uri->node)); + LilvNode* manifest = lilv_new_uri(world, (const char*)manifest_uri.buf); + serd_node_free(&manifest_uri); + return manifest; +} + +static SordModel* +load_plugin_model(LilvWorld* world, + const LilvNode* bundle_uri, + const LilvNode* plugin_uri) +{ + // Create model and reader for loading into it + SordNode* bundle_node = bundle_uri->node; + SordModel* model = sord_new(world->world, SORD_SPO | SORD_OPS, false); + SerdEnv* env = serd_env_new(sord_node_to_serd_node(bundle_node)); + SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL); + + // Load manifest + LilvNode* manifest_uri = lilv_world_get_manifest_uri(world, bundle_uri); + serd_reader_add_blank_prefix(reader, lilv_world_blank_node_prefix(world)); + serd_reader_read_file(reader, + (const uint8_t*)lilv_node_as_string(manifest_uri)); + + // Load any seeAlso files + SordModel* files = lilv_world_filter_model( + world, model, plugin_uri->node, world->uris.rdfs_seeAlso, NULL, NULL); + + SordIter* f = sord_begin(files); + FOREACH_MATCH (f) { + const SordNode* file = sord_iter_get_node(f, SORD_OBJECT); + const uint8_t* file_str = sord_node_get_string(file); + if (sord_node_get_type(file) == SORD_URI) { + serd_reader_add_blank_prefix(reader, lilv_world_blank_node_prefix(world)); + serd_reader_read_file(reader, file_str); + } + } + + sord_iter_free(f); + sord_free(files); + serd_reader_free(reader); + serd_env_free(env); + lilv_node_free(manifest_uri); + + return model; +} + +static LilvVersion +get_version(LilvWorld* world, SordModel* model, const LilvNode* subject) +{ + const SordNode* minor_node = + sord_get(model, subject->node, world->uris.lv2_minorVersion, NULL, NULL); + const SordNode* micro_node = + sord_get(model, subject->node, world->uris.lv2_microVersion, NULL, NULL); + + LilvVersion version = {0, 0}; + if (minor_node && micro_node) { + version.minor = atoi((const char*)sord_node_get_string(minor_node)); + version.micro = atoi((const char*)sord_node_get_string(micro_node)); + } + + return version; +} + +void +lilv_world_load_bundle(LilvWorld* world, const LilvNode* bundle_uri) +{ + if (!lilv_node_is_uri(bundle_uri)) { + LILV_ERRORF("Bundle URI `%s' is not a URI\n", + sord_node_get_string(bundle_uri->node)); + return; + } + + SordNode* bundle_node = bundle_uri->node; + LilvNode* manifest = lilv_world_get_manifest_uri(world, bundle_uri); + + // Read manifest into model with graph = bundle_node + SerdStatus st = lilv_world_load_graph(world, bundle_node, manifest); + if (st > SERD_FAILURE) { + LILV_ERRORF("Error reading %s\n", lilv_node_as_string(manifest)); + lilv_node_free(manifest); + return; + } + + // ?plugin a lv2:Plugin + SordIter* plug_results = sord_search( + world->model, NULL, world->uris.rdf_a, world->uris.lv2_Plugin, bundle_node); + + // Find any loaded plugins that will be replaced with a newer version + LilvNodes* unload_uris = lilv_nodes_new(); + FOREACH_MATCH (plug_results) { + const SordNode* plug = sord_iter_get_node(plug_results, SORD_SUBJECT); + + LilvNode* plugin_uri = lilv_node_new_from_node(world, plug); + const LilvPlugin* plugin = + lilv_plugins_get_by_uri(world->plugins, plugin_uri); + const LilvNode* last_bundle = + plugin ? lilv_plugin_get_bundle_uri(plugin) : NULL; + if (!plugin || sord_node_equals(bundle_node, last_bundle->node)) { + // No previously loaded version, or it's from the same bundle + lilv_node_free(plugin_uri); + continue; + } + + // Compare versions + SordModel* this_model = load_plugin_model(world, bundle_uri, plugin_uri); + LilvVersion this_version = get_version(world, this_model, plugin_uri); + SordModel* last_model = load_plugin_model(world, last_bundle, plugin_uri); + LilvVersion last_version = get_version(world, last_model, plugin_uri); + sord_free(this_model); + sord_free(last_model); + const int cmp = lilv_version_cmp(&this_version, &last_version); + if (cmp > 0) { + zix_tree_insert( + (ZixTree*)unload_uris, lilv_node_duplicate(plugin_uri), NULL); + LILV_WARNF("Replacing version %d.%d of <%s> from <%s>\n", + last_version.minor, + last_version.micro, + sord_node_get_string(plug), + sord_node_get_string(last_bundle->node)); + LILV_NOTEF("New version %d.%d found in <%s>\n", + this_version.minor, + this_version.micro, + sord_node_get_string(bundle_node)); + } else if (cmp < 0) { + LILV_WARNF("Ignoring bundle <%s>\n", sord_node_get_string(bundle_node)); + LILV_NOTEF("Newer version of <%s> loaded from <%s>\n", + sord_node_get_string(plug), + sord_node_get_string(last_bundle->node)); + lilv_node_free(plugin_uri); + sord_iter_free(plug_results); + lilv_world_drop_graph(world, bundle_node); + lilv_node_free(manifest); + lilv_nodes_free(unload_uris); + return; + } + lilv_node_free(plugin_uri); + } + + sord_iter_free(plug_results); + + // Unload any old conflicting plugins + LilvNodes* unload_bundles = lilv_nodes_new(); + LILV_FOREACH (nodes, i, unload_uris) { + const LilvNode* uri = lilv_nodes_get(unload_uris, i); + const LilvPlugin* plugin = lilv_plugins_get_by_uri(world->plugins, uri); + const LilvNode* bundle = lilv_plugin_get_bundle_uri(plugin); + + // Unload plugin and record bundle for later unloading + lilv_world_unload_resource(world, uri); + zix_tree_insert( + (ZixTree*)unload_bundles, lilv_node_duplicate(bundle), NULL); + } + lilv_nodes_free(unload_uris); + + // Now unload the associated bundles + // This must be done last since several plugins could be in the same bundle + LILV_FOREACH (nodes, i, unload_bundles) { + lilv_world_unload_bundle(world, lilv_nodes_get(unload_bundles, i)); + } + lilv_nodes_free(unload_bundles); + + // Re-search for plugin results now that old plugins are gone + plug_results = sord_search( + world->model, NULL, world->uris.rdf_a, world->uris.lv2_Plugin, bundle_node); + + FOREACH_MATCH (plug_results) { + const SordNode* plug = sord_iter_get_node(plug_results, SORD_SUBJECT); + lilv_world_add_plugin(world, plug, manifest, NULL, bundle_node); + } + sord_iter_free(plug_results); + + lilv_world_load_dyn_manifest(world, bundle_node, manifest); + + // ?spec a lv2:Specification + // ?spec a owl:Ontology + const SordNode* spec_preds[] = { + world->uris.lv2_Specification, world->uris.owl_Ontology, NULL}; + for (const SordNode** p = spec_preds; *p; ++p) { + SordIter* i = + sord_search(world->model, NULL, world->uris.rdf_a, *p, bundle_node); + FOREACH_MATCH (i) { + const SordNode* spec = sord_iter_get_node(i, SORD_SUBJECT); + lilv_world_add_spec(world, spec, bundle_node); + } + sord_iter_free(i); + } + + lilv_node_free(manifest); +} + +static int +lilv_world_drop_graph(LilvWorld* world, const SordNode* graph) +{ + SordIter* i = sord_search(world->model, NULL, NULL, NULL, graph); + while (!sord_iter_end(i)) { + const SerdStatus st = sord_erase(world->model, i); + if (st) { + LILV_ERRORF("Error removing statement from <%s> (%s)\n", + sord_node_get_string(graph), + serd_strerror(st)); + return st; + } + } + sord_iter_free(i); + + return 0; +} + +/** Remove loaded_files entry so file will be reloaded if requested. */ +static int +lilv_world_unload_file(LilvWorld* world, const LilvNode* file) +{ + ZixTreeIter* iter = NULL; + if (!zix_tree_find((ZixTree*)world->loaded_files, file, &iter)) { + zix_tree_remove((ZixTree*)world->loaded_files, iter); + return 0; + } + return 1; +} + +int +lilv_world_unload_bundle(LilvWorld* world, const LilvNode* bundle_uri) +{ + if (!bundle_uri) { + return 0; + } + + // Find all loaded files that are inside the bundle + LilvNodes* files = lilv_nodes_new(); + LILV_FOREACH (nodes, i, world->loaded_files) { + const LilvNode* file = lilv_nodes_get(world->loaded_files, i); + if (!strncmp(lilv_node_as_string(file), + lilv_node_as_string(bundle_uri), + strlen(lilv_node_as_string(bundle_uri)))) { + zix_tree_insert((ZixTree*)files, lilv_node_duplicate(file), NULL); + } + } + + // Unload all loaded files in the bundle + LILV_FOREACH (nodes, i, files) { + const LilvNode* file = lilv_nodes_get(world->plugins, i); + lilv_world_unload_file(world, file); + } + + lilv_nodes_free(files); + + /* Remove any plugins in the bundle from the plugin list. Since the + application may still have a pointer to the LilvPlugin, it can not be + destroyed here. Instead, we move it to the zombie plugin list, so it + will not be in the list returned by lilv_world_get_all_plugins() but can + still be used. + */ + ZixTreeIter* i = zix_tree_begin((ZixTree*)world->plugins); + while (i != zix_tree_end((ZixTree*)world->plugins)) { + LilvPlugin* p = (LilvPlugin*)zix_tree_get(i); + ZixTreeIter* next = zix_tree_iter_next(i); + + if (lilv_node_equals(lilv_plugin_get_bundle_uri(p), bundle_uri)) { + zix_tree_remove((ZixTree*)world->plugins, i); + zix_tree_insert((ZixTree*)world->zombies, p, NULL); + } + + i = next; + } + + // Drop everything in bundle graph + return lilv_world_drop_graph(world, bundle_uri->node); +} + +static void +load_dir_entry(const char* dir, const char* name, void* data) +{ + LilvWorld* world = (LilvWorld*)data; + char* path = lilv_strjoin(dir, "/", name, "/", NULL); + SerdNode suri = serd_node_new_file_uri((const uint8_t*)path, 0, 0, true); + LilvNode* node = lilv_new_uri(world, (const char*)suri.buf); + + lilv_world_load_bundle(world, node); + lilv_node_free(node); + serd_node_free(&suri); + free(path); +} + +/** Load all bundles in the directory at `dir_path`. */ +static void +lilv_world_load_directory(LilvWorld* world, const char* dir_path) +{ + char* path = lilv_expand(dir_path); + if (path) { + lilv_dir_for_each(path, world, load_dir_entry); + free(path); + } +} + +static const char* +first_path_sep(const char* path) +{ + for (const char* p = path; *p != '\0'; ++p) { + if (*p == LILV_PATH_SEP[0]) { + return p; + } + } + return NULL; +} + +/** Load all bundles found in `lv2_path`. + * @param lv2_path A colon-delimited list of directories. These directories + * should contain LV2 bundle directories (ie the search path is a list of + * parent directories of bundles, not a list of bundle directories). + */ +static void +lilv_world_load_path(LilvWorld* world, const char* lv2_path) +{ + while (lv2_path[0] != '\0') { + const char* const sep = first_path_sep(lv2_path); + if (sep) { + const size_t dir_len = sep - lv2_path; + char* const dir = (char*)malloc(dir_len + 1); + memcpy(dir, lv2_path, dir_len); + dir[dir_len] = '\0'; + lilv_world_load_directory(world, dir); + free(dir); + lv2_path += dir_len + 1; + } else { + lilv_world_load_directory(world, lv2_path); + lv2_path = "\0"; + } + } +} + +void +lilv_world_load_specifications(LilvWorld* world) +{ + for (LilvSpec* spec = world->specs; spec; spec = spec->next) { + LILV_FOREACH (nodes, f, spec->data_uris) { + LilvNode* file = (LilvNode*)lilv_collection_get(spec->data_uris, f); + lilv_world_load_graph(world, NULL, file); + } + } +} + +void +lilv_world_load_plugin_classes(LilvWorld* world) +{ + /* FIXME: This loads all classes, not just lv2:Plugin subclasses. + However, if the host gets all the classes via + lilv_plugin_class_get_children starting with lv2:Plugin as the root (which + is e.g. how a host would build a menu), they won't be seen anyway... + */ + + SordIter* classes = sord_search( + world->model, NULL, world->uris.rdf_a, world->uris.rdfs_Class, NULL); + FOREACH_MATCH (classes) { + const SordNode* class_node = sord_iter_get_node(classes, SORD_SUBJECT); + + SordNode* parent = sord_get( + world->model, class_node, world->uris.rdfs_subClassOf, NULL, NULL); + if (!parent || sord_node_get_type(parent) != SORD_URI) { + continue; + } + + SordNode* label = + sord_get(world->model, class_node, world->uris.rdfs_label, NULL, NULL); + if (!label) { + sord_node_free(world->world, parent); + continue; + } + + LilvPluginClass* pclass = lilv_plugin_class_new( + world, parent, class_node, (const char*)sord_node_get_string(label)); + if (pclass) { + zix_tree_insert((ZixTree*)world->plugin_classes, pclass, NULL); + } + + sord_node_free(world->world, label); + sord_node_free(world->world, parent); + } + sord_iter_free(classes); +} + +void +lilv_world_load_all(LilvWorld* world) +{ + const char* lv2_path = world->opt.lv2_path; + if (!lv2_path) { + lv2_path = getenv("LV2_PATH"); + } + if (!lv2_path) { + lv2_path = LILV_DEFAULT_LV2_PATH; + } + + // Discover bundles and read all manifest files into model + lilv_world_load_path(world, lv2_path); + + LILV_FOREACH (plugins, p, world->plugins) { + const LilvPlugin* plugin = + (const LilvPlugin*)lilv_collection_get((ZixTree*)world->plugins, p); + + // ?new dc:replaces plugin + if (sord_ask(world->model, + NULL, + world->uris.dc_replaces, + lilv_plugin_get_uri(plugin)->node, + NULL)) { + // TODO: Check if replacement is a known plugin? (expensive) + ((LilvPlugin*)plugin)->replaced = true; + } + } + + // Query out things to cache + lilv_world_load_specifications(world); + lilv_world_load_plugin_classes(world); +} + +SerdStatus +lilv_world_load_file(LilvWorld* world, SerdReader* reader, const LilvNode* uri) +{ + ZixTreeIter* iter = NULL; + if (!zix_tree_find((ZixTree*)world->loaded_files, uri, &iter)) { + return SERD_FAILURE; // File has already been loaded + } + + size_t uri_len = 0; + const uint8_t* const uri_str = + sord_node_get_string_counted(uri->node, &uri_len); + if (strncmp((const char*)uri_str, "file:", 5)) { + return SERD_FAILURE; // Not a local file + } + + if (strcmp((const char*)uri_str + uri_len - 4, ".ttl")) { + return SERD_FAILURE; // Not a Turtle file + } + + serd_reader_add_blank_prefix(reader, lilv_world_blank_node_prefix(world)); + const SerdStatus st = serd_reader_read_file(reader, uri_str); + if (st) { + LILV_ERRORF("Error loading file `%s'\n", lilv_node_as_string(uri)); + return st; + } + + zix_tree_insert( + (ZixTree*)world->loaded_files, lilv_node_duplicate(uri), NULL); + return SERD_SUCCESS; +} + +int +lilv_world_load_resource(LilvWorld* world, const LilvNode* resource) +{ + if (!lilv_node_is_uri(resource) && !lilv_node_is_blank(resource)) { + LILV_ERRORF("Node `%s' is not a resource\n", + sord_node_get_string(resource->node)); + return -1; + } + + SordModel* files = lilv_world_filter_model( + world, world->model, resource->node, world->uris.rdfs_seeAlso, NULL, NULL); + + SordIter* f = sord_begin(files); + int n_read = 0; + FOREACH_MATCH (f) { + const SordNode* file = sord_iter_get_node(f, SORD_OBJECT); + const uint8_t* file_str = sord_node_get_string(file); + LilvNode* file_node = lilv_node_new_from_node(world, file); + if (sord_node_get_type(file) != SORD_URI) { + LILV_ERRORF("rdfs:seeAlso node `%s' is not a URI\n", file_str); + } else if (!lilv_world_load_graph(world, (SordNode*)file, file_node)) { + ++n_read; + } + lilv_node_free(file_node); + } + sord_iter_free(f); + + sord_free(files); + return n_read; +} + +int +lilv_world_unload_resource(LilvWorld* world, const LilvNode* resource) +{ + if (!lilv_node_is_uri(resource) && !lilv_node_is_blank(resource)) { + LILV_ERRORF("Node `%s' is not a resource\n", + sord_node_get_string(resource->node)); + return -1; + } + + SordModel* files = lilv_world_filter_model( + world, world->model, resource->node, world->uris.rdfs_seeAlso, NULL, NULL); + + SordIter* f = sord_begin(files); + int n_dropped = 0; + FOREACH_MATCH (f) { + const SordNode* file = sord_iter_get_node(f, SORD_OBJECT); + LilvNode* file_node = lilv_node_new_from_node(world, file); + if (sord_node_get_type(file) != SORD_URI) { + LILV_ERRORF("rdfs:seeAlso node `%s' is not a URI\n", + sord_node_get_string(file)); + } else if (!lilv_world_drop_graph(world, file_node->node)) { + lilv_world_unload_file(world, file_node); + ++n_dropped; + } + lilv_node_free(file_node); + } + sord_iter_free(f); + + sord_free(files); + return n_dropped; +} + +const LilvPluginClass* +lilv_world_get_plugin_class(const LilvWorld* world) +{ + return world->lv2_plugin_class; +} + +const LilvPluginClasses* +lilv_world_get_plugin_classes(const LilvWorld* world) +{ + return world->plugin_classes; +} + +const LilvPlugins* +lilv_world_get_all_plugins(const LilvWorld* world) +{ + return world->plugins; +} + +LilvNode* +lilv_world_get_symbol(LilvWorld* world, const LilvNode* subject) +{ + // Check for explicitly given symbol + SordNode* snode = + sord_get(world->model, subject->node, world->uris.lv2_symbol, NULL, NULL); + + if (snode) { + LilvNode* ret = lilv_node_new_from_node(world, snode); + sord_node_free(world->world, snode); + return ret; + } + + if (!lilv_node_is_uri(subject)) { + return NULL; + } + + // Find rightmost segment of URI + SerdURI uri; + serd_uri_parse((const uint8_t*)lilv_node_as_uri(subject), &uri); + const char* str = "_"; + if (uri.fragment.buf) { + str = (const char*)uri.fragment.buf + 1; + } else if (uri.query.buf) { + str = (const char*)uri.query.buf; + } else if (uri.path.buf) { + const char* last_slash = strrchr((const char*)uri.path.buf, '/'); + str = last_slash ? (last_slash + 1) : (const char*)uri.path.buf; + } + + // Replace invalid characters + const size_t len = strlen(str); + char* const sym = (char*)calloc(1, len + 1); + for (size_t i = 0; i < len; ++i) { + const char c = str[i]; + if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c == '_') || + (i > 0 && c >= '0' && c <= '9'))) { + sym[i] = '_'; + } else { + sym[i] = str[i]; + } + } + + LilvNode* ret = lilv_new_string(world, sym); + free(sym); + return ret; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,138 @@ +/* + Copyright 2016-2020 David Robillard + + 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. +*/ + +#ifndef ZIX_COMMON_H +#define ZIX_COMMON_H + +#include + +/** + @addtogroup zix + @{ +*/ + +/** @cond */ +#if defined(_WIN32) && !defined(ZIX_STATIC) && defined(ZIX_INTERNAL) +# define ZIX_API __declspec(dllexport) +#elif defined(_WIN32) && !defined(ZIX_STATIC) +# define ZIX_API __declspec(dllimport) +#elif defined(__GNUC__) +# define ZIX_API __attribute__((visibility("default"))) +#else +# define ZIX_API +#endif + +#ifdef __GNUC__ +# define ZIX_PURE_FUNC __attribute__((pure)) +# define ZIX_CONST_FUNC __attribute__((const)) +# define ZIX_MALLOC_FUNC __attribute__((malloc)) +#else +# define ZIX_PURE_FUNC +# define ZIX_CONST_FUNC +# define ZIX_MALLOC_FUNC +#endif + +#define ZIX_PURE_API \ + ZIX_API \ + ZIX_PURE_FUNC + +#define ZIX_CONST_API \ + ZIX_API \ + ZIX_CONST_FUNC + +#define ZIX_MALLOC_API \ + ZIX_API \ + ZIX_MALLOC_FUNC + +/** @endcond */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __GNUC__ +# define ZIX_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define ZIX_LOG_FUNC(fmt, arg1) +#endif + +// Unused parameter macro to suppresses warnings and make it impossible to use +#if defined(__cplusplus) +# define ZIX_UNUSED(name) +#elif defined(__GNUC__) +# define ZIX_UNUSED(name) name##_unused __attribute__((__unused__)) +#else +# define ZIX_UNUSED(name) name +#endif + +typedef enum { + ZIX_STATUS_SUCCESS, + ZIX_STATUS_ERROR, + ZIX_STATUS_NO_MEM, + ZIX_STATUS_NOT_FOUND, + ZIX_STATUS_EXISTS, + ZIX_STATUS_BAD_ARG, + ZIX_STATUS_BAD_PERMS +} ZixStatus; + +static inline const char* +zix_strerror(const ZixStatus status) +{ + switch (status) { + case ZIX_STATUS_SUCCESS: + return "Success"; + case ZIX_STATUS_ERROR: + return "Unknown error"; + case ZIX_STATUS_NO_MEM: + return "Out of memory"; + case ZIX_STATUS_NOT_FOUND: + return "Not found"; + case ZIX_STATUS_EXISTS: + return "Exists"; + case ZIX_STATUS_BAD_ARG: + return "Bad argument"; + case ZIX_STATUS_BAD_PERMS: + return "Bad permissions"; + } + return "Unknown error"; +} + +/** + Function for comparing two elements. +*/ +typedef int (*ZixComparator)(const void* a, + const void* b, + const void* user_data); + +/** + Function for testing equality of two elements. +*/ +typedef bool (*ZixEqualFunc)(const void* a, const void* b); + +/** + Function to destroy an element. +*/ +typedef void (*ZixDestroyFunc)(void* ptr); + +/** + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_COMMON_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,727 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#include "zix/tree.h" + +#include "zix/common.h" + +#include +#include +#include + +typedef struct ZixTreeNodeImpl ZixTreeNode; + +struct ZixTreeImpl { + ZixTreeNode* root; + ZixDestroyFunc destroy; + ZixComparator cmp; + void* cmp_data; + size_t size; + bool allow_duplicates; +}; + +struct ZixTreeNodeImpl { + void* data; + struct ZixTreeNodeImpl* left; + struct ZixTreeNodeImpl* right; + struct ZixTreeNodeImpl* parent; + int balance; +}; + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) + +// Uncomment these for debugging features +// #define ZIX_TREE_DUMP 1 +// #define ZIX_TREE_VERIFY 1 +// #define ZIX_TREE_HYPER_VERIFY 1 + +#if defined(ZIX_TREE_VERIFY) || defined(ZIX_TREE_HYPER_VERIFY) +# include "tree_debug.h" +# define ASSERT_BALANCE(n) assert(verify_balance(n)) +#else +# define ASSERT_BALANCE(n) +#endif + +#ifdef ZIX_TREE_DUMP +# include "tree_debug.h" +# define DUMP(t) zix_tree_print(t->root, 0) +# define DEBUG_PRINTF(fmt, ...) printf(fmt, __VA_ARGS__) +#else +# define DUMP(t) +# define DEBUG_PRINTF(fmt, ...) +#endif + +ZixTree* +zix_tree_new(bool allow_duplicates, + ZixComparator cmp, + void* cmp_data, + ZixDestroyFunc destroy) +{ + ZixTree* t = (ZixTree*)malloc(sizeof(ZixTree)); + t->root = NULL; + t->destroy = destroy; + t->cmp = cmp; + t->cmp_data = cmp_data; + t->size = 0; + t->allow_duplicates = allow_duplicates; + return t; +} + +static void +zix_tree_free_rec(ZixTree* t, ZixTreeNode* n) +{ + if (n) { + zix_tree_free_rec(t, n->left); + zix_tree_free_rec(t, n->right); + if (t->destroy) { + t->destroy(n->data); + } + free(n); + } +} + +void +zix_tree_free(ZixTree* t) +{ + if (t) { + zix_tree_free_rec(t, t->root); + free(t); + } +} + +size_t +zix_tree_size(const ZixTree* t) +{ + return t->size; +} + +static void +rotate(ZixTreeNode* p, ZixTreeNode* q) +{ + assert(q->parent == p); + assert(p->left == q || p->right == q); + + q->parent = p->parent; + if (q->parent) { + if (q->parent->left == p) { + q->parent->left = q; + } else { + q->parent->right = q; + } + } + + if (p->right == q) { + // Rotate left + p->right = q->left; + q->left = p; + if (p->right) { + p->right->parent = p; + } + } else { + // Rotate right + assert(p->left == q); + p->left = q->right; + q->right = p; + if (p->left) { + p->left->parent = p; + } + } + + p->parent = q; +} + +/** + * Rotate left about `p`. + * + * p q + * / \ / \ + * A q => p C + * / \ / \ + * B C A B + */ +static ZixTreeNode* +rotate_left(ZixTreeNode* p, int* height_change) +{ + ZixTreeNode* const q = p->right; + *height_change = (q->balance == 0) ? 0 : -1; + + DEBUG_PRINTF("LL %ld\n", (intptr_t)p->data); + + assert(p->balance == 2); + assert(q->balance == 0 || q->balance == 1); + + rotate(p, q); + + // p->balance -= 1 + MAX(0, q->balance); + // q->balance -= 1 - MIN(0, p->balance); + --q->balance; + p->balance = -(q->balance); + + ASSERT_BALANCE(p); + ASSERT_BALANCE(q); + return q; +} + +/** + * Rotate right about `p`. + * + * p q + * / \ / \ + * q C => A p + * / \ / \ + * A B B C + * + */ +static ZixTreeNode* +rotate_right(ZixTreeNode* p, int* height_change) +{ + ZixTreeNode* const q = p->left; + *height_change = (q->balance == 0) ? 0 : -1; + + DEBUG_PRINTF("RR %ld\n", (intptr_t)p->data); + + assert(p->balance == -2); + assert(q->balance == 0 || q->balance == -1); + + rotate(p, q); + + // p->balance += 1 - MIN(0, q->balance); + // q->balance += 1 + MAX(0, p->balance); + ++q->balance; + p->balance = -(q->balance); + + ASSERT_BALANCE(p); + ASSERT_BALANCE(q); + return q; +} + +/** + * Rotate left about `p->left` then right about `p`. + * + * p r + * / \ / \ + * q D => q p + * / \ / \ / \ + * A r A B C D + * / \ + * B C + * + */ +static ZixTreeNode* +rotate_left_right(ZixTreeNode* p, int* height_change) +{ + ZixTreeNode* const q = p->left; + ZixTreeNode* const r = q->right; + + assert(p->balance == -2); + assert(q->balance == 1); + assert(r->balance == -1 || r->balance == 0 || r->balance == 1); + + DEBUG_PRINTF("LR %ld P: %2d Q: %2d R: %2d\n", + (intptr_t)p->data, + p->balance, + q->balance, + r->balance); + + rotate(q, r); + rotate(p, r); + + q->balance -= 1 + MAX(0, r->balance); + p->balance += 1 - MIN(MIN(0, r->balance) - 1, r->balance + q->balance); + // r->balance += MAX(0, p->balance) + MIN(0, q->balance); + + // p->balance = (p->left && p->right) ? -MIN(r->balance, 0) : 0; + // q->balance = - MAX(r->balance, 0); + r->balance = 0; + + *height_change = -1; + + ASSERT_BALANCE(p); + ASSERT_BALANCE(q); + ASSERT_BALANCE(r); + return r; +} + +/** + * Rotate right about `p->right` then right about `p`. + * + * p r + * / \ / \ + * A q => p q + * / \ / \ / \ + * r D A B C D + * / \ + * B C + * + */ +static ZixTreeNode* +rotate_right_left(ZixTreeNode* p, int* height_change) +{ + ZixTreeNode* const q = p->right; + ZixTreeNode* const r = q->left; + + assert(p->balance == 2); + assert(q->balance == -1); + assert(r->balance == -1 || r->balance == 0 || r->balance == 1); + + DEBUG_PRINTF("RL %ld P: %2d Q: %2d R: %2d\n", + (intptr_t)p->data, + p->balance, + q->balance, + r->balance); + + rotate(q, r); + rotate(p, r); + + q->balance += 1 - MIN(0, r->balance); + p->balance -= 1 + MAX(MAX(0, r->balance) + 1, r->balance + q->balance); + // r->balance += MAX(0, q->balance) + MIN(0, p->balance); + + // p->balance = (p->left && p->right) ? -MAX(r->balance, 0) : 0; + // q->balance = - MIN(r->balance, 0); + r->balance = 0; + // assert(r->balance == 0); + + *height_change = -1; + + ASSERT_BALANCE(p); + ASSERT_BALANCE(q); + ASSERT_BALANCE(r); + return r; +} + +static ZixTreeNode* +zix_tree_rebalance(ZixTree* t, ZixTreeNode* node, int* height_change) +{ +#ifdef ZIX_TREE_HYPER_VERIFY + const size_t old_height = height(node); +#endif + DEBUG_PRINTF("REBALANCE %ld (%d)\n", (intptr_t)node->data, node->balance); + *height_change = 0; + const bool is_root = !node->parent; + assert((is_root && t->root == node) || (!is_root && t->root != node)); + ZixTreeNode* replacement = node; + if (node->balance == -2) { + assert(node->left); + if (node->left->balance == 1) { + replacement = rotate_left_right(node, height_change); + } else { + replacement = rotate_right(node, height_change); + } + } else if (node->balance == 2) { + assert(node->right); + if (node->right->balance == -1) { + replacement = rotate_right_left(node, height_change); + } else { + replacement = rotate_left(node, height_change); + } + } + if (is_root) { + assert(!replacement->parent); + t->root = replacement; + } + DUMP(t); +#ifdef ZIX_TREE_HYPER_VERIFY + assert(old_height + *height_change == height(replacement)); +#endif + return replacement; +} + +ZixStatus +zix_tree_insert(ZixTree* t, void* e, ZixTreeIter** ti) +{ + DEBUG_PRINTF("**** INSERT %ld\n", (intptr_t)e); + int cmp = 0; + ZixTreeNode* n = t->root; + ZixTreeNode* p = NULL; + + // Find the parent p of e + while (n) { + p = n; + cmp = t->cmp(e, n->data, t->cmp_data); + if (cmp < 0) { + n = n->left; + } else if (cmp > 0 || t->allow_duplicates) { + n = n->right; + } else { + if (ti) { + *ti = n; + } + DEBUG_PRINTF("%ld EXISTS!\n", (intptr_t)e); + return ZIX_STATUS_EXISTS; + } + } + + // Allocate a new node n + if (!(n = (ZixTreeNode*)malloc(sizeof(ZixTreeNode)))) { + return ZIX_STATUS_NO_MEM; + } + memset(n, '\0', sizeof(ZixTreeNode)); + n->data = e; + n->balance = 0; + if (ti) { + *ti = n; + } + + bool p_height_increased = false; + + // Make p the parent of n + n->parent = p; + if (!p) { + t->root = n; + } else { + if (cmp < 0) { + assert(!p->left); + assert(p->balance == 0 || p->balance == 1); + p->left = n; + --p->balance; + p_height_increased = !p->right; + } else { + assert(!p->right); + assert(p->balance == 0 || p->balance == -1); + p->right = n; + ++p->balance; + p_height_increased = !p->left; + } + } + + DUMP(t); + + // Rebalance if necessary (at most 1 rotation) + assert(!p || p->balance == -1 || p->balance == 0 || p->balance == 1); + if (p && p_height_increased) { + int height_change = 0; + for (ZixTreeNode* i = p; i && i->parent; i = i->parent) { + if (i == i->parent->left) { + if (--i->parent->balance == -2) { + zix_tree_rebalance(t, i->parent, &height_change); + break; + } + } else { + assert(i == i->parent->right); + if (++i->parent->balance == 2) { + zix_tree_rebalance(t, i->parent, &height_change); + break; + } + } + + if (i->parent->balance == 0) { + break; + } + } + } + + DUMP(t); + + ++t->size; + +#ifdef ZIX_TREE_VERIFY + if (!verify(t, t->root)) { + return ZIX_STATUS_ERROR; + } +#endif + + return ZIX_STATUS_SUCCESS; +} + +ZixStatus +zix_tree_remove(ZixTree* t, ZixTreeIter* ti) +{ + ZixTreeNode* const n = ti; + ZixTreeNode** pp = NULL; // parent pointer + ZixTreeNode* to_balance = n->parent; // lowest node to balance + int d_balance = 0; // delta(balance) for n->parent + + DEBUG_PRINTF("*** REMOVE %ld\n", (intptr_t)n->data); + + if ((n == t->root) && !n->left && !n->right) { + t->root = NULL; + if (t->destroy) { + t->destroy(n->data); + } + free(n); + --t->size; + assert(t->size == 0); + return ZIX_STATUS_SUCCESS; + } + + // Set pp to the parent pointer to n, if applicable + if (n->parent) { + assert(n->parent->left == n || n->parent->right == n); + if (n->parent->left == n) { // n is left child + pp = &n->parent->left; + d_balance = 1; + } else { // n is right child + assert(n->parent->right == n); + pp = &n->parent->right; + d_balance = -1; + } + } + + assert(!pp || *pp == n); + + int height_change = 0; + if (!n->left && !n->right) { + // n is a leaf, just remove it + if (pp) { + *pp = NULL; + to_balance = n->parent; + height_change = (!n->parent->left && !n->parent->right) ? -1 : 0; + } + + } else if (!n->left) { + // Replace n with right (only) child + if (pp) { + *pp = n->right; + to_balance = n->parent; + } else { + t->root = n->right; + } + n->right->parent = n->parent; + height_change = -1; + + } else if (!n->right) { + // Replace n with left (only) child + if (pp) { + *pp = n->left; + to_balance = n->parent; + } else { + t->root = n->left; + } + n->left->parent = n->parent; + height_change = -1; + + } else { + // Replace n with in-order successor (leftmost child of right subtree) + ZixTreeNode* replace = n->right; + while (replace->left) { + assert(replace->left->parent == replace); + replace = replace->left; + } + + // Remove replace from parent (replace_p) + if (replace->parent->left == replace) { + height_change = replace->parent->right ? 0 : -1; + d_balance = 1; + to_balance = replace->parent; + replace->parent->left = replace->right; + } else { + assert(replace->parent == n); + height_change = replace->parent->left ? 0 : -1; + d_balance = -1; + to_balance = replace->parent; + replace->parent->right = replace->right; + } + + if (to_balance == n) { + to_balance = replace; + } + + if (replace->right) { + replace->right->parent = replace->parent; + } + + replace->balance = n->balance; + + // Swap node to delete with replace + if (pp) { + *pp = replace; + } else { + assert(t->root == n); + t->root = replace; + } + + replace->parent = n->parent; + replace->left = n->left; + n->left->parent = replace; + replace->right = n->right; + if (n->right) { + n->right->parent = replace; + } + + assert(!replace->parent || replace->parent->left == replace || + replace->parent->right == replace); + } + + // Rebalance starting at to_balance upwards. + for (ZixTreeNode* i = to_balance; i; i = i->parent) { + i->balance += d_balance; + if (d_balance == 0 || i->balance == -1 || i->balance == 1) { + break; + } + + assert(i != n); + i = zix_tree_rebalance(t, i, &height_change); + if (i->balance == 0) { + height_change = -1; + } + + if (i->parent) { + if (i == i->parent->left) { + d_balance = height_change * -1; + } else { + assert(i == i->parent->right); + d_balance = height_change; + } + } + } + + DUMP(t); + + if (t->destroy) { + t->destroy(n->data); + } + free(n); + + --t->size; + +#ifdef ZIX_TREE_VERIFY + if (!verify(t, t->root)) { + return ZIX_STATUS_ERROR; + } +#endif + + return ZIX_STATUS_SUCCESS; +} + +ZixStatus +zix_tree_find(const ZixTree* t, const void* e, ZixTreeIter** ti) +{ + ZixTreeNode* n = t->root; + while (n) { + const int cmp = t->cmp(e, n->data, t->cmp_data); + if (cmp == 0) { + break; + } + + if (cmp < 0) { + n = n->left; + } else { + n = n->right; + } + } + + *ti = n; + return (n) ? ZIX_STATUS_SUCCESS : ZIX_STATUS_NOT_FOUND; +} + +void* +zix_tree_get(const ZixTreeIter* ti) +{ + return ti ? ti->data : NULL; +} + +ZixTreeIter* +zix_tree_begin(ZixTree* t) +{ + if (!t->root) { + return NULL; + } + + ZixTreeNode* n = t->root; + while (n->left) { + n = n->left; + } + + return n; +} + +ZixTreeIter* +zix_tree_end(ZixTree* ZIX_UNUSED(t)) +{ + return NULL; +} + +ZixTreeIter* +zix_tree_rbegin(ZixTree* t) +{ + if (!t->root) { + return NULL; + } + + ZixTreeNode* n = t->root; + while (n->right) { + n = n->right; + } + + return n; +} + +ZixTreeIter* +zix_tree_rend(ZixTree* ZIX_UNUSED(t)) +{ + return NULL; +} + +bool +zix_tree_iter_is_end(const ZixTreeIter* i) +{ + return !i; +} + +bool +zix_tree_iter_is_rend(const ZixTreeIter* i) +{ + return !i; +} + +ZixTreeIter* +zix_tree_iter_next(ZixTreeIter* i) +{ + if (!i) { + return NULL; + } + + if (i->right) { + i = i->right; + while (i->left) { + i = i->left; + } + } else { + while (i->parent && i->parent->right == i) { // i is a right child + i = i->parent; + } + + i = i->parent; + } + + return i; +} + +ZixTreeIter* +zix_tree_iter_prev(ZixTreeIter* i) +{ + if (!i) { + return NULL; + } + + if (i->left) { + i = i->left; + while (i->right) { + i = i->right; + } + + } else { + while (i->parent && i->parent->left == i) { // i is a left child + i = i->parent; + } + + i = i->parent; + } + + return i; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,164 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef ZIX_TREE_H +#define ZIX_TREE_H + +#include "zix/common.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @addtogroup zix + @{ + @name Tree + @{ +*/ + +/** + A balanced binary search tree. +*/ +typedef struct ZixTreeImpl ZixTree; + +/** + An iterator over a @ref ZixTree. +*/ +typedef struct ZixTreeNodeImpl ZixTreeIter; + +/** + Create a new (empty) tree. +*/ +ZIX_API +ZixTree* +zix_tree_new(bool allow_duplicates, + ZixComparator cmp, + void* cmp_data, + ZixDestroyFunc destroy); + +/** + Free `t`. +*/ +ZIX_API +void +zix_tree_free(ZixTree* t); + +/** + Return the number of elements in `t`. +*/ +ZIX_PURE_API +size_t +zix_tree_size(const ZixTree* t); + +/** + Insert the element `e` into `t` and point `ti` at the new element. +*/ +ZIX_API +ZixStatus +zix_tree_insert(ZixTree* t, void* e, ZixTreeIter** ti); + +/** + Remove the item pointed at by `ti` from `t`. +*/ +ZIX_API +ZixStatus +zix_tree_remove(ZixTree* t, ZixTreeIter* ti); + +/** + Set `ti` to an element equal to `e` in `t`. + If no such item exists, `ti` is set to NULL. +*/ +ZIX_API +ZixStatus +zix_tree_find(const ZixTree* t, const void* e, ZixTreeIter** ti); + +/** + Return the data associated with the given tree item. +*/ +ZIX_PURE_API +void* +zix_tree_get(const ZixTreeIter* ti); + +/** + Return an iterator to the first (smallest) element in `t`. +*/ +ZIX_PURE_API +ZixTreeIter* +zix_tree_begin(ZixTree* t); + +/** + Return an iterator the the element one past the last element in `t`. +*/ +ZIX_CONST_API +ZixTreeIter* +zix_tree_end(ZixTree* t); + +/** + Return true iff `i` is an iterator to the end of its tree. +*/ +ZIX_CONST_API +bool +zix_tree_iter_is_end(const ZixTreeIter* i); + +/** + Return an iterator to the last (largest) element in `t`. +*/ +ZIX_PURE_API +ZixTreeIter* +zix_tree_rbegin(ZixTree* t); + +/** + Return an iterator the the element one before the first element in `t`. +*/ +ZIX_CONST_API +ZixTreeIter* +zix_tree_rend(ZixTree* t); + +/** + Return true iff `i` is an iterator to the reverse end of its tree. +*/ +ZIX_CONST_API +bool +zix_tree_iter_is_rend(const ZixTreeIter* i); + +/** + Return an iterator that points to the element one past `i`. +*/ +ZIX_PURE_API +ZixTreeIter* +zix_tree_iter_next(ZixTreeIter* i); + +/** + Return an iterator that points to the element one before `i`. +*/ +ZIX_PURE_API +ZixTreeIter* +zix_tree_iter_prev(ZixTreeIter* i); + +/** + @} + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_TREE_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,33 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +/* + Instead of providing a config header per lv2-related library, we put all + of the config in a single file, which is included below. +*/ + +#pragma once + +#include "juce_lv2_config.h" diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,16 @@ +Copyright 2006-2012 Steve Harris, David Robillard. + +Based on LADSPA, Copyright 2000-2002 Richard W.E. Furse, +Paul Barton-Davis, Stefan Westerfeld. + +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. diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,260 @@ +/* + Copyright 2008-2016 David Robillard + + 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. +*/ + +#ifndef LV2_ATOM_H +#define LV2_ATOM_H + +/** + @defgroup atom Atom + @ingroup lv2 + + A generic value container and several data types. + + See for details. + + @{ +*/ + +#include + +// clang-format off + +#define LV2_ATOM_URI "http://lv2plug.in/ns/ext/atom" ///< http://lv2plug.in/ns/ext/atom +#define LV2_ATOM_PREFIX LV2_ATOM_URI "#" ///< http://lv2plug.in/ns/ext/atom# + +#define LV2_ATOM__Atom LV2_ATOM_PREFIX "Atom" ///< http://lv2plug.in/ns/ext/atom#Atom +#define LV2_ATOM__AtomPort LV2_ATOM_PREFIX "AtomPort" ///< http://lv2plug.in/ns/ext/atom#AtomPort +#define LV2_ATOM__Blank LV2_ATOM_PREFIX "Blank" ///< http://lv2plug.in/ns/ext/atom#Blank +#define LV2_ATOM__Bool LV2_ATOM_PREFIX "Bool" ///< http://lv2plug.in/ns/ext/atom#Bool +#define LV2_ATOM__Chunk LV2_ATOM_PREFIX "Chunk" ///< http://lv2plug.in/ns/ext/atom#Chunk +#define LV2_ATOM__Double LV2_ATOM_PREFIX "Double" ///< http://lv2plug.in/ns/ext/atom#Double +#define LV2_ATOM__Event LV2_ATOM_PREFIX "Event" ///< http://lv2plug.in/ns/ext/atom#Event +#define LV2_ATOM__Float LV2_ATOM_PREFIX "Float" ///< http://lv2plug.in/ns/ext/atom#Float +#define LV2_ATOM__Int LV2_ATOM_PREFIX "Int" ///< http://lv2plug.in/ns/ext/atom#Int +#define LV2_ATOM__Literal LV2_ATOM_PREFIX "Literal" ///< http://lv2plug.in/ns/ext/atom#Literal +#define LV2_ATOM__Long LV2_ATOM_PREFIX "Long" ///< http://lv2plug.in/ns/ext/atom#Long +#define LV2_ATOM__Number LV2_ATOM_PREFIX "Number" ///< http://lv2plug.in/ns/ext/atom#Number +#define LV2_ATOM__Object LV2_ATOM_PREFIX "Object" ///< http://lv2plug.in/ns/ext/atom#Object +#define LV2_ATOM__Path LV2_ATOM_PREFIX "Path" ///< http://lv2plug.in/ns/ext/atom#Path +#define LV2_ATOM__Property LV2_ATOM_PREFIX "Property" ///< http://lv2plug.in/ns/ext/atom#Property +#define LV2_ATOM__Resource LV2_ATOM_PREFIX "Resource" ///< http://lv2plug.in/ns/ext/atom#Resource +#define LV2_ATOM__Sequence LV2_ATOM_PREFIX "Sequence" ///< http://lv2plug.in/ns/ext/atom#Sequence +#define LV2_ATOM__Sound LV2_ATOM_PREFIX "Sound" ///< http://lv2plug.in/ns/ext/atom#Sound +#define LV2_ATOM__String LV2_ATOM_PREFIX "String" ///< http://lv2plug.in/ns/ext/atom#String +#define LV2_ATOM__Tuple LV2_ATOM_PREFIX "Tuple" ///< http://lv2plug.in/ns/ext/atom#Tuple +#define LV2_ATOM__URI LV2_ATOM_PREFIX "URI" ///< http://lv2plug.in/ns/ext/atom#URI +#define LV2_ATOM__URID LV2_ATOM_PREFIX "URID" ///< http://lv2plug.in/ns/ext/atom#URID +#define LV2_ATOM__Vector LV2_ATOM_PREFIX "Vector" ///< http://lv2plug.in/ns/ext/atom#Vector +#define LV2_ATOM__atomTransfer LV2_ATOM_PREFIX "atomTransfer" ///< http://lv2plug.in/ns/ext/atom#atomTransfer +#define LV2_ATOM__beatTime LV2_ATOM_PREFIX "beatTime" ///< http://lv2plug.in/ns/ext/atom#beatTime +#define LV2_ATOM__bufferType LV2_ATOM_PREFIX "bufferType" ///< http://lv2plug.in/ns/ext/atom#bufferType +#define LV2_ATOM__childType LV2_ATOM_PREFIX "childType" ///< http://lv2plug.in/ns/ext/atom#childType +#define LV2_ATOM__eventTransfer LV2_ATOM_PREFIX "eventTransfer" ///< http://lv2plug.in/ns/ext/atom#eventTransfer +#define LV2_ATOM__frameTime LV2_ATOM_PREFIX "frameTime" ///< http://lv2plug.in/ns/ext/atom#frameTime +#define LV2_ATOM__supports LV2_ATOM_PREFIX "supports" ///< http://lv2plug.in/ns/ext/atom#supports +#define LV2_ATOM__timeUnit LV2_ATOM_PREFIX "timeUnit" ///< http://lv2plug.in/ns/ext/atom#timeUnit + +// clang-format on + +#define LV2_ATOM_REFERENCE_TYPE 0 ///< The special type for a reference atom + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond */ +/** This expression will fail to compile if double does not fit in 64 bits. */ +typedef char lv2_atom_assert_double_fits_in_64_bits + [((sizeof(double) <= sizeof(uint64_t)) * 2) - 1]; +/** @endcond */ + +/** + Return a pointer to the contents of an Atom. The "contents" of an atom + is the data past the complete type-specific header. + @param type The type of the atom, for example LV2_Atom_String. + @param atom A variable-sized atom. +*/ +#define LV2_ATOM_CONTENTS(type, atom) ((void*)((uint8_t*)(atom) + sizeof(type))) + +/** + Const version of LV2_ATOM_CONTENTS. +*/ +#define LV2_ATOM_CONTENTS_CONST(type, atom) \ + ((const void*)((const uint8_t*)(atom) + sizeof(type))) + +/** + Return a pointer to the body of an Atom. The "body" of an atom is the + data just past the LV2_Atom head (i.e. the same offset for all types). +*/ +#define LV2_ATOM_BODY(atom) LV2_ATOM_CONTENTS(LV2_Atom, atom) + +/** + Const version of LV2_ATOM_BODY. +*/ +#define LV2_ATOM_BODY_CONST(atom) LV2_ATOM_CONTENTS_CONST(LV2_Atom, atom) + +/** The header of an atom:Atom. */ +typedef struct { + uint32_t size; /**< Size in bytes, not including type and size. */ + uint32_t type; /**< Type of this atom (mapped URI). */ +} LV2_Atom; + +/** An atom:Int or atom:Bool. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + int32_t body; /**< Integer value. */ +} LV2_Atom_Int; + +/** An atom:Long. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + int64_t body; /**< Integer value. */ +} LV2_Atom_Long; + +/** An atom:Float. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + float body; /**< Floating point value. */ +} LV2_Atom_Float; + +/** An atom:Double. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + double body; /**< Floating point value. */ +} LV2_Atom_Double; + +/** An atom:Bool. May be cast to LV2_Atom. */ +typedef LV2_Atom_Int LV2_Atom_Bool; + +/** An atom:URID. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + uint32_t body; /**< URID. */ +} LV2_Atom_URID; + +/** An atom:String. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + /* Contents (a null-terminated UTF-8 string) follow here. */ +} LV2_Atom_String; + +/** The body of an atom:Literal. */ +typedef struct { + uint32_t datatype; /**< Datatype URID. */ + uint32_t lang; /**< Language URID. */ + /* Contents (a null-terminated UTF-8 string) follow here. */ +} LV2_Atom_Literal_Body; + +/** An atom:Literal. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Literal_Body body; /**< Body. */ +} LV2_Atom_Literal; + +/** An atom:Tuple. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + /* Contents (a series of complete atoms) follow here. */ +} LV2_Atom_Tuple; + +/** The body of an atom:Vector. */ +typedef struct { + uint32_t child_size; /**< The size of each element in the vector. */ + uint32_t child_type; /**< The type of each element in the vector. */ + /* Contents (a series of packed atom bodies) follow here. */ +} LV2_Atom_Vector_Body; + +/** An atom:Vector. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Vector_Body body; /**< Body. */ +} LV2_Atom_Vector; + +/** The body of an atom:Property (typically in an atom:Object). */ +typedef struct { + uint32_t key; /**< Key (predicate) (mapped URI). */ + uint32_t context; /**< Context URID (may be, and generally is, 0). */ + LV2_Atom value; /**< Value atom header. */ + /* Value atom body follows here. */ +} LV2_Atom_Property_Body; + +/** An atom:Property. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Property_Body body; /**< Body. */ +} LV2_Atom_Property; + +/** The body of an atom:Object. May be cast to LV2_Atom. */ +typedef struct { + uint32_t id; /**< URID, or 0 for blank. */ + uint32_t otype; /**< Type URID (same as rdf:type, for fast dispatch). */ + /* Contents (a series of property bodies) follow here. */ +} LV2_Atom_Object_Body; + +/** An atom:Object. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Object_Body body; /**< Body. */ +} LV2_Atom_Object; + +/** The header of an atom:Event. Note this type is NOT an LV2_Atom. */ +typedef struct { + /** Time stamp. Which type is valid is determined by context. */ + union { + int64_t frames; /**< Time in audio frames. */ + double beats; /**< Time in beats. */ + } time; + LV2_Atom body; /**< Event body atom header. */ + /* Body atom contents follow here. */ +} LV2_Atom_Event; + +/** + The body of an atom:Sequence (a sequence of events). + + The unit field is either a URID that described an appropriate time stamp + type, or may be 0 where a default stamp type is known. For + LV2_Descriptor::run(), the default stamp type is audio frames. + + The contents of a sequence is a series of LV2_Atom_Event, each aligned + to 64-bits, for example: +
+   | Event 1 (size 6)                              | Event 2
+   |       |       |       |       |       |       |       |       |
+   | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+   |FRAMES |SUBFRMS|TYPE   |SIZE   |DATADATADATAPAD|FRAMES |SUBFRMS|...
+   
+*/ +typedef struct { + uint32_t unit; /**< URID of unit of event time stamps. */ + uint32_t pad; /**< Currently unused. */ + /* Contents (a series of events) follow here. */ +} LV2_Atom_Sequence_Body; + +/** An atom:Sequence. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Sequence_Body body; /**< Body. */ +} LV2_Atom_Sequence; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_ATOM_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,542 @@ +@prefix atom: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Atom" ; + doap:shortdesc "A generic value container and several data types." ; + doap:license ; + doap:created "2007-00-00" ; + doap:developer ; + doap:release [ + doap:revision "2.2" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2_atom_object_get_typed() for easy type-safe access to object properties." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Deprecate Blank and Resource in favour of just Object." + ] , [ + rdfs:label "Add lv2_atom_forge_is_object_type() and lv2_atom_forge_is_blank() to ease backwards compatibility." + ] , [ + rdfs:label "Add lv2_atom_forge_key() for terser object writing." + ] , [ + rdfs:label "Add lv2_atom_sequence_clear() and lv2_atom_sequence_append_event() helper functions." + ] + ] + ] , [ + doap:revision "1.8" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make lv2_atom_*_is_end() arguments const." + ] + ] + ] , [ + doap:revision "1.6" ; + doap:created "2013-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix crash in forge.h when pushing atoms to a full buffer." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2013-01-27" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix lv2_atom_sequence_end()." + ] , [ + rdfs:label "Remove atom:stringType in favour of owl:onDatatype so generic tools can understand and validate atom literals." + ] , [ + rdfs:label "Improve atom documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix implicit conversions in forge.h that are invalid in C++11." + ] , [ + rdfs:label "Fix lv2_atom_object_next() on 32-bit platforms." + ] , [ + rdfs:label "Add lv2_atom_object_body_get()." + ] , [ + rdfs:label "Fix outdated documentation in forge.h." + ] , [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add LV2_ATOM_CONTENTS_CONST and LV2_ATOM_BODY_CONST." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +An atom:Atom is a simple generic data container for holding any type of Plain +Old Data (POD). An Atom can contain simple primitive types like integers, +floating point numbers, and strings; as well as structured data like lists and +dictionary-like Objects. Since Atoms are POD, they can be easily copied +(for example, with `memcpy()`) anywhere and are suitable for use in real-time +code. + +Every atom starts with an LV2_Atom header, followed by the contents. This +allows code to process atoms without requiring special code for every type of +data. For example, plugins that mutually understand a type can be used +together in a host that does not understand that type, because the host is only +required to copy atoms, not interpret their contents. Similarly, plugins (such +as routers, delays, or data structures) can meaningfully process atoms of a +type unknown to them. + +Atoms should be used anywhere values of various types must be stored or +transmitted. An atom:AtomPort can be used to transmit atoms via ports. An +atom:AtomPort that contains a atom:Sequence can be used for sample accurate +communication of events, such as MIDI. + +### Serialisation + +Each Atom type defines a binary format for use at runtime, but also a +serialisation that is natural to express in Turtle format. Thus, this +specification defines a powerful real-time appropriate data model, as well as a +portable way to serialise any data in that model. This is particularly useful +for inter-process communication, saving/restoring state, and describing values +in plugin data files. + +### Custom Atom Types + +While it is possible to define new Atom types for any binary format, the +standard types defined here are powerful enough to describe almost anything. +Implementations SHOULD build structures out of the types provided here, rather +than define new binary formats (for example, using atom:Object rather than a +new C `struct` type). Host and tool implementations have support for +serialising all standard types, so new binary formats are an implementation +burden which harms interoperabilty. In particular, plugins SHOULD NOT expect +UI communication or state saving with custom binary types to work. In general, +new Atom types should only be defined where absolutely necessary due to +performance reasons and serialisation is not a concern. + +"""^^lv2:Markdown . + +atom:Atom + lv2:documentation """ + +An LV2_Atom has a 32-bit `size` and `type`, followed by a body of `size` bytes. +Atoms MUST be 64-bit aligned. + +All concrete Atom types (subclasses of this class) MUST define a precise binary +layout for their body. + +The `type` field is the URI of an Atom type mapped to an integer. +Implementations SHOULD gracefully pass through, or ignore, atoms with unknown +types. + +All atoms are POD by definition except references, which as a special case have +`type` 0. An Atom MUST NOT contain a Reference. It is safe to copy any +non-reference Atom with a simple `memcpy`, even if the implementation does not +understand `type`. Though this extension reserves the type 0 for references, +the details of reference handling are currently unspecified. A future revision +of this extension, or a different extension, may define how to use non-POD data +and references. Implementations MUST NOT send references to another +implementation unless the receiver is explicitly known to support references +(e.g. by supporting a feature). + +The special case of a null atom with both `type` and `size` 0 is not considered +a reference. + +"""^^lv2:Markdown . + +atom:Chunk + lv2:documentation """ + +This type is used to indicate a certain amount of space is available. For +example, output ports with a variably sized type are connected to a Chunk so +the plugin knows the size of the buffer available for writing. + +The use of a Chunk should be constrained to a local scope, since +interpreting it is impossible without context. However, if serialised to RDF, +a Chunk may be represented directly as an xsd:base64Binary string, for example: + + :::turtle + [] eg:someChunk "vu/erQ=="^^xsd:base64Binary . + +"""^^lv2:Markdown . + +atom:String + lv2:documentation """ + +The body of an LV2_Atom_String is a C string in UTF-8 encoding, i.e. an array +of bytes (`uint8_t`) terminated with a NULL byte (`'\\0'`). + +This type is for free-form strings, but SHOULD NOT be used for typed data or +text in any language. Use atom:Literal unless translating the string does not +make sense and the string has no meaningful datatype. + +"""^^lv2:Markdown . + +atom:Literal + lv2:documentation """ + +This type is compatible with rdfs:Literal and is capable of expressing a +string in any language or a value of any type. A Literal has a +`datatype` and `lang` followed by string data in UTF-8 +encoding. The length of the string data in bytes is `size - +sizeof(LV2_Atom_Literal)`, including the terminating NULL character. The +`lang` field SHOULD be a URI of the form +`http://lexvo.org/id/iso639-3/LANG` or +`http://lexvo.org/id/iso639-1/LANG` where LANG is a 3-character ISO 693-3 +language code, or a 2-character ISO 693-1 language code, respectively. + +A Literal may have a `datatype` or a `lang`, but never both. + +For example, a Literal can be Hello in English: + + :::c + void set_to_hello_in_english(LV2_Atom_Literal* lit) { + lit->atom.type = map(expand("atom:Literal")); + lit->atom.size = 14; + lit->body.datatype = 0; + lit->body.lang = map("http://lexvo.org/id/iso639-1/en"); + memcpy(LV2_ATOM_CONTENTS(LV2_Atom_Literal, lit), + "Hello", + sizeof("Hello")); // Assumes enough space + } + +or a Turtle string: + + :::c + void set_to_turtle_string(LV2_Atom_Literal* lit, const char* ttl) { + lit->atom.type = map(expand("atom:Literal")); + lit->atom.size = 64; + lit->body.datatype = map("http://www.w3.org/2008/turtle#turtle"); + lit->body.lang = 0; + memcpy(LV2_ATOM_CONTENTS(LV2_Atom_Literal, lit), + ttl, + strlen(ttl) + 1); // Assumes enough space + } + +"""^^lv2:Markdown . + +atom:Path + lv2:documentation """ + +A Path is a URI reference with only a path component: no scheme, authority, +query, or fragment. In particular, paths to files in the same bundle may be +cleanly written in Turtle files as a relative URI. However, implementations +may assume any binary Path (e.g. in an event payload) is a valid file path +which can passed to system functions like fopen() directly, without any +character encoding or escape expansion required. + +Any implemenation that creates a Path atom to transmit to another is +responsible for ensuring it is valid. A Path SHOULD always be absolute, unless +there is some mechanism in place that defines a base path. Since this is not +the case for plugin instances, effectively any Path sent to or received from a +plugin instance MUST be absolute. + +"""^^lv2:Markdown . + +atom:URI + lv2:documentation """ + +This is useful when a URI is needed but mapping is inappropriate, for example +with temporary or relative URIs. Since the ability to distinguish URIs from +plain strings is often necessary, URIs MUST NOT be transmitted as atom:String. + +This is not strictly a URI, since UTF-8 is allowed. Escaping and related +issues are the host's responsibility. + +"""^^lv2:Markdown . + +atom:URID + lv2:documentation """ + +A URID is typically generated with the LV2_URID_Map provided by the host . + +"""^^lv2:Markdown . + +atom:Vector + lv2:documentation """ + +A homogeneous series of atom bodies with equivalent type and size. + +An LV2_Atom_Vector is a 32-bit `child_size` and `child_type` followed by `size +/ child_size` atom bodies. + +For example, an atom:Vector containing 42 elements of type atom:Float: + + :::c + struct VectorOf42Floats { + uint32_t size; // sizeof(LV2_Atom_Vector_Body) + (42 * sizeof(float); + uint32_t type; // map(expand("atom:Vector")) + uint32_t child_size; // sizeof(float) + uint32_t child_type; // map(expand("atom:Float")) + float elems[42]; + }; + +Note that it is possible to construct a valid Atom for each element of the +vector, even by an implementation which does not understand `child_type`. + +If serialised to RDF, a Vector SHOULD have the form: + + :::turtle + eg:someVector + a atom:Vector ; + atom:childType atom:Int ; + rdf:value ( + "1"^^xsd:int + "2"^^xsd:int + "3"^^xsd:int + "4"^^xsd:int + ) . + +"""^^lv2:Markdown . + +atom:Tuple + lv2:documentation """ + +The body of a Tuple is simply a series of complete atoms, each aligned to +64 bits. + +If serialised to RDF, a Tuple SHOULD have the form: + + :::turtle + eg:someVector + a atom:Tuple ; + rdf:value ( + "1"^^xsd:int + "3.5"^^xsd:float + "etc" + ) . + +"""^^lv2:Markdown . + +atom:Property + lv2:documentation """ + +An LV2_Atom_Property has a URID `key` and `context`, and an Atom `value`. This +corresponds to an RDF Property, where the key is the predicate +and the value is the object. + +The `context` field can be used to specify a different context for each +property, where this is useful. Otherwise, it may be 0. + +Properties generally only exist as part of an atom:Object. Accordingly, +they will typically be represented directly as properties in RDF (see +atom:Object). If this is not possible, they may be expressed as partial +reified statements, for example: + + :::turtle + eg:someProperty + rdf:predicate eg:theKey ; + rdf:object eg:theValue . + +"""^^lv2:Markdown . + +atom:Object + lv2:documentation """ + +An Object is an atom with a set of properties. This corresponds to an +RDF Resource, and can be thought of as a dictionary with URID keys. + +An LV2_Atom_Object body has a uint32_t `id` and `type`, followed by a series of +atom:Property bodies (LV2_Atom_Property_Body). The LV2_Atom_Object_Body::otype +field is equivalent to a property with key rdf:type, but is included in the +structure to allow for fast dispatching. + +Code SHOULD check for objects using lv2_atom_forge_is_object() or +lv2_atom_forge_is_blank() if a forge is available, rather than checking the +atom type directly. This will correctly handle the deprecated atom:Resource +and atom:Blank types. + +When serialised to RDF, an Object is represented as a resource, for example: + + :::turtle + eg:someObject + eg:firstPropertyKey "first property value" ; + eg:secondPropertyKey "first loser" ; + eg:andSoOn "and so on" . + +"""^^lv2:Markdown . + +atom:Resource + lv2:documentation """ + +This class is deprecated. Use atom:Object directly instead. + +An atom:Object where the id field is a URID, that is, an Object +with a URI. + +"""^^lv2:Markdown . + +atom:Blank + lv2:documentation """ + +This class is deprecated. Use atom:Object with ID 0 instead. + +An atom:Object where the LV2_Atom_Object::id is a blank node ID (NOT a URI). +The ID of a Blank is valid only within the context the Blank appears in. For +ports this is the context of the associated run() call, i.e. all ports share +the same context so outputs can contain IDs that correspond to IDs of blanks in +the input. + +"""^^lv2:Markdown . + +atom:Sound + lv2:documentation """ + +The format of a atom:Sound is the same as the buffer format for lv2:AudioPort +(except the size may be arbitrary). An atom:Sound inherently depends on the +sample rate, which is assumed to be known from context. Because of this, +directly serialising an atom:Sound is probably a bad idea, use a standard +format like WAV instead. + +"""^^lv2:Markdown . + +atom:Event + lv2:documentation """ + +An Event is typically an element of an atom:Sequence. Note that this is not an Atom type since it begins with a timestamp, not an atom header. + +"""^^lv2:Markdown . + +atom:Sequence + lv2:documentation """ + +A flat sequence of atom:Event, that is, a series of time-stamped Atoms. + +LV2_Atom_Sequence_Body.unit describes the time unit for the contained atoms. +If the unit is known from context (e.g. run() stamps are always audio frames), +this field may be zero. Otherwise, it SHOULD be either units:frame or +units:beat, in which case ev.time.frames or ev.time.beats is valid, +respectively. + +If serialised to RDF, a Sequence has a similar form to atom:Vector, but for +brevity the elements may be assumed to be atom:Event, for example: + + :::turtle + eg:someSequence + a atom:Sequence ; + rdf:value ( + [ + atom:frameTime 1 ; + rdf:value "901A01"^^midi:MidiEvent + ] [ + atom:frameTime 3 ; + rdf:value "902B02"^^midi:MidiEvent + ] + ) . + +"""^^lv2:Markdown . + +atom:AtomPort + lv2:documentation """ + +Ports of this type are connected to an LV2_Atom with a type specified by +atom:bufferType. + +Output ports with a variably sized type MUST be initialised by the host before +every run() to an atom:Chunk with size set to the available space. The plugin +reads this size to know how much space is available for writing. In all cases, +the plugin MUST write a complete atom (including header) to outputs. However, +to be robust, hosts SHOULD initialise output ports to a safe sentinel (e.g. the +null Atom) before calling run(). + +"""^^lv2:Markdown . + +atom:bufferType + lv2:documentation """ + +Indicates that an AtomPort may be connected to a certain Atom type. A port MAY +support several buffer types. The host MUST NOT connect a port to an Atom with +a type not explicitly listed with this property. The value of this property +MUST be a sub-class of atom:Atom. For example, an input port that is connected +directly to an LV2_Atom_Double value is described like so: + + :::turtle + + lv2:port [ + a lv2:InputPort , atom:AtomPort ; + atom:bufferType atom:Double ; + ] . + +This property only describes the types a port may be directly connected to. It +says nothing about the expected contents of containers. For that, use +atom:supports. + +"""^^lv2:Markdown . + +atom:supports + lv2:documentation """ + +This property is defined loosely, it may be used to indicate that anything +supports an Atom type, wherever that may be useful. It applies +recursively where collections are involved. + +In particular, this property can be used to describe which event types are +expected by a port. For example, a port that receives MIDI events is described +like so: + + :::turtle + + lv2:port [ + a lv2:InputPort , atom:AtomPort ; + atom:bufferType atom:Sequence ; + atom:supports midi:MidiEvent ; + ] . + +"""^^lv2:Markdown . + +atom:eventTransfer + lv2:documentation """ + +Transfer of individual events in a port buffer. Useful as the `format` for a +LV2UI_Write_Function. + +This protocol applies to ports which contain events, usually in an +atom:Sequence. The host must transfer each individual event to the recipient. +The format of the received data is an LV2_Atom, there is no timestamp header. + +"""^^lv2:Markdown . + +atom:atomTransfer + lv2:documentation """ + +Transfer of the complete atom in a port buffer. Useful as the `format` for a +LV2UI_Write_Function. + +This protocol applies to atom ports. The host must transfer the complete atom +contained in the port, including header. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,367 @@ +/* + Copyright 2012-2015 David Robillard + + 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. +*/ + +#include "lv2/atom/atom-test-utils.c" +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" +#include "lv2/atom/util.h" +#include "lv2/urid/urid.h" + +#include +#include +#include +#include +#include + +int +main(void) +{ + LV2_URID_Map map = {NULL, urid_map}; + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + + LV2_URID eg_Object = urid_map(NULL, "http://example.org/Object"); + LV2_URID eg_one = urid_map(NULL, "http://example.org/one"); + LV2_URID eg_two = urid_map(NULL, "http://example.org/two"); + LV2_URID eg_three = urid_map(NULL, "http://example.org/three"); + LV2_URID eg_four = urid_map(NULL, "http://example.org/four"); + LV2_URID eg_true = urid_map(NULL, "http://example.org/true"); + LV2_URID eg_false = urid_map(NULL, "http://example.org/false"); + LV2_URID eg_path = urid_map(NULL, "http://example.org/path"); + LV2_URID eg_uri = urid_map(NULL, "http://example.org/uri"); + LV2_URID eg_urid = urid_map(NULL, "http://example.org/urid"); + LV2_URID eg_string = urid_map(NULL, "http://example.org/string"); + LV2_URID eg_literal = urid_map(NULL, "http://example.org/literal"); + LV2_URID eg_tuple = urid_map(NULL, "http://example.org/tuple"); + LV2_URID eg_vector = urid_map(NULL, "http://example.org/vector"); + LV2_URID eg_vector2 = urid_map(NULL, "http://example.org/vector2"); + LV2_URID eg_seq = urid_map(NULL, "http://example.org/seq"); + +#define BUF_SIZE 1024 +#define NUM_PROPS 15 + + uint8_t buf[BUF_SIZE]; + lv2_atom_forge_set_buffer(&forge, buf, BUF_SIZE); + + LV2_Atom_Forge_Frame obj_frame; + LV2_Atom* obj = lv2_atom_forge_deref( + &forge, lv2_atom_forge_object(&forge, &obj_frame, 0, eg_Object)); + + // eg_one = (Int)1 + lv2_atom_forge_key(&forge, eg_one); + LV2_Atom_Int* one = + (LV2_Atom_Int*)lv2_atom_forge_deref(&forge, lv2_atom_forge_int(&forge, 1)); + if (one->body != 1) { + return test_fail("%d != 1\n", one->body); + } + + // eg_two = (Long)2 + lv2_atom_forge_key(&forge, eg_two); + LV2_Atom_Long* two = (LV2_Atom_Long*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_long(&forge, 2)); + if (two->body != 2) { + return test_fail("%" PRId64 " != 2\n", two->body); + } + + // eg_three = (Float)3.0 + lv2_atom_forge_key(&forge, eg_three); + LV2_Atom_Float* three = (LV2_Atom_Float*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_float(&forge, 3.0f)); + if (three->body != 3) { + return test_fail("%f != 3\n", three->body); + } + + // eg_four = (Double)4.0 + lv2_atom_forge_key(&forge, eg_four); + LV2_Atom_Double* four = (LV2_Atom_Double*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_double(&forge, 4.0)); + if (four->body != 4) { + return test_fail("%f != 4\n", four->body); + } + + // eg_true = (Bool)1 + lv2_atom_forge_key(&forge, eg_true); + LV2_Atom_Bool* t = (LV2_Atom_Bool*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_bool(&forge, true)); + if (t->body != 1) { + return test_fail("%d != 1 (true)\n", t->body); + } + + // eg_false = (Bool)0 + lv2_atom_forge_key(&forge, eg_false); + LV2_Atom_Bool* f = (LV2_Atom_Bool*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_bool(&forge, false)); + if (f->body != 0) { + return test_fail("%d != 0 (false)\n", f->body); + } + + // eg_path = (Path)"/foo/bar" + const char* pstr = "/foo/bar"; + const uint32_t pstr_len = (uint32_t)strlen(pstr); + lv2_atom_forge_key(&forge, eg_path); + LV2_Atom_String* path = (LV2_Atom_String*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_uri(&forge, pstr, pstr_len)); + char* pbody = (char*)LV2_ATOM_BODY(path); + if (strcmp(pbody, pstr)) { + return test_fail("%s != \"%s\"\n", pbody, pstr); + } + + // eg_uri = (URI)"http://example.org/value" + const char* ustr = "http://example.org/value"; + const uint32_t ustr_len = (uint32_t)strlen(ustr); + lv2_atom_forge_key(&forge, eg_uri); + LV2_Atom_String* uri = (LV2_Atom_String*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_uri(&forge, ustr, ustr_len)); + char* ubody = (char*)LV2_ATOM_BODY(uri); + if (strcmp(ubody, ustr)) { + return test_fail("%s != \"%s\"\n", ubody, ustr); + } + + // eg_urid = (URID)"http://example.org/value" + LV2_URID eg_value = urid_map(NULL, "http://example.org/value"); + lv2_atom_forge_key(&forge, eg_urid); + LV2_Atom_URID* urid = (LV2_Atom_URID*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_urid(&forge, eg_value)); + if (urid->body != eg_value) { + return test_fail("%u != %u\n", urid->body, eg_value); + } + + // eg_string = (String)"hello" + lv2_atom_forge_key(&forge, eg_string); + LV2_Atom_String* string = (LV2_Atom_String*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_string(&forge, "hello", strlen("hello"))); + char* sbody = (char*)LV2_ATOM_BODY(string); + if (strcmp(sbody, "hello")) { + return test_fail("%s != \"hello\"\n", sbody); + } + + // eg_literal = (Literal)"hello"@fr + lv2_atom_forge_key(&forge, eg_literal); + LV2_Atom_Literal* literal = (LV2_Atom_Literal*)lv2_atom_forge_deref( + &forge, + lv2_atom_forge_literal(&forge, + "bonjour", + strlen("bonjour"), + 0, + urid_map(NULL, "http://lexvo.org/id/term/fr"))); + char* lbody = (char*)LV2_ATOM_CONTENTS(LV2_Atom_Literal, literal); + if (strcmp(lbody, "bonjour")) { + return test_fail("%s != \"bonjour\"\n", lbody); + } + + // eg_tuple = "foo",true + lv2_atom_forge_key(&forge, eg_tuple); + LV2_Atom_Forge_Frame tuple_frame; + LV2_Atom_Tuple* tuple = (LV2_Atom_Tuple*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_tuple(&forge, &tuple_frame)); + LV2_Atom_String* tup0 = (LV2_Atom_String*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_string(&forge, "foo", strlen("foo"))); + LV2_Atom_Bool* tup1 = (LV2_Atom_Bool*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_bool(&forge, true)); + lv2_atom_forge_pop(&forge, &tuple_frame); + LV2_Atom* i = lv2_atom_tuple_begin(tuple); + if (lv2_atom_tuple_is_end(LV2_ATOM_BODY(tuple), tuple->atom.size, i)) { + return test_fail("Tuple iterator is empty\n"); + } + LV2_Atom* tup0i = i; + if (!lv2_atom_equals((LV2_Atom*)tup0, tup0i)) { + return test_fail("Corrupt tuple element 0\n"); + } + i = lv2_atom_tuple_next(i); + if (lv2_atom_tuple_is_end(LV2_ATOM_BODY(tuple), tuple->atom.size, i)) { + return test_fail("Premature end of tuple iterator\n"); + } + LV2_Atom* tup1i = i; + if (!lv2_atom_equals((LV2_Atom*)tup1, tup1i)) { + return test_fail("Corrupt tuple element 1\n"); + } + i = lv2_atom_tuple_next(i); + if (!lv2_atom_tuple_is_end(LV2_ATOM_BODY(tuple), tuple->atom.size, i)) { + return test_fail("Tuple iter is not at end\n"); + } + + // eg_vector = (Vector)1,2,3,4 + lv2_atom_forge_key(&forge, eg_vector); + int32_t elems[] = {1, 2, 3, 4}; + LV2_Atom_Vector* vector = (LV2_Atom_Vector*)lv2_atom_forge_deref( + &forge, + lv2_atom_forge_vector(&forge, sizeof(int32_t), forge.Int, 4, elems)); + void* vec_body = LV2_ATOM_CONTENTS(LV2_Atom_Vector, vector); + if (memcmp(elems, vec_body, sizeof(elems))) { + return test_fail("Corrupt vector\n"); + } + + // eg_vector2 = (Vector)1,2,3,4 + lv2_atom_forge_key(&forge, eg_vector2); + LV2_Atom_Forge_Frame vec_frame; + LV2_Atom_Vector* vector2 = (LV2_Atom_Vector*)lv2_atom_forge_deref( + &forge, + lv2_atom_forge_vector_head(&forge, &vec_frame, sizeof(int32_t), forge.Int)); + for (unsigned e = 0; e < sizeof(elems) / sizeof(int32_t); ++e) { + lv2_atom_forge_int(&forge, elems[e]); + } + lv2_atom_forge_pop(&forge, &vec_frame); + if (!lv2_atom_equals(&vector->atom, &vector2->atom)) { + return test_fail("Vector != Vector2\n"); + } + + // eg_seq = (Sequence)1, 2 + lv2_atom_forge_key(&forge, eg_seq); + LV2_Atom_Forge_Frame seq_frame; + LV2_Atom_Sequence* seq = (LV2_Atom_Sequence*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_sequence_head(&forge, &seq_frame, 0)); + lv2_atom_forge_frame_time(&forge, 0); + lv2_atom_forge_int(&forge, 1); + lv2_atom_forge_frame_time(&forge, 1); + lv2_atom_forge_int(&forge, 2); + lv2_atom_forge_pop(&forge, &seq_frame); + + lv2_atom_forge_pop(&forge, &obj_frame); + + // Test equality + LV2_Atom_Int itwo = {{forge.Int, sizeof(int32_t)}, 2}; + if (lv2_atom_equals((LV2_Atom*)one, (LV2_Atom*)two)) { + return test_fail("1 == 2.0\n"); + } else if (lv2_atom_equals((LV2_Atom*)one, (LV2_Atom*)&itwo)) { + return test_fail("1 == 2\n"); + } else if (!lv2_atom_equals((LV2_Atom*)one, (LV2_Atom*)one)) { + return test_fail("1 != 1\n"); + } + + unsigned n_events = 0; + LV2_ATOM_SEQUENCE_FOREACH (seq, ev) { + if (ev->time.frames != n_events) { + return test_fail("Corrupt event %u has bad time\n", n_events); + } else if (ev->body.type != forge.Int) { + return test_fail("Corrupt event %u has bad type\n", n_events); + } else if (((LV2_Atom_Int*)&ev->body)->body != (int)n_events + 1) { + return test_fail("Event %u != %u\n", n_events, n_events + 1); + } + ++n_events; + } + + int n_props = 0; + LV2_ATOM_OBJECT_FOREACH ((LV2_Atom_Object*)obj, prop) { + if (!prop->key) { + return test_fail("Corrupt property %d has no key\n", n_props); + } else if (prop->context) { + return test_fail("Corrupt property %d has context\n", n_props); + } + ++n_props; + } + + if (n_props != NUM_PROPS) { + return test_fail( + "Corrupt object has %d properties != %d\n", n_props, NUM_PROPS); + } + + struct { + const LV2_Atom* one; + const LV2_Atom* two; + const LV2_Atom* three; + const LV2_Atom* four; + const LV2_Atom* affirmative; + const LV2_Atom* negative; + const LV2_Atom* path; + const LV2_Atom* uri; + const LV2_Atom* urid; + const LV2_Atom* string; + const LV2_Atom* literal; + const LV2_Atom* tuple; + const LV2_Atom* vector; + const LV2_Atom* vector2; + const LV2_Atom* seq; + } matches; + + memset(&matches, 0, sizeof(matches)); + + LV2_Atom_Object_Query q[] = {{eg_one, &matches.one}, + {eg_two, &matches.two}, + {eg_three, &matches.three}, + {eg_four, &matches.four}, + {eg_true, &matches.affirmative}, + {eg_false, &matches.negative}, + {eg_path, &matches.path}, + {eg_uri, &matches.uri}, + {eg_urid, &matches.urid}, + {eg_string, &matches.string}, + {eg_literal, &matches.literal}, + {eg_tuple, &matches.tuple}, + {eg_vector, &matches.vector}, + {eg_vector2, &matches.vector2}, + {eg_seq, &matches.seq}, + LV2_ATOM_OBJECT_QUERY_END}; + + int n_matches = lv2_atom_object_query((LV2_Atom_Object*)obj, q); + for (int n = 0; n < 2; ++n) { + if (n_matches != n_props) { + return test_fail("Query failed, %d matches != %d\n", n_matches, n_props); + } else if (!lv2_atom_equals((LV2_Atom*)one, matches.one)) { + return test_fail("Bad match one\n"); + } else if (!lv2_atom_equals((LV2_Atom*)two, matches.two)) { + return test_fail("Bad match two\n"); + } else if (!lv2_atom_equals((LV2_Atom*)three, matches.three)) { + return test_fail("Bad match three\n"); + } else if (!lv2_atom_equals((LV2_Atom*)four, matches.four)) { + return test_fail("Bad match four\n"); + } else if (!lv2_atom_equals((LV2_Atom*)t, matches.affirmative)) { + return test_fail("Bad match true\n"); + } else if (!lv2_atom_equals((LV2_Atom*)f, matches.negative)) { + return test_fail("Bad match false\n"); + } else if (!lv2_atom_equals((LV2_Atom*)path, matches.path)) { + return test_fail("Bad match path\n"); + } else if (!lv2_atom_equals((LV2_Atom*)uri, matches.uri)) { + return test_fail("Bad match URI\n"); + } else if (!lv2_atom_equals((LV2_Atom*)string, matches.string)) { + return test_fail("Bad match string\n"); + } else if (!lv2_atom_equals((LV2_Atom*)literal, matches.literal)) { + return test_fail("Bad match literal\n"); + } else if (!lv2_atom_equals((LV2_Atom*)tuple, matches.tuple)) { + return test_fail("Bad match tuple\n"); + } else if (!lv2_atom_equals((LV2_Atom*)vector, matches.vector)) { + return test_fail("Bad match vector\n"); + } else if (!lv2_atom_equals((LV2_Atom*)vector, matches.vector2)) { + return test_fail("Bad match vector2\n"); + } else if (!lv2_atom_equals((LV2_Atom*)seq, matches.seq)) { + return test_fail("Bad match sequence\n"); + } + memset(&matches, 0, sizeof(matches)); + + // clang-format off + n_matches = lv2_atom_object_get((LV2_Atom_Object*)obj, + eg_one, &matches.one, + eg_two, &matches.two, + eg_three, &matches.three, + eg_four, &matches.four, + eg_true, &matches.affirmative, + eg_false, &matches.negative, + eg_path, &matches.path, + eg_uri, &matches.uri, + eg_urid, &matches.urid, + eg_string, &matches.string, + eg_literal, &matches.literal, + eg_tuple, &matches.tuple, + eg_vector, &matches.vector, + eg_vector2, &matches.vector2, + eg_seq, &matches.seq, + 0); + // clang-format on + } + + free_urid_map(); + + return 0; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,73 @@ +/* + Copyright 2012-2018 David Robillard + + 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. +*/ + +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" +#include "lv2/atom/util.h" +#include "lv2/log/log.h" +#include "lv2/urid/urid.h" + +#include +#include +#include + +static char** uris = NULL; +static uint32_t n_uris = 0; + +static char* +copy_string(const char* str) +{ + const size_t len = strlen(str); + char* dup = (char*)malloc(len + 1); + memcpy(dup, str, len + 1); + return dup; +} + +static LV2_URID +urid_map(LV2_URID_Map_Handle handle, const char* uri) +{ + for (uint32_t i = 0; i < n_uris; ++i) { + if (!strcmp(uris[i], uri)) { + return i + 1; + } + } + + uris = (char**)realloc(uris, ++n_uris * sizeof(char*)); + uris[n_uris - 1] = copy_string(uri); + return n_uris; +} + +static void +free_urid_map(void) +{ + for (uint32_t i = 0; i < n_uris; ++i) { + free(uris[i]); + } + + free(uris); +} + +LV2_LOG_FUNC(1, 2) +static int +test_fail(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, args); + va_end(args); + return 1; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,247 @@ +@prefix atom: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . +@prefix units: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:seeAlso , + , + , + ; + rdfs:label "LV2 Atom" ; + rdfs:comment "A generic value container and several data types." . + +atom:cType + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "C type" ; + rdfs:comment "The C type that describes the binary representation of an Atom type." ; + rdfs:domain rdfs:Class ; + rdfs:range lv2:Symbol . + +atom:Atom + a rdfs:Class ; + rdfs:label "Atom" ; + rdfs:comment "Abstract base class for all atoms." ; + atom:cType "LV2_Atom" . + +atom:Chunk + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Chunk" ; + rdfs:comment "A chunk of memory with undefined contents." ; + owl:onDatatype xsd:base64Binary . + +atom:Number + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Number" ; + rdfs:comment "Base class for numeric types." . + +atom:Int + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Int" ; + rdfs:comment "A native `int32_t`." ; + atom:cType "LV2_Atom_Int" ; + owl:onDatatype xsd:int . + +atom:Long + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Long" ; + rdfs:comment "A native `int64_t`." ; + atom:cType "LV2_Atom_Long" ; + owl:onDatatype xsd:long . + +atom:Float + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Float" ; + rdfs:comment "A native `float`." ; + atom:cType "LV2_Atom_Float" ; + owl:onDatatype xsd:float . + +atom:Double + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Double" ; + rdfs:comment "A native `double`." ; + atom:cType "LV2_Atom_Double" ; + owl:onDatatype xsd:double . + +atom:Bool + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Bool" ; + rdfs:comment "An atom:Int where 0 is false and any other value is true." ; + atom:cType "LV2_Atom_Bool" ; + owl:onDatatype xsd:boolean . + +atom:String + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Atom ; + rdfs:label "String" ; + rdfs:comment "A UTF-8 string." ; + atom:cType "LV2_Atom_String" ; + owl:onDatatype xsd:string . + +atom:Literal + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Literal" ; + rdfs:comment "A UTF-8 string literal with optional datatype or language." ; + atom:cType "LV2_Atom_Literal" . + +atom:Path + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:URI ; + owl:onDatatype atom:URI ; + rdfs:label "Path" ; + rdfs:comment "A local file path." . + +atom:URI + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:String ; + owl:onDatatype xsd:anyURI ; + rdfs:label "URI" ; + rdfs:comment "A URI string." . + +atom:URID + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "URID" ; + rdfs:comment "An unsigned 32-bit integer ID for a URI." ; + atom:cType "LV2_Atom_URID" . + +atom:Vector + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Vector" ; + rdfs:comment "A homogeneous sequence of atom bodies with equivalent type and size." ; + atom:cType "LV2_Atom_Vector" . + +atom:Tuple + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Tuple" ; + rdfs:comment "A sequence of atoms with varying type and size." . + +atom:Property + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Property" ; + rdfs:comment "A property of an atom:Object." ; + atom:cType "LV2_Atom_Property" . + +atom:Object + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Object" ; + rdfs:comment "A collection of properties." ; + atom:cType "LV2_Atom_Object" . + +atom:Resource + a rdfs:Class ; + rdfs:subClassOf atom:Object ; + rdfs:label "Resource" ; + rdfs:comment "A named collection of properties with a URI." ; + owl:deprecated "true"^^xsd:boolean ; + atom:cType "LV2_Atom_Object" . + +atom:Blank + a rdfs:Class ; + rdfs:subClassOf atom:Object ; + rdfs:label "Blank" ; + rdfs:comment "An anonymous collection of properties without a URI." ; + owl:deprecated "true"^^xsd:boolean ; + atom:cType "LV2_Atom_Object" . + +atom:Sound + a rdfs:Class ; + rdfs:subClassOf atom:Vector ; + rdfs:label "Sound" ; + rdfs:comment "A atom:Vector of atom:Float which represents an audio waveform." ; + atom:cType "LV2_Atom_Vector" . + +atom:frameTime + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:range xsd:decimal ; + rdfs:label "frame time" ; + rdfs:comment "A time stamp in audio frames." . + +atom:beatTime + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:range xsd:decimal ; + rdfs:label "beat time" ; + rdfs:comment "A time stamp in beats." . + +atom:Event + a rdfs:Class ; + rdfs:label "Event" ; + atom:cType "LV2_Atom_Event" ; + rdfs:comment "An atom with a time stamp prefix in a sequence." . + +atom:Sequence + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Sequence" ; + atom:cType "LV2_Atom_Sequence" ; + rdfs:comment "A sequence of events." . + +atom:AtomPort + a rdfs:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Atom Port" ; + rdfs:comment "A port which contains an atom:Atom." . + +atom:bufferType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain atom:AtomPort ; + rdfs:range rdfs:Class ; + rdfs:label "buffer type" ; + rdfs:comment "An atom type that a port may be connected to." . + +atom:childType + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "child type" ; + rdfs:comment "The type of children in a container." . + +atom:supports + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "supports" ; + rdfs:comment "A supported atom type." ; + rdfs:range rdfs:Class . + +atom:eventTransfer + a ui:PortProtocol ; + rdfs:label "event transfer" ; + rdfs:comment "A port protocol for transferring events." . + +atom:atomTransfer + a ui:PortProtocol ; + rdfs:label "atom transfer" ; + rdfs:comment "A port protocol for transferring atoms." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,683 @@ +/* + Copyright 2008-2016 David Robillard + + 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 forge.h An API for constructing LV2 atoms. + + This file provides an API for constructing Atoms which makes it relatively + simple to build nested atoms of arbitrary complexity without requiring + dynamic memory allocation. + + The API is based on successively appending the appropriate pieces to build a + complete Atom. The size of containers is automatically updated. Functions + that begin a container return (via their frame argument) a stack frame which + must be popped when the container is finished. + + All output is written to a user-provided buffer or sink function. This + makes it popssible to create create atoms on the stack, on the heap, in LV2 + port buffers, in a ringbuffer, or elsewhere, all using the same API. + + This entire API is realtime safe if used with a buffer or a realtime safe + sink, except lv2_atom_forge_init() which is only realtime safe if the URI + map function is. + + Note these functions are all static inline, do not take their address. + + This header is non-normative, it is provided for convenience. +*/ + +#ifndef LV2_ATOM_FORGE_H +#define LV2_ATOM_FORGE_H + +/** + @defgroup forge Forge + @ingroup atom + + An API for constructing LV2 atoms. + + @{ +*/ + +#include "lv2/atom/atom.h" +#include "lv2/atom/util.h" +#include "lv2/core/attributes.h" +#include "lv2/urid/urid.h" + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Disable deprecation warnings for Blank and Resource +LV2_DISABLE_DEPRECATION_WARNINGS + +/** Handle for LV2_Atom_Forge_Sink. */ +typedef void* LV2_Atom_Forge_Sink_Handle; + +/** A reference to a chunk of written output. */ +typedef intptr_t LV2_Atom_Forge_Ref; + +/** Sink function for writing output. See lv2_atom_forge_set_sink(). */ +typedef LV2_Atom_Forge_Ref (*LV2_Atom_Forge_Sink)( + LV2_Atom_Forge_Sink_Handle handle, + const void* buf, + uint32_t size); + +/** Function for resolving a reference. See lv2_atom_forge_set_sink(). */ +typedef LV2_Atom* (*LV2_Atom_Forge_Deref_Func)( + LV2_Atom_Forge_Sink_Handle handle, + LV2_Atom_Forge_Ref ref); + +/** A stack frame used for keeping track of nested Atom containers. */ +typedef struct LV2_Atom_Forge_Frame { + struct LV2_Atom_Forge_Frame* parent; + LV2_Atom_Forge_Ref ref; +} LV2_Atom_Forge_Frame; + +/** A "forge" for creating atoms by appending to a buffer. */ +typedef struct { + uint8_t* buf; + uint32_t offset; + uint32_t size; + + LV2_Atom_Forge_Sink sink; + LV2_Atom_Forge_Deref_Func deref; + LV2_Atom_Forge_Sink_Handle handle; + + LV2_Atom_Forge_Frame* stack; + + LV2_URID Blank LV2_DEPRECATED; + LV2_URID Bool; + LV2_URID Chunk; + LV2_URID Double; + LV2_URID Float; + LV2_URID Int; + LV2_URID Long; + LV2_URID Literal; + LV2_URID Object; + LV2_URID Path; + LV2_URID Property; + LV2_URID Resource LV2_DEPRECATED; + LV2_URID Sequence; + LV2_URID String; + LV2_URID Tuple; + LV2_URID URI; + LV2_URID URID; + LV2_URID Vector; +} LV2_Atom_Forge; + +static inline void +lv2_atom_forge_set_buffer(LV2_Atom_Forge* forge, uint8_t* buf, size_t size); + +/** + Initialise `forge`. + + URIs will be mapped using `map` and stored, a reference to `map` itself is + not held. +*/ +static inline void +lv2_atom_forge_init(LV2_Atom_Forge* forge, LV2_URID_Map* map) +{ + lv2_atom_forge_set_buffer(forge, NULL, 0); + forge->Blank = map->map(map->handle, LV2_ATOM__Blank); + forge->Bool = map->map(map->handle, LV2_ATOM__Bool); + forge->Chunk = map->map(map->handle, LV2_ATOM__Chunk); + forge->Double = map->map(map->handle, LV2_ATOM__Double); + forge->Float = map->map(map->handle, LV2_ATOM__Float); + forge->Int = map->map(map->handle, LV2_ATOM__Int); + forge->Long = map->map(map->handle, LV2_ATOM__Long); + forge->Literal = map->map(map->handle, LV2_ATOM__Literal); + forge->Object = map->map(map->handle, LV2_ATOM__Object); + forge->Path = map->map(map->handle, LV2_ATOM__Path); + forge->Property = map->map(map->handle, LV2_ATOM__Property); + forge->Resource = map->map(map->handle, LV2_ATOM__Resource); + forge->Sequence = map->map(map->handle, LV2_ATOM__Sequence); + forge->String = map->map(map->handle, LV2_ATOM__String); + forge->Tuple = map->map(map->handle, LV2_ATOM__Tuple); + forge->URI = map->map(map->handle, LV2_ATOM__URI); + forge->URID = map->map(map->handle, LV2_ATOM__URID); + forge->Vector = map->map(map->handle, LV2_ATOM__Vector); +} + +/** Access the Atom pointed to by a reference. */ +static inline LV2_Atom* +lv2_atom_forge_deref(LV2_Atom_Forge* forge, LV2_Atom_Forge_Ref ref) +{ + return forge->buf ? (LV2_Atom*)ref : forge->deref(forge->handle, ref); +} + +/** + @name Object Stack + @{ +*/ + +/** + Push a stack frame. + This is done automatically by container functions (which take a stack frame + pointer), but may be called by the user to push the top level container when + writing to an existing Atom. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_push(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + LV2_Atom_Forge_Ref ref) +{ + frame->parent = forge->stack; + frame->ref = ref; + + if (ref) { + forge->stack = frame; // Don't push, so walking the stack is always safe + } + + return ref; +} + +/** Pop a stack frame. This must be called when a container is finished. */ +static inline void +lv2_atom_forge_pop(LV2_Atom_Forge* forge, LV2_Atom_Forge_Frame* frame) +{ + if (frame->ref) { + // If frame has a valid ref, it must be the top of the stack + assert(frame == forge->stack); + forge->stack = frame->parent; + } + // Otherwise, frame was not pushed because of overflow, do nothing +} + +/** Return true iff the top of the stack has the given type. */ +static inline bool +lv2_atom_forge_top_is(LV2_Atom_Forge* forge, uint32_t type) +{ + return forge->stack && forge->stack->ref && + (lv2_atom_forge_deref(forge, forge->stack->ref)->type == type); +} + +/** Return true iff `type` is an atom:Object. */ +static inline bool +lv2_atom_forge_is_object_type(const LV2_Atom_Forge* forge, uint32_t type) +{ + return (type == forge->Object || type == forge->Blank || + type == forge->Resource); +} + +/** Return true iff `type` is an atom:Object with a blank ID. */ +static inline bool +lv2_atom_forge_is_blank(const LV2_Atom_Forge* forge, + uint32_t type, + const LV2_Atom_Object_Body* body) +{ + return (type == forge->Blank || (type == forge->Object && body->id == 0)); +} + +/** + @} + @name Output Configuration + @{ +*/ + +/** Set the output buffer where `forge` will write atoms. */ +static inline void +lv2_atom_forge_set_buffer(LV2_Atom_Forge* forge, uint8_t* buf, size_t size) +{ + forge->buf = buf; + forge->size = (uint32_t)size; + forge->offset = 0; + forge->deref = NULL; + forge->sink = NULL; + forge->handle = NULL; + forge->stack = NULL; +} + +/** + Set the sink function where `forge` will write output. + + The return value of forge functions is an LV2_Atom_Forge_Ref which is an + integer type safe to use as a pointer but is otherwise opaque. The sink + function must return a ref that can be dereferenced to access as least + sizeof(LV2_Atom) bytes of the written data, so sizes can be updated. For + ringbuffers, this should be possible as long as the size of the buffer is a + multiple of sizeof(LV2_Atom), since atoms are always aligned. + + Note that 0 is an invalid reference, so if you are using a buffer offset be + sure to offset it such that 0 is never a valid reference. You will get + confusing errors otherwise. +*/ +static inline void +lv2_atom_forge_set_sink(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Sink sink, + LV2_Atom_Forge_Deref_Func deref, + LV2_Atom_Forge_Sink_Handle handle) +{ + forge->buf = NULL; + forge->size = forge->offset = 0; + forge->deref = deref; + forge->sink = sink; + forge->handle = handle; + forge->stack = NULL; +} + +/** + @} + @name Low Level Output + @{ +*/ + +/** + Write raw output. This is used internally, but is also useful for writing + atom types not explicitly supported by the forge API. Note the caller is + responsible for ensuring the output is approriately padded. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_raw(LV2_Atom_Forge* forge, const void* data, uint32_t size) +{ + LV2_Atom_Forge_Ref out = 0; + if (forge->sink) { + out = forge->sink(forge->handle, data, size); + } else { + out = (LV2_Atom_Forge_Ref)forge->buf + forge->offset; + uint8_t* mem = forge->buf + forge->offset; + if (forge->offset + size > forge->size) { + return 0; + } + forge->offset += size; + memcpy(mem, data, size); + } + for (LV2_Atom_Forge_Frame* f = forge->stack; f; f = f->parent) { + lv2_atom_forge_deref(forge, f->ref)->size += size; + } + return out; +} + +/** Pad output accordingly so next write is 64-bit aligned. */ +static inline void +lv2_atom_forge_pad(LV2_Atom_Forge* forge, uint32_t written) +{ + const uint64_t pad = 0; + const uint32_t pad_size = lv2_atom_pad_size(written) - written; + lv2_atom_forge_raw(forge, &pad, pad_size); +} + +/** Write raw output, padding to 64-bits as necessary. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_write(LV2_Atom_Forge* forge, const void* data, uint32_t size) +{ + LV2_Atom_Forge_Ref out = lv2_atom_forge_raw(forge, data, size); + if (out) { + lv2_atom_forge_pad(forge, size); + } + return out; +} + +/** Write a null-terminated string body. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_string_body(LV2_Atom_Forge* forge, const char* str, uint32_t len) +{ + LV2_Atom_Forge_Ref out = lv2_atom_forge_raw(forge, str, len); + if (out && (out = lv2_atom_forge_raw(forge, "", 1))) { + lv2_atom_forge_pad(forge, len + 1); + } + return out; +} + +/** + @} + @name Atom Output + @{ +*/ + +/** Write an atom:Atom header. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_atom(LV2_Atom_Forge* forge, uint32_t size, uint32_t type) +{ + const LV2_Atom a = {size, type}; + return lv2_atom_forge_raw(forge, &a, sizeof(a)); +} + +/** Write a primitive (fixed-size) atom. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_primitive(LV2_Atom_Forge* forge, const LV2_Atom* a) +{ + return ( + lv2_atom_forge_top_is(forge, forge->Vector) + ? lv2_atom_forge_raw(forge, LV2_ATOM_BODY_CONST(a), a->size) + : lv2_atom_forge_write(forge, a, (uint32_t)sizeof(LV2_Atom) + a->size)); +} + +/** Write an atom:Int. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_int(LV2_Atom_Forge* forge, int32_t val) +{ + const LV2_Atom_Int a = {{sizeof(val), forge->Int}, val}; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:Long. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_long(LV2_Atom_Forge* forge, int64_t val) +{ + const LV2_Atom_Long a = {{sizeof(val), forge->Long}, val}; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:Float. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_float(LV2_Atom_Forge* forge, float val) +{ + const LV2_Atom_Float a = {{sizeof(val), forge->Float}, val}; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:Double. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_double(LV2_Atom_Forge* forge, double val) +{ + const LV2_Atom_Double a = {{sizeof(val), forge->Double}, val}; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:Bool. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_bool(LV2_Atom_Forge* forge, bool val) +{ + const LV2_Atom_Bool a = {{sizeof(int32_t), forge->Bool}, val ? 1 : 0}; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:URID. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_urid(LV2_Atom_Forge* forge, LV2_URID id) +{ + const LV2_Atom_URID a = {{sizeof(id), forge->URID}, id}; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom compatible with atom:String. Used internally. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_typed_string(LV2_Atom_Forge* forge, + uint32_t type, + const char* str, + uint32_t len) +{ + const LV2_Atom_String a = {{len + 1, type}}; + LV2_Atom_Forge_Ref out = lv2_atom_forge_raw(forge, &a, sizeof(a)); + if (out) { + if (!lv2_atom_forge_string_body(forge, str, len)) { + LV2_Atom* atom = lv2_atom_forge_deref(forge, out); + atom->size = atom->type = 0; + out = 0; + } + } + return out; +} + +/** Write an atom:String. Note that `str` need not be NULL terminated. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_string(LV2_Atom_Forge* forge, const char* str, uint32_t len) +{ + return lv2_atom_forge_typed_string(forge, forge->String, str, len); +} + +/** + Write an atom:URI. Note that `uri` need not be NULL terminated. + This does not map the URI, but writes the complete URI string. To write + a mapped URI, use lv2_atom_forge_urid(). +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_uri(LV2_Atom_Forge* forge, const char* uri, uint32_t len) +{ + return lv2_atom_forge_typed_string(forge, forge->URI, uri, len); +} + +/** Write an atom:Path. Note that `path` need not be NULL terminated. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_path(LV2_Atom_Forge* forge, const char* path, uint32_t len) +{ + return lv2_atom_forge_typed_string(forge, forge->Path, path, len); +} + +/** Write an atom:Literal. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_literal(LV2_Atom_Forge* forge, + const char* str, + uint32_t len, + uint32_t datatype, + uint32_t lang) +{ + const LV2_Atom_Literal a = { + {(uint32_t)(sizeof(LV2_Atom_Literal) - sizeof(LV2_Atom) + len + 1), + forge->Literal}, + {datatype, lang}}; + LV2_Atom_Forge_Ref out = lv2_atom_forge_raw(forge, &a, sizeof(a)); + if (out) { + if (!lv2_atom_forge_string_body(forge, str, len)) { + LV2_Atom* atom = lv2_atom_forge_deref(forge, out); + atom->size = atom->type = 0; + out = 0; + } + } + return out; +} + +/** Start an atom:Vector. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_vector_head(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + uint32_t child_size, + uint32_t child_type) +{ + const LV2_Atom_Vector a = {{sizeof(LV2_Atom_Vector_Body), forge->Vector}, + {child_size, child_type}}; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** Write a complete atom:Vector. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_vector(LV2_Atom_Forge* forge, + uint32_t child_size, + uint32_t child_type, + uint32_t n_elems, + const void* elems) +{ + const LV2_Atom_Vector a = { + {(uint32_t)(sizeof(LV2_Atom_Vector_Body) + n_elems * child_size), + forge->Vector}, + {child_size, child_type}}; + LV2_Atom_Forge_Ref out = lv2_atom_forge_write(forge, &a, sizeof(a)); + if (out) { + lv2_atom_forge_write(forge, elems, child_size * n_elems); + } + return out; +} + +/** + Write the header of an atom:Tuple. + + The passed frame will be initialised to represent this tuple. To complete + the tuple, write a sequence of atoms, then pop the frame with + lv2_atom_forge_pop(). + + For example: + @code + // Write tuple (1, 2.0) + LV2_Atom_Forge_Frame frame; + LV2_Atom* tup = (LV2_Atom*)lv2_atom_forge_tuple(forge, &frame); + lv2_atom_forge_int(forge, 1); + lv2_atom_forge_float(forge, 2.0); + lv2_atom_forge_pop(forge, &frame); + @endcode +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_tuple(LV2_Atom_Forge* forge, LV2_Atom_Forge_Frame* frame) +{ + const LV2_Atom_Tuple a = {{0, forge->Tuple}}; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + Write the header of an atom:Object. + + The passed frame will be initialised to represent this object. To complete + the object, write a sequence of properties, then pop the frame with + lv2_atom_forge_pop(). + + For example: + @code + LV2_URID eg_Cat = map("http://example.org/Cat"); + LV2_URID eg_name = map("http://example.org/name"); + + // Start object with type eg_Cat and blank ID + LV2_Atom_Forge_Frame frame; + lv2_atom_forge_object(forge, &frame, 0, eg_Cat); + + // Append property eg:name = "Hobbes" + lv2_atom_forge_key(forge, eg_name); + lv2_atom_forge_string(forge, "Hobbes", strlen("Hobbes")); + + // Finish object + lv2_atom_forge_pop(forge, &frame); + @endcode +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_object(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + LV2_URID id, + LV2_URID otype) +{ + const LV2_Atom_Object a = { + {(uint32_t)sizeof(LV2_Atom_Object_Body), forge->Object}, {id, otype}}; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + The same as lv2_atom_forge_object(), but for object:Resource. + + This function is deprecated and should not be used in new code. + Use lv2_atom_forge_object() directly instead. +*/ +LV2_DEPRECATED +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_resource(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + LV2_URID id, + LV2_URID otype) +{ + const LV2_Atom_Object a = { + {(uint32_t)sizeof(LV2_Atom_Object_Body), forge->Resource}, {id, otype}}; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + The same as lv2_atom_forge_object(), but for object:Blank. + + This function is deprecated and should not be used in new code. + Use lv2_atom_forge_object() directly instead. +*/ +LV2_DEPRECATED +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_blank(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + uint32_t id, + LV2_URID otype) +{ + const LV2_Atom_Object a = { + {(uint32_t)sizeof(LV2_Atom_Object_Body), forge->Blank}, {id, otype}}; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + Write a property key in an Object, to be followed by the value. + + See lv2_atom_forge_object() documentation for an example. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_key(LV2_Atom_Forge* forge, LV2_URID key) +{ + const LV2_Atom_Property_Body a = {key, 0, {0, 0}}; + return lv2_atom_forge_write(forge, &a, 2 * (uint32_t)sizeof(uint32_t)); +} + +/** + Write the header for a property body in an object, with context. + + If you do not need the context, which is almost certainly the case, + use the simpler lv2_atom_forge_key() instead. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_property_head(LV2_Atom_Forge* forge, + LV2_URID key, + LV2_URID context) +{ + const LV2_Atom_Property_Body a = {key, context, {0, 0}}; + return lv2_atom_forge_write(forge, &a, 2 * (uint32_t)sizeof(uint32_t)); +} + +/** + Write the header for a Sequence. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_sequence_head(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + uint32_t unit) +{ + const LV2_Atom_Sequence a = { + {(uint32_t)sizeof(LV2_Atom_Sequence_Body), forge->Sequence}, {unit, 0}}; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + Write the time stamp header of an Event (in a Sequence) in audio frames. + After this, call the appropriate forge method(s) to write the body. Note + the returned reference is to an LV2_Event which is NOT an Atom. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_frame_time(LV2_Atom_Forge* forge, int64_t frames) +{ + return lv2_atom_forge_write(forge, &frames, sizeof(frames)); +} + +/** + Write the time stamp header of an Event (in a Sequence) in beats. After + this, call the appropriate forge method(s) to write the body. Note the + returned reference is to an LV2_Event which is NOT an Atom. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_beat_time(LV2_Atom_Forge* forge, double beats) +{ + return lv2_atom_forge_write(forge, &beats, sizeof(beats)); +} + +LV2_RESTORE_WARNINGS + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} + @} +*/ + +#endif /* LV2_ATOM_FORGE_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,235 @@ +/* + Copyright 2019 David Robillard + + 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. +*/ + +#include "lv2/atom/atom-test-utils.c" +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" +#include "lv2/urid/urid.h" + +#include +#include +#include + +static int +test_string_overflow(void) +{ +#define MAX_CHARS 15 + + static const size_t capacity = sizeof(LV2_Atom_String) + MAX_CHARS + 1; + static const char* str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + uint8_t* buf = (uint8_t*)malloc(capacity); + LV2_URID_Map map = {NULL, urid_map}; + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + + // Check that writing increasingly long strings fails at the right point + for (size_t count = 0; count < MAX_CHARS; ++count) { + lv2_atom_forge_set_buffer(&forge, buf, capacity); + + const LV2_Atom_Forge_Ref ref = lv2_atom_forge_string(&forge, str, count); + if (!ref) { + return test_fail("Failed to write %zu byte string\n", count); + } + } + + // Failure writing to an exactly full forge + if (lv2_atom_forge_string(&forge, str, MAX_CHARS + 1)) { + return test_fail("Successfully wrote past end of buffer\n"); + } + + // Failure writing body after successfully writing header + lv2_atom_forge_set_buffer(&forge, buf, sizeof(LV2_Atom) + 1); + if (lv2_atom_forge_string(&forge, "AB", 2)) { + return test_fail("Successfully wrote atom header past end\n"); + } + + free(buf); + return 0; +} + +static int +test_literal_overflow(void) +{ + static const size_t capacity = sizeof(LV2_Atom_Literal) + 2; + + uint8_t* buf = (uint8_t*)malloc(capacity); + LV2_URID_Map map = {NULL, urid_map}; + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + + // Failure in atom header + lv2_atom_forge_set_buffer(&forge, buf, 1); + if (lv2_atom_forge_literal(&forge, "A", 1, 0, 0)) { + return test_fail("Successfully wrote atom header past end\n"); + } + + // Failure in literal header + lv2_atom_forge_set_buffer(&forge, buf, sizeof(LV2_Atom) + 1); + if (lv2_atom_forge_literal(&forge, "A", 1, 0, 0)) { + return test_fail("Successfully wrote literal header past end\n"); + } + + // Success (only room for one character + null terminator) + lv2_atom_forge_set_buffer(&forge, buf, capacity); + if (!lv2_atom_forge_literal(&forge, "A", 1, 0, 0)) { + return test_fail("Failed to write small enough literal\n"); + } + + // Failure in body + lv2_atom_forge_set_buffer(&forge, buf, capacity); + if (lv2_atom_forge_literal(&forge, "AB", 2, 0, 0)) { + return test_fail("Successfully wrote literal body past end\n"); + } + + free(buf); + return 0; +} + +static int +test_sequence_overflow(void) +{ + static const size_t size = sizeof(LV2_Atom_Sequence) + 6 * sizeof(LV2_Atom); + LV2_URID_Map map = {NULL, urid_map}; + + // Test over a range that fails in the sequence header and event components + for (size_t capacity = 1; capacity < size; ++capacity) { + uint8_t* buf = (uint8_t*)malloc(capacity); + + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + lv2_atom_forge_set_buffer(&forge, buf, capacity); + + LV2_Atom_Forge_Frame frame; + LV2_Atom_Forge_Ref ref = lv2_atom_forge_sequence_head(&forge, &frame, 0); + + assert(capacity >= sizeof(LV2_Atom_Sequence) || !frame.ref); + assert(capacity >= sizeof(LV2_Atom_Sequence) || !ref); + (void)ref; + + lv2_atom_forge_frame_time(&forge, 0); + lv2_atom_forge_int(&forge, 42); + lv2_atom_forge_pop(&forge, &frame); + + free(buf); + } + + return 0; +} + +static int +test_vector_head_overflow(void) +{ + static const size_t size = sizeof(LV2_Atom_Vector) + 3 * sizeof(LV2_Atom); + LV2_URID_Map map = {NULL, urid_map}; + + // Test over a range that fails in the vector header and elements + for (size_t capacity = 1; capacity < size; ++capacity) { + uint8_t* buf = (uint8_t*)malloc(capacity); + + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + lv2_atom_forge_set_buffer(&forge, buf, capacity); + + LV2_Atom_Forge_Frame frame; + LV2_Atom_Forge_Ref ref = + lv2_atom_forge_vector_head(&forge, &frame, sizeof(int32_t), forge.Int); + + assert(capacity >= sizeof(LV2_Atom_Vector) || !frame.ref); + assert(capacity >= sizeof(LV2_Atom_Vector) || !ref); + (void)ref; + + lv2_atom_forge_int(&forge, 1); + lv2_atom_forge_int(&forge, 2); + lv2_atom_forge_int(&forge, 3); + lv2_atom_forge_pop(&forge, &frame); + + free(buf); + } + + return 0; +} + +static int +test_vector_overflow(void) +{ + static const size_t size = sizeof(LV2_Atom_Vector) + 3 * sizeof(LV2_Atom); + static const int32_t vec[] = {1, 2, 3}; + LV2_URID_Map map = {NULL, urid_map}; + + // Test over a range that fails in the vector header and elements + for (size_t capacity = 1; capacity < size; ++capacity) { + uint8_t* buf = (uint8_t*)malloc(capacity); + + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + lv2_atom_forge_set_buffer(&forge, buf, capacity); + + LV2_Atom_Forge_Ref ref = + lv2_atom_forge_vector(&forge, sizeof(int32_t), forge.Int, 3, vec); + + assert(capacity >= sizeof(LV2_Atom_Vector) || !ref); + (void)ref; + + free(buf); + } + + return 0; +} + +static int +test_tuple_overflow(void) +{ + static const size_t size = sizeof(LV2_Atom_Tuple) + 3 * sizeof(LV2_Atom); + LV2_URID_Map map = {NULL, urid_map}; + + // Test over a range that fails in the tuple header and elements + for (size_t capacity = 1; capacity < size; ++capacity) { + uint8_t* buf = (uint8_t*)malloc(capacity); + + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + lv2_atom_forge_set_buffer(&forge, buf, capacity); + + LV2_Atom_Forge_Frame frame; + LV2_Atom_Forge_Ref ref = lv2_atom_forge_tuple(&forge, &frame); + + assert(capacity >= sizeof(LV2_Atom_Tuple) || !frame.ref); + assert(capacity >= sizeof(LV2_Atom_Tuple) || !ref); + (void)ref; + + lv2_atom_forge_int(&forge, 1); + lv2_atom_forge_float(&forge, 2.0f); + lv2_atom_forge_string(&forge, "three", 5); + lv2_atom_forge_pop(&forge, &frame); + + free(buf); + } + + return 0; +} + +int +main(void) +{ + const int ret = test_string_overflow() || test_literal_overflow() || + test_sequence_overflow() || test_vector_head_overflow() || + test_vector_overflow() || test_tuple_overflow(); + + free_urid_map(); + + return ret; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,523 @@ +/* + Copyright 2008-2015 David Robillard + + 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. +*/ + +#ifndef LV2_ATOM_UTIL_H +#define LV2_ATOM_UTIL_H + +/** + @file util.h Helper functions for the LV2 Atom extension. + + Note these functions are all static inline, do not take their address. + + This header is non-normative, it is provided for convenience. +*/ + +/** + @defgroup util Utilities + @ingroup atom + + Utilities for working with atoms. + + @{ +*/ + +#include "lv2/atom/atom.h" + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Pad a size to 64 bits. */ +static inline uint32_t +lv2_atom_pad_size(uint32_t size) +{ + return (size + 7U) & (~7U); +} + +/** Return the total size of `atom`, including the header. */ +static inline uint32_t +lv2_atom_total_size(const LV2_Atom* atom) +{ + return (uint32_t)sizeof(LV2_Atom) + atom->size; +} + +/** Return true iff `atom` is null. */ +static inline bool +lv2_atom_is_null(const LV2_Atom* atom) +{ + return !atom || (atom->type == 0 && atom->size == 0); +} + +/** Return true iff `a` is equal to `b`. */ +static inline bool +lv2_atom_equals(const LV2_Atom* a, const LV2_Atom* b) +{ + return (a == b) || ((a->type == b->type) && (a->size == b->size) && + !memcmp(a + 1, b + 1, a->size)); +} + +/** + @name Sequence Iterator + @{ +*/ + +/** Get an iterator pointing to the first event in a Sequence body. */ +static inline LV2_Atom_Event* +lv2_atom_sequence_begin(const LV2_Atom_Sequence_Body* body) +{ + return (LV2_Atom_Event*)(body + 1); +} + +/** Get an iterator pointing to the end of a Sequence body. */ +static inline LV2_Atom_Event* +lv2_atom_sequence_end(const LV2_Atom_Sequence_Body* body, uint32_t size) +{ + return (LV2_Atom_Event*)((const uint8_t*)body + lv2_atom_pad_size(size)); +} + +/** Return true iff `i` has reached the end of `body`. */ +static inline bool +lv2_atom_sequence_is_end(const LV2_Atom_Sequence_Body* body, + uint32_t size, + const LV2_Atom_Event* i) +{ + return (const uint8_t*)i >= ((const uint8_t*)body + size); +} + +/** Return an iterator to the element following `i`. */ +static inline LV2_Atom_Event* +lv2_atom_sequence_next(const LV2_Atom_Event* i) +{ + return (LV2_Atom_Event*)((const uint8_t*)i + sizeof(LV2_Atom_Event) + + lv2_atom_pad_size(i->body.size)); +} + +/** + A macro for iterating over all events in a Sequence. + @param seq The sequence to iterate over + @param iter The name of the iterator + + This macro is used similarly to a for loop (which it expands to), for + example: + + @code + LV2_ATOM_SEQUENCE_FOREACH(sequence, ev) { + // Do something with ev (an LV2_Atom_Event*) here... + } + @endcode +*/ +#define LV2_ATOM_SEQUENCE_FOREACH(seq, iter) \ + for (LV2_Atom_Event * (iter) = lv2_atom_sequence_begin(&(seq)->body); \ + !lv2_atom_sequence_is_end(&(seq)->body, (seq)->atom.size, (iter)); \ + (iter) = lv2_atom_sequence_next(iter)) + +/** Like LV2_ATOM_SEQUENCE_FOREACH but for a headerless sequence body. */ +#define LV2_ATOM_SEQUENCE_BODY_FOREACH(body, size, iter) \ + for (LV2_Atom_Event * (iter) = lv2_atom_sequence_begin(body); \ + !lv2_atom_sequence_is_end(body, size, (iter)); \ + (iter) = lv2_atom_sequence_next(iter)) + +/** + @} + @name Sequence Utilities + @{ +*/ + +/** + Clear all events from `sequence`. + + This simply resets the size field, the other fields are left untouched. +*/ +static inline void +lv2_atom_sequence_clear(LV2_Atom_Sequence* seq) +{ + seq->atom.size = sizeof(LV2_Atom_Sequence_Body); +} + +/** + Append an event at the end of `sequence`. + + @param seq Sequence to append to. + @param capacity Total capacity of the sequence atom + (as set by the host for sequence output ports). + @param event Event to write. + + @return A pointer to the newly written event in `seq`, + or NULL on failure (insufficient space). +*/ +static inline LV2_Atom_Event* +lv2_atom_sequence_append_event(LV2_Atom_Sequence* seq, + uint32_t capacity, + const LV2_Atom_Event* event) +{ + const uint32_t total_size = (uint32_t)sizeof(*event) + event->body.size; + if (capacity - seq->atom.size < total_size) { + return NULL; + } + + LV2_Atom_Event* e = lv2_atom_sequence_end(&seq->body, seq->atom.size); + memcpy(e, event, total_size); + + seq->atom.size += lv2_atom_pad_size(total_size); + + return e; +} + +/** + @} + @name Tuple Iterator + @{ +*/ + +/** Get an iterator pointing to the first element in `tup`. */ +static inline LV2_Atom* +lv2_atom_tuple_begin(const LV2_Atom_Tuple* tup) +{ + return (LV2_Atom*)(LV2_ATOM_BODY(tup)); +} + +/** Return true iff `i` has reached the end of `body`. */ +static inline bool +lv2_atom_tuple_is_end(const void* body, uint32_t size, const LV2_Atom* i) +{ + return (const uint8_t*)i >= ((const uint8_t*)body + size); +} + +/** Return an iterator to the element following `i`. */ +static inline LV2_Atom* +lv2_atom_tuple_next(const LV2_Atom* i) +{ + return (LV2_Atom*)((const uint8_t*)i + sizeof(LV2_Atom) + + lv2_atom_pad_size(i->size)); +} + +/** + A macro for iterating over all properties of a Tuple. + @param tuple The tuple to iterate over + @param iter The name of the iterator + + This macro is used similarly to a for loop (which it expands to), for + example: + + @code + LV2_ATOM_TUPLE_FOREACH(tuple, elem) { + // Do something with elem (an LV2_Atom*) here... + } + @endcode +*/ +#define LV2_ATOM_TUPLE_FOREACH(tuple, iter) \ + for (LV2_Atom * (iter) = lv2_atom_tuple_begin(tuple); \ + !lv2_atom_tuple_is_end( \ + LV2_ATOM_BODY(tuple), (tuple)->atom.size, (iter)); \ + (iter) = lv2_atom_tuple_next(iter)) + +/** Like LV2_ATOM_TUPLE_FOREACH but for a headerless tuple body. */ +#define LV2_ATOM_TUPLE_BODY_FOREACH(body, size, iter) \ + for (LV2_Atom * (iter) = (LV2_Atom*)(body); \ + !lv2_atom_tuple_is_end(body, size, (iter)); \ + (iter) = lv2_atom_tuple_next(iter)) + +/** + @} + @name Object Iterator + @{ +*/ + +/** Return a pointer to the first property in `body`. */ +static inline LV2_Atom_Property_Body* +lv2_atom_object_begin(const LV2_Atom_Object_Body* body) +{ + return (LV2_Atom_Property_Body*)(body + 1); +} + +/** Return true iff `i` has reached the end of `obj`. */ +static inline bool +lv2_atom_object_is_end(const LV2_Atom_Object_Body* body, + uint32_t size, + const LV2_Atom_Property_Body* i) +{ + return (const uint8_t*)i >= ((const uint8_t*)body + size); +} + +/** Return an iterator to the property following `i`. */ +static inline LV2_Atom_Property_Body* +lv2_atom_object_next(const LV2_Atom_Property_Body* i) +{ + const LV2_Atom* const value = + (const LV2_Atom*)((const uint8_t*)i + 2 * sizeof(uint32_t)); + return (LV2_Atom_Property_Body*)((const uint8_t*)i + + lv2_atom_pad_size( + (uint32_t)sizeof(LV2_Atom_Property_Body) + + value->size)); +} + +/** + A macro for iterating over all properties of an Object. + @param obj The object to iterate over + @param iter The name of the iterator + + This macro is used similarly to a for loop (which it expands to), for + example: + + @code + LV2_ATOM_OBJECT_FOREACH(object, i) { + // Do something with i (an LV2_Atom_Property_Body*) here... + } + @endcode +*/ +#define LV2_ATOM_OBJECT_FOREACH(obj, iter) \ + for (LV2_Atom_Property_Body * (iter) = lv2_atom_object_begin(&(obj)->body); \ + !lv2_atom_object_is_end(&(obj)->body, (obj)->atom.size, (iter)); \ + (iter) = lv2_atom_object_next(iter)) + +/** Like LV2_ATOM_OBJECT_FOREACH but for a headerless object body. */ +#define LV2_ATOM_OBJECT_BODY_FOREACH(body, size, iter) \ + for (LV2_Atom_Property_Body * (iter) = lv2_atom_object_begin(body); \ + !lv2_atom_object_is_end(body, size, (iter)); \ + (iter) = lv2_atom_object_next(iter)) + +/** + @} + @name Object Query + @{ +*/ + +/** A single entry in an Object query. */ +typedef struct { + uint32_t key; /**< Key to query (input set by user) */ + const LV2_Atom** value; /**< Found value (output set by query function) */ +} LV2_Atom_Object_Query; + +/** Sentinel for lv2_atom_object_query(). */ +static const LV2_Atom_Object_Query LV2_ATOM_OBJECT_QUERY_END = {0, NULL}; + +/** + Get an object's values for various keys. + + The value pointer of each item in `query` will be set to the location of + the corresponding value in `object`. Every value pointer in `query` MUST + be initialised to NULL. This function reads `object` in a single linear + sweep. By allocating `query` on the stack, objects can be "queried" + quickly without allocating any memory. This function is realtime safe. + + This function can only do "flat" queries, it is not smart enough to match + variables in nested objects. + + For example: + @code + const LV2_Atom* name = NULL; + const LV2_Atom* age = NULL; + LV2_Atom_Object_Query q[] = { + { urids.eg_name, &name }, + { urids.eg_age, &age }, + LV2_ATOM_OBJECT_QUERY_END + }; + lv2_atom_object_query(obj, q); + // name and age are now set to the appropriate values in obj, or NULL. + @endcode +*/ +static inline int +lv2_atom_object_query(const LV2_Atom_Object* object, + LV2_Atom_Object_Query* query) +{ + int matches = 0; + int n_queries = 0; + + /* Count number of query keys so we can short-circuit when done */ + for (LV2_Atom_Object_Query* q = query; q->key; ++q) { + ++n_queries; + } + + LV2_ATOM_OBJECT_FOREACH (object, prop) { + for (LV2_Atom_Object_Query* q = query; q->key; ++q) { + if (q->key == prop->key && !*q->value) { + *q->value = &prop->value; + if (++matches == n_queries) { + return matches; + } + break; + } + } + } + return matches; +} + +/** + Body only version of lv2_atom_object_get(). +*/ +static inline int +lv2_atom_object_body_get(uint32_t size, const LV2_Atom_Object_Body* body, ...) +{ + int matches = 0; + int n_queries = 0; + + /* Count number of keys so we can short-circuit when done */ + va_list args; + va_start(args, body); + for (n_queries = 0; va_arg(args, uint32_t); ++n_queries) { + if (!va_arg(args, const LV2_Atom**)) { + va_end(args); + return -1; + } + } + va_end(args); + + LV2_ATOM_OBJECT_BODY_FOREACH (body, size, prop) { + va_start(args, body); + for (int i = 0; i < n_queries; ++i) { + uint32_t qkey = va_arg(args, uint32_t); + const LV2_Atom** qval = va_arg(args, const LV2_Atom**); + if (qkey == prop->key && !*qval) { + *qval = &prop->value; + if (++matches == n_queries) { + va_end(args); + return matches; + } + break; + } + } + va_end(args); + } + return matches; +} + +/** + Variable argument version of lv2_atom_object_query(). + + This is nicer-looking in code, but a bit more error-prone since it is not + type safe and the argument list must be terminated. + + The arguments should be a series of uint32_t key and const LV2_Atom** value + pairs, terminated by a zero key. The value pointers MUST be initialized to + NULL. For example: + + @code + const LV2_Atom* name = NULL; + const LV2_Atom* age = NULL; + lv2_atom_object_get(obj, + uris.name_key, &name, + uris.age_key, &age, + 0); + @endcode +*/ +static inline int +lv2_atom_object_get(const LV2_Atom_Object* object, ...) +{ + int matches = 0; + int n_queries = 0; + + /* Count number of keys so we can short-circuit when done */ + va_list args; + va_start(args, object); + for (n_queries = 0; va_arg(args, uint32_t); ++n_queries) { + if (!va_arg(args, const LV2_Atom**)) { + va_end(args); + return -1; + } + } + va_end(args); + + LV2_ATOM_OBJECT_FOREACH (object, prop) { + va_start(args, object); + for (int i = 0; i < n_queries; ++i) { + uint32_t qkey = va_arg(args, uint32_t); + const LV2_Atom** qval = va_arg(args, const LV2_Atom**); + if (qkey == prop->key && !*qval) { + *qval = &prop->value; + if (++matches == n_queries) { + va_end(args); + return matches; + } + break; + } + } + va_end(args); + } + return matches; +} + +/** + Variable argument version of lv2_atom_object_query() with types. + + This is like lv2_atom_object_get(), but each entry has an additional + parameter to specify the required type. Only atoms with a matching type + will be selected. + + The arguments should be a series of uint32_t key, const LV2_Atom**, uint32_t + type triples, terminated by a zero key. The value pointers MUST be + initialized to NULL. For example: + + @code + const LV2_Atom_String* name = NULL; + const LV2_Atom_Int* age = NULL; + lv2_atom_object_get(obj, + uris.name_key, &name, uris.atom_String, + uris.age_key, &age, uris.atom_Int + 0); + @endcode +*/ +static inline int +lv2_atom_object_get_typed(const LV2_Atom_Object* object, ...) +{ + int matches = 0; + int n_queries = 0; + + /* Count number of keys so we can short-circuit when done */ + va_list args; + va_start(args, object); + for (n_queries = 0; va_arg(args, uint32_t); ++n_queries) { + if (!va_arg(args, const LV2_Atom**) || !va_arg(args, uint32_t)) { + va_end(args); + return -1; + } + } + va_end(args); + + LV2_ATOM_OBJECT_FOREACH (object, prop) { + va_start(args, object); + for (int i = 0; i < n_queries; ++i) { + const uint32_t qkey = va_arg(args, uint32_t); + const LV2_Atom** qval = va_arg(args, const LV2_Atom**); + const uint32_t qtype = va_arg(args, uint32_t); + if (!*qval && qkey == prop->key && qtype == prop->value.type) { + *qval = &prop->value; + if (++matches == n_queries) { + va_end(args); + return matches; + } + break; + } + } + va_end(args); + } + return matches; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} + @} +*/ + +#endif /* LV2_ATOM_UTIL_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,51 @@ +/* + Copyright 2007-2016 David Robillard + + 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. +*/ + +#ifndef LV2_BUF_SIZE_H +#define LV2_BUF_SIZE_H + +/** + @defgroup buf-size Buffer Size + @ingroup lv2 + + Access to, and restrictions on, buffer sizes. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_BUF_SIZE_URI "http://lv2plug.in/ns/ext/buf-size" ///< http://lv2plug.in/ns/ext/buf-size +#define LV2_BUF_SIZE_PREFIX LV2_BUF_SIZE_URI "#" ///< http://lv2plug.in/ns/ext/buf-size# + +#define LV2_BUF_SIZE__boundedBlockLength LV2_BUF_SIZE_PREFIX "boundedBlockLength" ///< http://lv2plug.in/ns/ext/buf-size#boundedBlockLength +#define LV2_BUF_SIZE__coarseBlockLength LV2_BUF_SIZE_PREFIX "coarseBlockLength" ///< http://lv2plug.in/ns/ext/buf-size#coarseBlockLength +#define LV2_BUF_SIZE__fixedBlockLength LV2_BUF_SIZE_PREFIX "fixedBlockLength" ///< http://lv2plug.in/ns/ext/buf-size#fixedBlockLength +#define LV2_BUF_SIZE__maxBlockLength LV2_BUF_SIZE_PREFIX "maxBlockLength" ///< http://lv2plug.in/ns/ext/buf-size#maxBlockLength +#define LV2_BUF_SIZE__minBlockLength LV2_BUF_SIZE_PREFIX "minBlockLength" ///< http://lv2plug.in/ns/ext/buf-size#minBlockLength +#define LV2_BUF_SIZE__nominalBlockLength LV2_BUF_SIZE_PREFIX "nominalBlockLength" ///< http://lv2plug.in/ns/ext/buf-size#nominalBlockLength +#define LV2_BUF_SIZE__powerOf2BlockLength LV2_BUF_SIZE_PREFIX "powerOf2BlockLength" ///< http://lv2plug.in/ns/ext/buf-size#powerOf2BlockLength +#define LV2_BUF_SIZE__sequenceSize LV2_BUF_SIZE_PREFIX "sequenceSize" ///< http://lv2plug.in/ns/ext/buf-size#sequenceSize + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_BUF_SIZE_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,157 @@ +@prefix bufsz: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Buf Size" ; + doap:shortdesc "Access to, and restrictions on, buffer sizes." ; + doap:created "2012-08-07" ; + doap:developer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2015-09-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add bufsz:nominalBlockLength option." + ] , [ + rdfs:label "Add bufsz:coarseBlockLength feature." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-12-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix typo in bufsz:sequenceSize label." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a facility for plugins to get information about the +block length (the sample_count parameter of LV2_Descriptor::run) and port +buffer sizes, as well as several features which can be used to restrict the +block length. + +This extension defines features and properties but has no special purpose +API of its own. The host provides all the relevant information to the plugin +as [options](options.html). + +To require restrictions on the block length, plugins can require additional +features: bufsz:boundedBlockLength, bufsz:powerOf2BlockLength, and +bufsz:fixedBlockLength. These features are data-only, that is they merely +indicate a restriction and do not carry any data or API. + +"""^^lv2:Markdown . + +bufsz:boundedBlockLength + lv2:documentation """ + +A feature that indicates the host will provide both the bufsz:minBlockLength +and bufsz:maxBlockLength options to the plugin. Plugins that copy data from +audio inputs can require this feature to ensure they know how much space is +required for auxiliary buffers. Note the minimum may be zero, this feature is +mainly useful to ensure a maximum is available. + +All hosts SHOULD support this feature, since it is simple to support and +necessary for any plugins that may need to copy the input. + +"""^^lv2:Markdown . + +bufsz:fixedBlockLength + lv2:documentation """ + +A feature that indicates the host will always call LV2_Descriptor::run() with +the same value for sample_count. This length MUST be provided as the value of +both the bufsz:minBlockLength and bufsz:maxBlockLength options. + +Note that requiring this feature may severely limit the number of hosts capable +of running the plugin. + +"""^^lv2:Markdown . + +bufsz:powerOf2BlockLength + lv2:documentation """ + +A feature that indicates the host will always call LV2_Descriptor::run() with a +power of two sample_count. Note that this feature does not guarantee the value +is the same each call, to guarantee a fixed power of two block length plugins +must require both this feature and bufsz:fixedBlockLength. + +Note that requiring this feature may severely limit the number of hosts capable +of running the plugin. + +"""^^lv2:Markdown . + +bufsz:coarseBlockLength + lv2:documentation """ + +A feature that indicates the plugin prefers coarse, regular block lengths. For +example, plugins that do not implement sample-accurate control use this feature +to indicate that the host should not split the run cycle because controls have +changed. + +Note that this feature is merely a hint, and does not guarantee a fixed block +length. The run cycle may be split for other reasons, and the blocksize itself +may change anytime. + +"""^^lv2:Markdown . + +bufsz:maxBlockLength + lv2:documentation """ + +The maximum block length the host will ever request the plugin to process at +once, that is, the maximum `sample_count` parameter that will ever be passed to +LV2_Descriptor::run(). + +"""^^lv2:Markdown . + +bufsz:minBlockLength + lv2:documentation """ + +The minimum block length the host will ever request the plugin to process at +once, that is, the minimum `sample_count` parameter that will ever be passed to +LV2_Descriptor::run(). + +"""^^lv2:Markdown . + +bufsz:nominalBlockLength + lv2:documentation """ + +The typical block length the host will request the plugin to process at once, +that is, the typical `sample_count` parameter that will be passed to +LV2_Descriptor::run(). This will usually be equivalent, or close to, the +maximum block length, but there are no strong guarantees about this value +whatsoever. Plugins may use this length for optimization purposes, but MUST +NOT assume the host will always process blocks of this length. In particular, +the host MAY process longer blocks. + +"""^^lv2:Markdown . + +bufsz:sequenceSize + lv2:documentation """ + +This should be provided as an option by hosts that support event ports +(including but not limited to MIDI), so plugins have the ability to allocate +auxiliary buffers large enough to copy the input. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,67 @@ +@prefix bufsz: . +@prefix lv2: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Buf Size" ; + rdfs:comment "Access to, and restrictions on, buffer sizes." ; + rdfs:seeAlso , + . + +bufsz:boundedBlockLength + a lv2:Feature ; + rdfs:label "bounded block length" ; + rdfs:comment "Block length has lower and upper bounds." . + +bufsz:fixedBlockLength + a lv2:Feature ; + rdfs:label "fixed block length" ; + rdfs:comment "Block length never changes." . + +bufsz:powerOf2BlockLength + a lv2:Feature ; + rdfs:label "power of 2 block length" ; + rdfs:comment "Block length is a power of 2." . + +bufsz:coarseBlockLength + a lv2:Feature ; + rdfs:label "coarse block length" ; + rdfs:comment "Plugin prefers coarse block length without buffer splitting." . + +bufsz:maxBlockLength + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "maximum block length" ; + rdfs:comment "Block length has an upper bound." ; + rdfs:range xsd:nonNegativeInteger . + +bufsz:minBlockLength + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "minimum block length" ; + rdfs:comment "Block length has a lower bound." ; + rdfs:range xsd:nonNegativeInteger . + +bufsz:nominalBlockLength + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "nominal block length" ; + rdfs:comment "Typical block length that will most often be processed." ; + rdfs:range xsd:nonNegativeInteger . + +bufsz:sequenceSize + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "sequence size" ; + rdfs:comment "The maximum size of a sequence, in bytes." ; + rdfs:range xsd:nonNegativeInteger . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,59 @@ +/* + Copyright 2018 David Robillard + + 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. +*/ + +#ifndef LV2_CORE_ATTRIBUTES_H +#define LV2_CORE_ATTRIBUTES_H + +/** + @defgroup attributes Attributes + @ingroup lv2 + + Macros for source code attributes. + + @{ +*/ + +#if defined(__GNUC__) && __GNUC__ > 3 +# define LV2_DEPRECATED __attribute__((__deprecated__)) +#else +# define LV2_DEPRECATED +#endif + +#if defined(__clang__) +# define LV2_DISABLE_DEPRECATION_WARNINGS \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif defined(__GNUC__) && __GNUC__ > 4 +# define LV2_DISABLE_DEPRECATION_WARNINGS \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#else +# define LV2_DISABLE_DEPRECATION_WARNINGS +#endif + +#if defined(__clang__) +# define LV2_RESTORE_WARNINGS _Pragma("clang diagnostic pop") +#elif defined(__GNUC__) && __GNUC__ > 4 +# define LV2_RESTORE_WARNINGS _Pragma("GCC diagnostic pop") +#else +# define LV2_RESTORE_WARNINGS +#endif + +/** + @} +*/ + +#endif /* LV2_CORE_ATTRIBUTES_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,905 @@ +@prefix lv2: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2" ; + doap:homepage ; + doap:created "2004-04-21" ; + doap:shortdesc "An extensible open standard for audio plugins" ; + doap:programming-language "C" ; + doap:developer , + ; + doap:maintainer ; + doap:release [ + doap:revision "18.0" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:Markdown datatype." + ] , [ + rdfs:label "Deprecate lv2:reportsLatency." + ] + ] + ] , [ + doap:revision "16.0" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:MIDIPlugin class." + ] , [ + rdfs:label "Rework port restrictions so that presets can be validated." + ] + ] + ] , [ + doap:revision "14.0" ; + doap:created "2016-09-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2_util.h with lv2_features_data() and lv2_features_query()." + ] , [ + rdfs:label "Add lv2:enabled designation." + ] + ] + ] , [ + doap:revision "12.4" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Relax domain of lv2:minimum lv2:maximum and lv2:default so they can be used to describe properties/parameters as well." + ] , [ + rdfs:label "Add extern C and visibility attribute to LV2_SYMBOL_EXPORT." + ] , [ + rdfs:label "Add lv2:isSideChain port property." + ] + ] + ] , [ + doap:revision "12.2" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Clarify lv2_descriptor() and lv2_lib_descriptor() documentation." + ] + ] + ] , [ + doap:revision "12.0" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:prototype for property inheritance." + ] + ] + ] , [ + doap:revision "10.0" ; + doap:created "2013-02-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:EnvelopePlugin class." + ] , [ + rdfs:label "Add lv2:control for designating primary event-based control ports." + ] , [ + rdfs:label "Set range of lv2:designation to lv2:Designation." + ] , [ + rdfs:label "Make lv2:Parameter rdfs:subClassOf rdf:Property." + ] , [ + rdfs:label "Reserve minor version 0 for unstable development plugins." + ] + ] + ] , [ + doap:revision "8.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "8.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix LV2_SYMBOL_EXPORT and lv2_descriptor prototype for Windows." + ] , [ + rdfs:label "Add metadata concept of a designation, a channel or parameter description which can be assigned to ports for more intelligent use by hosts." + ] , [ + rdfs:label "Add new discovery API which allows libraries to read bundle files during discovery, makes library construction/destruction explicit, and adds extensibility to prevent future breakage." + ] , [ + rdfs:label "Relax the range of lv2:index so it can be used for things other than ports." + ] , [ + rdfs:label "Remove lv2:Resource, which turned out to be meaningless." + ] , [ + rdfs:label "Add lv2:CVPort." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "6.0" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Rename core.lv2 and lv2.ttl to lv2core.lv2 and lv2core.ttl to adhere to modern conventions." + ] , [ + rdfs:label "Add lv2:extensionData and lv2:ExtensionData for plugins to indicate that they support some URI for extension_data()." + ] , [ + rdfs:label "Remove lv2config in favour of the simple convention that specifications install headers to standard URI-based paths." + ] , [ + rdfs:label "Switch to the ISC license, a simple BSD-style license (with permission of all contributors to lv2.h and its ancestor, ladspa.h)." + ] , [ + rdfs:label "Make lv2core.ttl a valid OWL 2 DL ontology." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "4.0" ; + doap:created "2011-03-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make doap:license suggested, but not required (for wrappers)." + ] , [ + rdfs:label "Define lv2:binary (MUST be in manifest.ttl)." + ] , [ + rdfs:label "Define lv2:minorVersion and lv2:microVersion (MUST be in manifest.ttl)." + ] , [ + rdfs:label "Define lv2:documentation and use it to document lv2core." + ] , [ + rdfs:label "Add lv2:FunctionPlugin and lv2:ConstantPlugin classes." + ] , [ + rdfs:label "Move lv2:AmplifierPlugin under lv2:DynamicsPlugin." + ] , [ + rdfs:label "Loosen domain of lv2:optionalFeature and lv2:requiredFeature (to allow re-use in extensions)." + ] , [ + rdfs:label "Add generic lv2:Resource and lv2:PluginBase classes." + ] , [ + rdfs:label "Fix definition of lv2:minimum etc. (used for values, not scale points)." + ] , [ + rdfs:label "More precisely define properties with OWL." + ] , [ + rdfs:label "Move project metadata to manifest." + ] , [ + rdfs:label "Add lv2:enumeration port property." + ] , [ + rdfs:label "Define run() pre-roll special case (sample_count == 0)." + ] + ] + ] , [ + doap:revision "3.0" ; + doap:created "2008-11-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Require that serialisations refer to ports by symbol rather than index." + ] , [ + rdfs:label "Minor stylistic changes to lv2.ttl." + ] , [ + rdfs:label "No header changes." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2008-02-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +LV2 is an interface for writing audio plugins in C or compatible languages, +which can be dynamically loaded into many _host_ applications. This core +specification is simple and minimal, but is designed so that _extensions_ can +be defined to add more advanced features, making it possible to implement +nearly any feature. + +LV2 maintains a strong distinction between code and data. Plugin code is in a +shared library, while data is in a companion data file written in +[Turtle](https://www.w3.org/TR/turtle/). Code, data, and any other resources +(such as waveforms) are shipped together in a bundle directory. The code +contains only the executable portions of the plugin. All other data is +provided in the data file(s). This makes plugin data flexible and extensible, +and allows the host to do everything but run the plugin without loading or +executing any code. Among other advantages, this makes hosts more robust +(broken plugins can't crash a host during discovery) and allows generic tools +written in any language to work with LV2 data. The LV2 specification itself is +distributed in a similar way. + +An LV2 plugin library is suitable for dynamic loading (for example with +`dlopen()`) and provides one or more plugin descriptors via `lv2_descriptor()` +or `lv2_lib_descriptor()`. These can be instantiated to create plugin +instances, which can be run directly on data or connected together to perform +advanced signal processing tasks. + +Plugins communicate via _ports_, which can transmit any type of data. Data is +processed by first connecting each port to a buffer, then repeatedly calling +the `run()` method to process blocks of data. + +This core specification defines two types of port, equivalent to those in +[LADSPA](http://www.ladspa.org/), lv2:ControlPort and lv2:AudioPort, as well as +lv2:CVPort which has the same format as an audio port but is interpreted as +non-audible control data. Audio ports contain arrays with one `float` element +per sample, allowing a block of audio to be processed in a single call to +`run()`. Control ports contain single `float` values, which are fixed and +valid for the duration of the call to `run()`. Thus the _control rate_ is +determined by the block size, which is controlled by the host (and not +necessarily constant). + +### Threading Rules + +To faciliate use in multi-threaded programs, LV2 functions are partitioned into +several threading classes: + +| Discovery Class | Instantiation Class | Audio Class | +|----------------------------------|-------------------------------|------------------------------- | +| lv2_descriptor() | LV2_Descriptor::instantiate() | LV2_Descriptor::run() | +| lv2_lib_descriptor() | LV2_Descriptor::cleanup() | LV2_Descriptor::connect_port() | +| LV2_Descriptor::extension_data() | LV2_Descriptor::activate() | | +| | LV2_Descriptor::deactivate() | | + +Hosts MUST guarantee that: + + * A function in any class is never called concurrently with another function + in that class. + + * A _Discovery_ function is never called concurrently with any other fuction + in the same shared object file. + + * An _Instantiation_ function for an instance is never called concurrently + with any other function for that instance. + +Any simultaneous calls that are not explicitly forbidden by these rules are +allowed. For example, a host may call `run()` for two different plugin +instances simultaneously. + +Plugin functions in any class MUST NOT manipulate any state which might affect +other plugins or the host (beyond the contract of that function), for example +by using non-reentrant global functions. + +Extensions to this specification which add new functions MUST declare in which +of these classes the functions belong, define new classes for them, or +otherwise precisely describe their threading rules. + +"""^^lv2:Markdown . + +lv2:Specification + lv2:documentation """ + +An LV2 specification typically contains a vocabulary description, C headers to +define an API, and any other resources that may be useful. Specifications, +like plugins, are distributed and installed as bundles so that hosts may +discover them. + +"""^^lv2:Markdown . + +lv2:Markdown + lv2:documentation """ + +This datatype is typically used for documentation in +[Markdown](https://daringfireball.net/projects/markdown/syntax) syntax. + +Generally, documentation with this datatype should stay as close to readable +plain text as possible, but may use core Markdown syntax for nicer +presentation. Documentation can assume that basic extensions like codehilite +and tables are available. + +"""^^lv2:Markdown . + +lv2:documentation + lv2:documentation """ + +Relates a Resource to extended documentation. + +LV2 specifications are documented using this property with an lv2:Markdown +datatype. + +If the value has no explicit datatype, it is assumed to be a valid XHTML Basic +1.1 fragment suitable for use as the content of the `body` element of a page. + +XHTML Basic is a W3C Recommendation which defines a simplified subset of XHTML +intended to be reasonable to implement with limited resources, for exampe on +embedded devices. See [XHTML Basic, Section +3](http://www.w3.org/TR/xhtml-basic/#s_xhtmlmodules) for a list of valid tags. + +"""^^lv2:Markdown . + +lv2:PluginBase + lv2:documentation """ + +An abstract plugin-like resource that may not actually be an LV2 plugin, for +example that may not have a lv2:binary. This is useful for describing things +that share common structure with a plugin, but are not themselves an actul +plugin, such as presets. + +"""^^lv2:Markdown . + +lv2:Plugin + lv2:documentation """ + +To be discovered by hosts, plugins MUST explicitly have an rdf:type of lv2:Plugin +in their bundle's manifest, for example: + + :::turtle + a lv2:Plugin . + +Plugins should have a doap:name property that is at most a few words in length +using title capitalization, for example Tape Delay Unit. + +"""^^lv2:Markdown . + +lv2:PortBase + lv2:documentation """ + +Similar to lv2:PluginBase, this is an abstract port-like resource that may not +be a fully specified LV2 port. For example, this is used for preset "ports" +which do not specify an index. + +"""^^lv2:Markdown . + +lv2:Port + lv2:documentation """ + +All LV2 port descriptions MUST have a rdf:type that is one of lv2:Port, +lv2:InputPort or lv2:OutputPort. Additionally, there MUST be at least one +other rdf:type which more precisely describes type of the port, for example +lv2:AudioPort. + +Hosts that do not support a specific port class MUST NOT instantiate the +plugin, unless that port has the lv2:connectionOptional property set. + +A port has two identifiers: a (numeric) index, and a (textual) symbol. The +index can be used as an identifier at run-time, but persistent references to +ports (for example in presets or save files) MUST use the symbol. Only the +symbol is guaranteed to refer to the same port on all plugins with a given URI, +that is the index for a port may differ between plugin binaries. + +"""^^lv2:Markdown . + +lv2:AudioPort + lv2:documentation """ + +Ports of this type are connected to a buffer of `float` audio samples, which +the host guarantees have `sample_count` elements in any call to +LV2_Descriptor::run(). + +Audio samples are normalized between -1.0 and 1.0, though there is no +requirement for samples to be strictly within this range. + +"""^^lv2:Markdown . + +lv2:CVPort + lv2:documentation """ + +Ports of this type have the same buffer format as an lv2:AudioPort, except the +buffer represents audio-rate control data rather than audio. Like a +lv2:ControlPort, a CV port SHOULD have properties describing its value, in +particular lv2:minimum, lv2:maximum, and lv2:default. + +Hosts may present CV ports to users as controls in the same way as control +ports. Conceptually, aside from the buffer format, a CV port is the same as a +control port, so hosts can use all the same properties and expectations. + +In particular, this port type does not imply any range, unit, or meaning for +its values. However, if there is no inherent unit to the values, for example +if the port is used to modulate some other value, then plugins SHOULD use a +normalized range, either from -1.0 to 1.0, or from 0.0 to 1.0. + +It is generally safe to connect an audio output to a CV input, but not +vice-versa. Hosts must take care to prevent data from a CVPort port from being +used as audio. + +"""^^lv2:Markdown . + +lv2:project + lv2:documentation """ + +This property provides a way to group plugins and/or related resources. A +project may have useful metadata common to all plugins (such as homepage, +author, version history) which would be wasteful to list separately for each +plugin. + +Grouping via projects also allows users to find plugins in hosts by project, +which is often how they are remembered. For this reason, a project that +contains plugins SHOULD always have a doap:name. It is also a good idea for +each plugin and the project itself to have an lv2:symbol property, which allows +nice quasi-global identifiers for plugins, for example `myproj.superamp` which +can be useful for display or fast user entry. + +"""^^lv2:Markdown . + +lv2:prototype + lv2:documentation """ + +This property can be used to include common properties in several +descriptions, serving as a sort of template mechanism. If a plugin has a +prototype, then the host must load all the properties for the prototype as if +they were properties of the plugin. That is, if `:plug lv2:prototype :prot`, +then for each triple `:prot p o`, the triple `:plug p o` should be loaded. + +This facility is useful for distributing data-only plugins that rely on a +common binary, for example those where the internal state is loaded from some +other file. Such plugins can refer to a prototype in a template LV2 bundle +which is installed by the corresponding software. + +"""^^lv2:Markdown . + +lv2:minorVersion + lv2:documentation """ + +This, along with lv2:microVersion, is used to distinguish between different +versions of the same resource, for example to load only the bundle with +the most recent version of a plugin. An LV2 version has a minor and micro +number with the usual semantics: + + * The minor version MUST be incremented when backwards (but not forwards) + compatible additions are made, for example the addition of a port to a + plugin. + + * The micro version is incremented for changes which do not affect + compatibility at all, for example bug fixes or documentation updates. + +Note that there is deliberately no major version: all versions with the same +URI are compatible by definition. Replacing a resource with a newer version of +that resource MUST NOT break anything. If a change violates this rule, then +the URI of the resource (which serves as the major version) MUST be changed. + +Plugins and extensions MUST adhere to at least the following rules: + + * All versions of a plugin with a given URI MUST have the same set of + mandatory (not lv2:connectionOptional) ports with respect to lv2:symbol and + rdf:type. In other words, every port on a particular version is guaranteed + to exist on a future version with same lv2:symbol and at least those + rdf:types. + + * New ports MAY be added without changing the plugin URI if and only if they + are lv2:connectionOptional and the minor version is incremented. + + * The minor version MUST be incremented if the index of any port (identified + by its symbol) is changed. + + * All versions of a specification MUST be compatible in the sense that an + implementation of the new version can interoperate with an implementation + of any previous version. + +Anything that depends on a specific version of a plugin (including referencing +ports by index) MUST refer to the plugin by both URI and version. However, +implementations should be tolerant where possible. + +When hosts discover several installed versions of a resource, they SHOULD warn +the user and load only the most recent version. + +An odd minor _or_ micro version, or minor version zero, indicates that the +resource is a development version. Hosts and tools SHOULD clearly indicate +this wherever appropriate. Minor version zero is a special case for +pre-release development of plugins, or experimental plugins that are not +intended for stable use at all. Hosts SHOULD NOT expect such a plugin to +remain compatible with any future version. Where feasible, hosts SHOULD NOT +expose such plugins to users by default, but may provide an option to display +them. + +"""^^lv2:Markdown . + +lv2:microVersion + lv2:documentation """ + +Releases of plugins and extensions MUST be explicitly versioned. Correct +version numbers MUST always be maintained for any versioned resource that is +published. For example, after a release, if a change is made in the development +version in source control, the micro version MUST be incremented (to an odd +number) to distinguish this modified version from the previous release. + +This property describes half of a resource version. For detailed documentation +on LV2 resource versioning, see lv2:minorVersion. + +"""^^lv2:Markdown . + +lv2:binary + lv2:documentation """ + +The value of this property must be the URI of a shared library object, +typically in the same bundle as the data file which contains this property. +The actual type of the library is platform specific. + +This is a required property of a lv2:Plugin which MUST be included in the +bundle's `manifest.ttl` file. The lv2:binary of a lv2:Plugin is the shared +object containing the lv2_descriptor() or lv2_lib_descriptor() function. This +probably may also be used similarly by extensions to relate other resources to +their implementations (it is not implied that a lv2:binary on an arbitrary +resource is an LV2 plugin library). + +"""^^lv2:Markdown . + +lv2:appliesTo + lv2:documentation """ + +This is primarily intended for discovery purposes: bundles that describe +resources that work with particular plugins (like presets or user interfaces) +SHOULD specify this in their `manifest.ttl` so the host can associate them with +the correct plugin. For example: + + :::turtle + + a ext:Thing ; + lv2:appliesTo ; + rdfs:seeAlso . + +Using this pattern is preferable for large amounts of data, since the host may +choose whether/when to load the data. + +"""^^lv2:Markdown . + +lv2:Symbol + lv2:documentation """ + +The first character of a symbol must be one of `_`, `a-z` or `A-Z`, and +subsequent characters may additionally be `0-9`. This is, among other things, +a valid C identifier, and generally compatible in most contexts which have +restrictions on string identifiers, such as file paths. + +"""^^lv2:Markdown . + +lv2:symbol + lv2:documentation """ + +The value of this property MUST be a valid lv2:Symbol, and MUST NOT have a +language tag. + +A symbol is a unique identifier with respect to the parent, for example a +port's symbol is a unique identifiers with respect to its plugin. The plugin +author MUST change the plugin URI if any port symbol is changed or removed. + +"""^^lv2:Markdown . + +lv2:name + lv2:documentation """ + +Unlike lv2:symbol, this is unrestricted, may be translated, and is not relevant +for compatibility. The name is not necessarily unique and MUST NOT be used as +an identifier. + +"""^^lv2:Markdown . + +lv2:shortName + lv2:documentation """ + +This is the same as lv2:name, with the additional requirement that the value is +shorter than 16 characters. + +"""^^lv2:Markdown . + +lv2:Designation + lv2:documentation """ + +A designation is metadata that describes the meaning or role of something. By +assigning a designation to a port using lv2:designation, the port's content +becomes meaningful and can be used more intelligently by the host. + +"""^^lv2:Markdown . + +lv2:Channel + lv2:documentation """ + +A specific channel, for example the left channel of a stereo stream. A +channel may be audio, or another type such as a MIDI control stream. + +"""^^lv2:Markdown . + +lv2:Parameter + lv2:documentation """ + +A parameter is a designation for a control. + +A parameter defines the meaning of a control, not the method of conveying its +value. For example, a parameter could be controlled via a lv2:ControlPort, +messages, or both. + +A lv2:ControlPort can be associated with a parameter using lv2:designation. + +"""^^lv2:Markdown . + +lv2:designation + lv2:documentation """ + +This property is used to give a port's contents a well-defined meaning. For +example, if a port has the designation `eg:gain`, then the value of that port +represents the `eg:gain` of the plugin instance. + +Ports should be given designations whenever possible, particularly if a +suitable designation is already defined. This allows the host to act more +intelligently and provide a more effective user interface. For example, if the +plugin has a BPM parameter, the host may automatically set that parameter to +the current tempo. + +"""^^lv2:Markdown . + +lv2:freeWheeling + lv2:documentation """ + +If true, this means that all processing is happening as quickly as possible, +not in real-time. When free-wheeling there is no relationship between the +passage of real wall-clock time and the passage of time in the data being +processed. + +"""^^lv2:Markdown . + +lv2:enabled + lv2:documentation """ + +If this value is greater than zero, the plugin processes normally. If this +value is zero, the plugin is expected to bypass all signals unmodified. The +plugin must provide a click-free transition between the enabled and disabled +(bypassed) states. + +Values less than zero are reserved for future use (such as click-free +insertion/removal of latent plugins), and should be treated like zero +(bypassed) by current implementations. + +"""^^lv2:Markdown . + +lv2:control + lv2:documentation """ + +This should be used as the lv2:designation of ports that are used to send +commands and receive responses. Typically this will be an event port that +supports some protocol, for example MIDI or LV2 Atoms. + +"""^^lv2:Markdown . + +lv2:Point + lv2:documentation """ + + * A Point MUST have at least one rdfs:label which is a string. + + * A Point MUST have exactly one rdf:value with a type that is compatible with + the type of the corresponding Port. + +"""^^lv2:Markdown . + +lv2:default + lv2:documentation """ + +The host SHOULD set the port to this value initially, and in any situation +where the port value should be cleared or reset. + +"""^^lv2:Markdown . + +lv2:minimum + lv2:documentation """ + +This is a soft limit: the plugin is required to gracefully accept all values in +the range of a port's data type. + +"""^^lv2:Markdown . + +lv2:maximum + lv2:documentation """ + +This is a soft limit: the plugin is required to gracefully accept all values in +the range of a port's data type. + +"""^^lv2:Markdown . + +lv2:optionalFeature + lv2:documentation """ + +To support this feature, the host MUST pass its URI and any additional data to +the plugin in LV2_Descriptor::instantiate(). + +The plugin MUST NOT fail to instantiate if an optional feature is not supported +by the host. + +"""^^lv2:Markdown . + +lv2:requiredFeature + lv2:documentation """ + +To support this feature, the host MUST pass its URI and any additional data to +the plugin in LV2_Descriptor::instantiate(). + +The host MUST check this property before attempting to instantiate a plugin, +and not attempt to instantiate plugins which require features it does not +support. The plugin MUST fail to instantiate if a required feature is not +supported by the host. Note that these rules are intentionally redundant for +resilience: neither host nor plugin should assume that the other does not +violate them. + +"""^^lv2:Markdown . + +lv2:ExtensionData + lv2:documentation """ + +This is additional data that a plugin may return from +LV2_Descriptor::extension_data(). This is generally used to add APIs to extend +that defined by LV2_Descriptor. + +"""^^lv2:Markdown . + +lv2:extensionData + lv2:documentation """ + +If a plugin has a value for this property, it must be a URI that defines the +extension data. The plugin should return the appropriate data when +LV2_Descriptor::extension_data() is called with that URI as a parameter. + +"""^^lv2:Markdown . + +lv2:isLive + lv2:documentation """ + +This feature is for plugins that have time-sensitive internals, for example +communicating in real time over a socket. It indicates to the host that its +input and output must not be cached or subject to significant latency, and that +calls to LV2_Descriptor::run() should be made at a rate that roughly +corresponds to wall clock time (according to the `sample_count` parameter). + +Note that this feature is not related to hard real-time execution +requirements (see lv2:hardRTCapable). + +"""^^lv2:Markdown . + +lv2:inPlaceBroken + lv2:documentation """ + +This feature indicates that the plugin may not work correctly if the host +elects to use the same data location for both input and output. Plugins that +will fail to work correctly if ANY input port is connected to the same location +as ANY output port MUST require this feature. Doing so should be avoided +whenever possible since it prevents hosts from running the plugin on data +in-place. + +"""^^lv2:Markdown . + +lv2:hardRTCapable + lv2:documentation """ + +This feature indicates that the plugin is capable of running in a hard +real-time environment. This should be the case for most audio processors, +so most plugins are expected to have this feature. + +To support this feature, plugins MUST adhere to the following in all of their +audio class functions (LV2_Descriptor::run() and +LV2_Descriptor::connect_port()): + + * There is no use of `malloc()`, `free()` or any other heap memory management + functions. + + * There is no use of any library functions which do not adhere to these + rules. The plugin may assume that the standard C math library functions + are safe. + + * There is no access to files, devices, pipes, sockets, system calls, or any + other mechanism that might result in the process or thread blocking. + + * The maximum amount of time for a `run()` call is bounded by some expression + of the form `A + B * sample_count`, where `A` and `B` are platform specific + constants. Note that this bound does not depend on input signals or plugin + state. + +"""^^lv2:Markdown . + +lv2:portProperty + lv2:documentation """ + +States that a port has a particular lv2:PortProperty. This may be ignored +without catastrophic effects, though it may be useful, for example to provide a +sensible user interface for the port. + +"""^^lv2:Markdown . + +lv2:connectionOptional + lv2:documentation """ + +This property means that the port does not have to be connected to valid data +by the host. To leave a port unconnected, the host MUST explicitly +connect the port to `NULL`. + +"""^^lv2:Markdown . + +lv2:reportsLatency + lv2:documentation """ + +This property indicates that the port is used to express the processing latency +incurred by the plugin, expressed in samples. The latency may be affected by +the current sample rate, plugin settings, or other factors, and may be changed +by the plugin at any time. Where the latency is frequency dependent the plugin +may choose any appropriate value. If a plugin introduces latency it MUST +provide EXACTLY ONE port with this property set. In fuzzy cases the +value should be the most reasonable one based on user expectation of +input/output alignment. For example, musical delay plugins should not report +their delay as latency, since it is an intentional effect that the host should +not compensate for. + +This property is deprecated, use a lv2:designation of lv2:latency instead, +following the same rules as above: + + :::turtle + + lv2:port [ + a lv2:OutputPort , lv2:ControlPort ; + lv2:designation lv2:latency ; + lv2:symbol "latency" ; + ] + +"""^^lv2:Markdown . + +lv2:toggled + lv2:documentation """ + +Indicates that the data item should be considered a boolean toggle. Data less +than or equal to zero should be considered off or false, and data +above zero should be considered on or true. + +"""^^lv2:Markdown . + +lv2:sampleRate + lv2:documentation """ + +Indicates that any specified bounds should be interpreted as multiples of the +sample rate. For example, a frequency range from 0 Hz to the Nyquist frequency +(half the sample rate) can be specified by using this property with lv2:minimum +0.0 and lv2:maximum 0.5. Hosts that support bounds at all MUST support this +property. + +"""^^lv2:Markdown . + +lv2:integer + lv2:documentation """ + +Indicates that all the reasonable values for a port are integers. For such +ports, a user interface should provide a stepped control that only allows +choosing integer values. + +Note that this is only a hint, and that the plugin MUST operate reasonably even +if such a port has a non-integer value. + +"""^^lv2:Markdown . + +lv2:enumeration + lv2:documentation """ + +Indicates that all the rasonable values for a port are defined by +lv2:scalePoint properties. For such ports, a user interface should provide a selector that allows the user to choose any of the scale point values by name. It is recommended to show the value as well if possible. + +Note that this is only a hint, and that the plugin MUST operate reasonably even +if such a port has a value that does not correspond to a scale point. + +"""^^lv2:Markdown . + +lv2:isSideChain + lv2:documentation """ + +Indicates that a port is a sidechain, which affects the output somehow +but should not be considered a part of the main signal chain. Sidechain ports +SHOULD be lv2:connectionOptional, and may be ignored by hosts. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,674 @@ +@prefix doap: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2" ; + rdfs:comment "An extensible open standard for audio plugins." ; + rdfs:seeAlso , + , + . + +lv2:Specification + a rdfs:Class , + owl:Class ; + rdfs:subClassOf doap:Project ; + rdfs:label "Specification" ; + rdfs:comment "An LV2 specifiation." . + +lv2:Markdown + a rdfs:Datatype ; + owl:onDatatype xsd:string ; + rdfs:label "Markdown" ; + rdfs:comment "A string in Markdown syntax." . + +lv2:documentation + a rdf:Property , + owl:AnnotationProperty ; + rdfs:range rdfs:Literal ; + rdfs:label "documentation" ; + rdfs:comment "Extended documentation." ; + rdfs:seeAlso . + +lv2:PluginBase + a rdfs:Class , + owl:Class ; + rdfs:label "Plugin Base" ; + rdfs:comment "Base class for a plugin-like resource." . + +lv2:Plugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:PluginBase ; + rdfs:label "Plugin" ; + rdfs:comment "An LV2 plugin." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty doap:name ; + owl:someValuesFrom rdf:PlainLiteral ; + rdfs:comment "A plugin MUST have at least one untranslated doap:name." + ] , [ + a owl:Restriction ; + owl:onProperty lv2:port ; + owl:allValuesFrom lv2:Port ; + rdfs:comment "All ports on a plugin MUST be fully specified lv2:Port instances." + ] . + +lv2:PortBase + a rdfs:Class , + owl:Class ; + rdfs:label "Port Base" ; + rdfs:comment "Base class for a port-like resource." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:symbol ; + owl:cardinality 1 ; + rdfs:comment "A port MUST have exactly one lv2:symbol." + ] . + +lv2:Port + a rdfs:Class , + owl:Class ; + rdfs:label "Port" ; + rdfs:comment "An LV2 plugin port." ; + rdfs:subClassOf lv2:PortBase , + [ + a owl:Restriction ; + owl:onProperty lv2:name ; + owl:minCardinality 1 ; + rdfs:comment "A port MUST have at least one lv2:name." + ] . + +lv2:InputPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Input Port" ; + rdfs:comment "A port connected to constant data which is read during `run()`." . + +lv2:OutputPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Output Port" ; + rdfs:comment "A port connected to data which is written during `run()`." . + +lv2:ControlPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Control Port" ; + rdfs:comment "A port connected to a single `float`." . + +lv2:AudioPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Audio Port" ; + rdfs:comment "A port connected to an array of float audio samples." . + +lv2:CVPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "CV Port" ; + rdfs:comment "A port connected to an array of float control values." . + +lv2:port + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:PluginBase ; + rdfs:range lv2:PortBase ; + rdfs:label "port" ; + rdfs:comment "A port (input or output) on this plugin." . + +lv2:project + a rdf:Property , + owl:ObjectProperty ; + rdfs:range doap:Project ; + rdfs:label "project" ; + rdfs:comment "The project this is a part of." . + +lv2:prototype + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "prototype" ; + rdfs:comment "The prototype to inherit properties from." . + +lv2:minorVersion + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "minor version" ; + rdfs:comment "The minor version of this resource." . + +lv2:microVersion + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "micro version" ; + rdfs:comment "The micro version of this resource." . + +lv2:binary + a rdf:Property , + owl:ObjectProperty ; + rdfs:range owl:Thing ; + rdfs:label "binary" ; + rdfs:comment "The binary of this resource." . + +lv2:appliesTo + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:Plugin ; + rdfs:label "applies to" ; + rdfs:comment "The plugin this resource is related to." . + +lv2:index + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:range xsd:unsignedInt ; + rdfs:label "index" ; + rdfs:comment "A non-negative zero-based 32-bit index." . + +lv2:Symbol + a rdfs:Datatype ; + owl:onDatatype xsd:string ; + owl:withRestrictions ( + [ + xsd:pattern "[_a-zA-Z][_a-zA-Z0-9]*" + ] + ) ; + rdfs:label "Symbol" ; + rdfs:comment "A short restricted name used as a strong identifier." . + +lv2:symbol + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "symbol" ; + rdfs:range lv2:Symbol , + rdf:PlainLiteral ; + rdfs:comment "The symbol that identifies this resource in the context of its parent." . + +lv2:name + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "name" ; + rdfs:range xsd:string ; + rdfs:comment "A display name for labeling in a user interface." . + +lv2:shortName + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "short name" ; + rdfs:range xsd:string ; + rdfs:comment "A short display name for labeling in a user interface." . + +lv2:Designation + a rdfs:Class , + owl:Class ; + rdfs:subClassOf rdf:Property ; + rdfs:label "Designation" ; + rdfs:comment "A designation which defines the meaning of some data." . + +lv2:Channel + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Designation ; + rdfs:label "Channel" ; + rdfs:comment "An individual channel, such as left or right." . + +lv2:Parameter + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Designation , + rdf:Property ; + rdfs:label "Parameter" ; + rdfs:comment "A property that is a plugin parameter." . + +lv2:designation + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:range rdf:Property ; + rdfs:label "designation" ; + rdfs:comment "The designation that defines the meaning of this input or output." . + +lv2:latency + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "latency" ; + rdfs:comment "The latency introduced, in frames." . + +lv2:freeWheeling + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "free-wheeling" ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether processing is currently free-wheeling." . + +lv2:enabled + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "enabled" ; + rdfs:range xsd:int ; + rdfs:comment "Whether processing is currently enabled (not bypassed)." . + +lv2:control + a lv2:Channel ; + rdfs:label "control" ; + rdfs:comment "The primary control channel." . + +lv2:Point + a rdfs:Class , + owl:Class ; + rdfs:label "Point" ; + rdfs:comment "An interesting point in a value range." . + +lv2:ScalePoint + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Point ; + rdfs:label "Scale Point" ; + rdfs:comment "A single `float` Point for control inputs." . + +lv2:scalePoint + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:ScalePoint ; + rdfs:label "scale point" ; + rdfs:comment "A scale point of a port or parameter." . + +lv2:default + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "default" ; + rdfs:comment "The default value for this control." . + +lv2:minimum + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "minimum" ; + rdfs:comment "The minimum value for this control." . + +lv2:maximum + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "maximum" ; + rdfs:comment "The maximum value for this control." . + +lv2:Feature + a rdfs:Class , + owl:Class ; + rdfs:label "Feature" ; + rdfs:comment "An additional feature which may be used or required." . + +lv2:optionalFeature + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:Feature ; + rdfs:label "optional feature" ; + rdfs:comment "An optional feature that is supported if available." . + +lv2:requiredFeature + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:Feature ; + rdfs:label "required feature" ; + rdfs:comment "A required feature that must be available to run." . + +lv2:ExtensionData + a rdfs:Class , + owl:Class ; + rdfs:label "Extension Data" ; + rdfs:comment "Additional data defined by an extension." . + +lv2:extensionData + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:ExtensionData ; + rdfs:label "extension data" ; + rdfs:comment "Extension data provided by a plugin or other binary." . + +lv2:isLive + a lv2:Feature ; + rdfs:label "is live" ; + rdfs:comment "Plugin has a real-time dependency." . + +lv2:inPlaceBroken + a lv2:Feature ; + rdfs:label "in-place broken" ; + rdfs:comment "Plugin requires separate locations for input and output." . + +lv2:hardRTCapable + a lv2:Feature ; + rdfs:label "hard real-time capable" ; + rdfs:comment "Plugin is capable of running in a hard real-time environment." . + +lv2:PortProperty + a rdfs:Class , + owl:Class ; + rdfs:label "Port Property" ; + rdfs:comment "A particular property that a port has." . + +lv2:portProperty + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:Port ; + rdfs:range lv2:PortProperty ; + rdfs:label "port property" ; + rdfs:comment "A property of this port hosts may find useful." . + +lv2:connectionOptional + a lv2:PortProperty ; + rdfs:label "connection optional" ; + rdfs:comment "The property that this port may be connected to NULL." . + +lv2:reportsLatency + a lv2:PortProperty ; + owl:deprecated "true"^^xsd:boolean ; + rdfs:label "reports latency" ; + rdfs:comment "Control port value is the plugin latency in frames." . + +lv2:toggled + a lv2:PortProperty ; + rdfs:label "toggled" ; + rdfs:comment "Control port value is considered a boolean toggle." . + +lv2:sampleRate + a lv2:PortProperty ; + rdfs:label "sample rate" ; + rdfs:comment "Control port bounds are interpreted as multiples of the sample rate." . + +lv2:integer + a lv2:PortProperty ; + rdfs:label "integer" ; + rdfs:comment "Control port values are treated as integers." . + +lv2:enumeration + a lv2:PortProperty ; + rdfs:label "enumeration" ; + rdfs:comment "Control port scale points represent all useful values." . + +lv2:isSideChain + a lv2:PortProperty ; + rdfs:label "is side-chain" ; + rdfs:comment "Signal for port should not be considered a main input or output." . + +lv2:GeneratorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Generator Plugin" ; + rdfs:comment "A plugin that generates new sound internally." . + +lv2:InstrumentPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Instrument Plugin" ; + rdfs:comment "A plugin intended to be played as a musical instrument." . + +lv2:OscillatorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Oscillator Plugin" ; + rdfs:comment "A plugin that generates output with an oscillator." . + +lv2:UtilityPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Utility Plugin" ; + rdfs:comment "A utility plugin that is not a typical audio effect or generator." . + +lv2:ConverterPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Converter Plugin" ; + rdfs:comment "A plugin that converts its input into a different form." . + +lv2:AnalyserPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Analyser Plugin" ; + rdfs:comment "A plugin that analyses its input and emits some useful information." . + +lv2:MixerPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Mixer Plugin" ; + rdfs:comment "A plugin that mixes some number of inputs into some number of outputs." . + +lv2:SimulatorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Simulator Plugin" ; + rdfs:comment "A plugin that aims to emulate some environmental effect or musical equipment." . + +lv2:DelayPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Delay Plugin" ; + rdfs:comment "An effect that intentionally delays its input as an effect." . + +lv2:ModulatorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Modulator Plugin" ; + rdfs:comment "An effect that modulats its input as an effect." . + +lv2:ReverbPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin , + lv2:SimulatorPlugin , + lv2:DelayPlugin ; + rdfs:label "Reverb Plugin" ; + rdfs:comment "An effect that adds reverberation to its input." . + +lv2:PhaserPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Phaser Plugin" ; + rdfs:comment "An effect that periodically sweeps a filter over its input." . + +lv2:FlangerPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Flanger Plugin" ; + rdfs:comment "An effect that mixes slightly delayed copies of its input." . + +lv2:ChorusPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Chorus Plugin" ; + rdfs:comment "An effect that mixes significantly delayed copies of its input." . + +lv2:FilterPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Filter Plugin" ; + rdfs:comment "An effect that manipulates the frequency spectrum of its input." . + +lv2:LowpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Lowpass Filter Plugin" ; + rdfs:comment "A filter that attenuates frequencies above some cutoff." . + +lv2:BandpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Bandpass Filter Plugin" ; + rdfs:comment "A filter that attenuates frequencies outside of some band." . + +lv2:HighpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Highpass Filter Plugin" ; + rdfs:comment "A filter that attenuates frequencies below some cutoff." . + +lv2:CombPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Comb FilterPlugin" ; + rdfs:comment "A filter that adds a delayed version of its input to itself." . + +lv2:AllpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Allpass Plugin" ; + rdfs:comment "A filter that changes the phase relationship between frequency components." . + +lv2:EQPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Equaliser Plugin" ; + rdfs:comment "A plugin that adjusts the balance between frequency components." . + +lv2:ParaEQPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:EQPlugin ; + rdfs:label "Parametric EQ Plugin" ; + rdfs:comment "A plugin that adjusts the balance between configurable frequency components." . + +lv2:MultiEQPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:EQPlugin ; + rdfs:label "Multiband EQ Plugin" ; + rdfs:comment "A plugin that adjusts the balance between a fixed set of frequency components." . + +lv2:SpatialPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Spatial Plugin" ; + rdfs:comment "A plugin that manipulates the position of audio in space." . + +lv2:SpectralPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Spectral Plugin" ; + rdfs:comment "A plugin that alters the spectral properties of audio." . + +lv2:PitchPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:SpectralPlugin ; + rdfs:label "Pitch Shifter Plugin" ; + rdfs:comment "A plugin that shifts the pitch of its input." . + +lv2:AmplifierPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Amplifier Plugin" ; + rdfs:comment "A plugin that primarily changes the volume of its input." . + +lv2:EnvelopePlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Envelope Plugin" ; + rdfs:comment "A plugin that applies an envelope to its input." . + +lv2:DistortionPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Distortion Plugin" ; + rdfs:comment "A plugin that adds distortion to its input." . + +lv2:WaveshaperPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DistortionPlugin ; + rdfs:label "Waveshaper Plugin" ; + rdfs:comment "An effect that alters the shape of input waveforms." . + +lv2:DynamicsPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Dynamics Plugin" ; + rdfs:comment "A plugin that alters the envelope or dynamic range of its input." . + +lv2:CompressorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Compressor Plugin" ; + rdfs:comment "A plugin that reduces the dynamic range of its input." . + +lv2:ExpanderPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Expander Plugin" ; + rdfs:comment "A plugin that expands the dynamic range of its input." . + +lv2:LimiterPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Limiter Plugin" ; + rdfs:comment "A plugin that limits its input to some maximum level." . + +lv2:GatePlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Gate Plugin" ; + rdfs:comment "A plugin that attenuates signals below some threshold." . + +lv2:FunctionPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Function Plugin" ; + rdfs:comment "A plugin whose output is a mathmatical function of its input." . + +lv2:ConstantPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Constant Plugin" ; + rdfs:comment "A plugin that emits constant values." . + +lv2:MIDIPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "MIDI Plugin" ; + rdfs:comment "A plugin that primarily processes MIDI messages." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,484 @@ +/* + LV2 - An audio plugin interface specification. + Copyright 2007-2012 Steve Harris, David Robillard. + + Based on LADSPA, Copyright 2000-2002 Richard W.E. Furse, + Paul Barton-Davis, Stefan Westerfeld. + + 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. +*/ + +#ifndef LV2_H_INCLUDED +#define LV2_H_INCLUDED + +/** + @defgroup lv2 LV2 + + The LV2 specification. + + @{ +*/ + +/** + @defgroup lv2core LV2 Core + + Core LV2 specification. + + See for details. + + @{ +*/ + +#include + +// clang-format off + +#define LV2_CORE_URI "http://lv2plug.in/ns/lv2core" ///< http://lv2plug.in/ns/lv2core +#define LV2_CORE_PREFIX LV2_CORE_URI "#" ///< http://lv2plug.in/ns/lv2core# + +#define LV2_CORE__AllpassPlugin LV2_CORE_PREFIX "AllpassPlugin" ///< http://lv2plug.in/ns/lv2core#AllpassPlugin +#define LV2_CORE__AmplifierPlugin LV2_CORE_PREFIX "AmplifierPlugin" ///< http://lv2plug.in/ns/lv2core#AmplifierPlugin +#define LV2_CORE__AnalyserPlugin LV2_CORE_PREFIX "AnalyserPlugin" ///< http://lv2plug.in/ns/lv2core#AnalyserPlugin +#define LV2_CORE__AudioPort LV2_CORE_PREFIX "AudioPort" ///< http://lv2plug.in/ns/lv2core#AudioPort +#define LV2_CORE__BandpassPlugin LV2_CORE_PREFIX "BandpassPlugin" ///< http://lv2plug.in/ns/lv2core#BandpassPlugin +#define LV2_CORE__CVPort LV2_CORE_PREFIX "CVPort" ///< http://lv2plug.in/ns/lv2core#CVPort +#define LV2_CORE__ChorusPlugin LV2_CORE_PREFIX "ChorusPlugin" ///< http://lv2plug.in/ns/lv2core#ChorusPlugin +#define LV2_CORE__CombPlugin LV2_CORE_PREFIX "CombPlugin" ///< http://lv2plug.in/ns/lv2core#CombPlugin +#define LV2_CORE__CompressorPlugin LV2_CORE_PREFIX "CompressorPlugin" ///< http://lv2plug.in/ns/lv2core#CompressorPlugin +#define LV2_CORE__ConstantPlugin LV2_CORE_PREFIX "ConstantPlugin" ///< http://lv2plug.in/ns/lv2core#ConstantPlugin +#define LV2_CORE__ControlPort LV2_CORE_PREFIX "ControlPort" ///< http://lv2plug.in/ns/lv2core#ControlPort +#define LV2_CORE__ConverterPlugin LV2_CORE_PREFIX "ConverterPlugin" ///< http://lv2plug.in/ns/lv2core#ConverterPlugin +#define LV2_CORE__DelayPlugin LV2_CORE_PREFIX "DelayPlugin" ///< http://lv2plug.in/ns/lv2core#DelayPlugin +#define LV2_CORE__DistortionPlugin LV2_CORE_PREFIX "DistortionPlugin" ///< http://lv2plug.in/ns/lv2core#DistortionPlugin +#define LV2_CORE__DynamicsPlugin LV2_CORE_PREFIX "DynamicsPlugin" ///< http://lv2plug.in/ns/lv2core#DynamicsPlugin +#define LV2_CORE__EQPlugin LV2_CORE_PREFIX "EQPlugin" ///< http://lv2plug.in/ns/lv2core#EQPlugin +#define LV2_CORE__EnvelopePlugin LV2_CORE_PREFIX "EnvelopePlugin" ///< http://lv2plug.in/ns/lv2core#EnvelopePlugin +#define LV2_CORE__ExpanderPlugin LV2_CORE_PREFIX "ExpanderPlugin" ///< http://lv2plug.in/ns/lv2core#ExpanderPlugin +#define LV2_CORE__ExtensionData LV2_CORE_PREFIX "ExtensionData" ///< http://lv2plug.in/ns/lv2core#ExtensionData +#define LV2_CORE__Feature LV2_CORE_PREFIX "Feature" ///< http://lv2plug.in/ns/lv2core#Feature +#define LV2_CORE__FilterPlugin LV2_CORE_PREFIX "FilterPlugin" ///< http://lv2plug.in/ns/lv2core#FilterPlugin +#define LV2_CORE__FlangerPlugin LV2_CORE_PREFIX "FlangerPlugin" ///< http://lv2plug.in/ns/lv2core#FlangerPlugin +#define LV2_CORE__FunctionPlugin LV2_CORE_PREFIX "FunctionPlugin" ///< http://lv2plug.in/ns/lv2core#FunctionPlugin +#define LV2_CORE__GatePlugin LV2_CORE_PREFIX "GatePlugin" ///< http://lv2plug.in/ns/lv2core#GatePlugin +#define LV2_CORE__GeneratorPlugin LV2_CORE_PREFIX "GeneratorPlugin" ///< http://lv2plug.in/ns/lv2core#GeneratorPlugin +#define LV2_CORE__HighpassPlugin LV2_CORE_PREFIX "HighpassPlugin" ///< http://lv2plug.in/ns/lv2core#HighpassPlugin +#define LV2_CORE__InputPort LV2_CORE_PREFIX "InputPort" ///< http://lv2plug.in/ns/lv2core#InputPort +#define LV2_CORE__InstrumentPlugin LV2_CORE_PREFIX "InstrumentPlugin" ///< http://lv2plug.in/ns/lv2core#InstrumentPlugin +#define LV2_CORE__LimiterPlugin LV2_CORE_PREFIX "LimiterPlugin" ///< http://lv2plug.in/ns/lv2core#LimiterPlugin +#define LV2_CORE__LowpassPlugin LV2_CORE_PREFIX "LowpassPlugin" ///< http://lv2plug.in/ns/lv2core#LowpassPlugin +#define LV2_CORE__MixerPlugin LV2_CORE_PREFIX "MixerPlugin" ///< http://lv2plug.in/ns/lv2core#MixerPlugin +#define LV2_CORE__ModulatorPlugin LV2_CORE_PREFIX "ModulatorPlugin" ///< http://lv2plug.in/ns/lv2core#ModulatorPlugin +#define LV2_CORE__MultiEQPlugin LV2_CORE_PREFIX "MultiEQPlugin" ///< http://lv2plug.in/ns/lv2core#MultiEQPlugin +#define LV2_CORE__OscillatorPlugin LV2_CORE_PREFIX "OscillatorPlugin" ///< http://lv2plug.in/ns/lv2core#OscillatorPlugin +#define LV2_CORE__OutputPort LV2_CORE_PREFIX "OutputPort" ///< http://lv2plug.in/ns/lv2core#OutputPort +#define LV2_CORE__ParaEQPlugin LV2_CORE_PREFIX "ParaEQPlugin" ///< http://lv2plug.in/ns/lv2core#ParaEQPlugin +#define LV2_CORE__PhaserPlugin LV2_CORE_PREFIX "PhaserPlugin" ///< http://lv2plug.in/ns/lv2core#PhaserPlugin +#define LV2_CORE__PitchPlugin LV2_CORE_PREFIX "PitchPlugin" ///< http://lv2plug.in/ns/lv2core#PitchPlugin +#define LV2_CORE__Plugin LV2_CORE_PREFIX "Plugin" ///< http://lv2plug.in/ns/lv2core#Plugin +#define LV2_CORE__PluginBase LV2_CORE_PREFIX "PluginBase" ///< http://lv2plug.in/ns/lv2core#PluginBase +#define LV2_CORE__Point LV2_CORE_PREFIX "Point" ///< http://lv2plug.in/ns/lv2core#Point +#define LV2_CORE__Port LV2_CORE_PREFIX "Port" ///< http://lv2plug.in/ns/lv2core#Port +#define LV2_CORE__PortProperty LV2_CORE_PREFIX "PortProperty" ///< http://lv2plug.in/ns/lv2core#PortProperty +#define LV2_CORE__Resource LV2_CORE_PREFIX "Resource" ///< http://lv2plug.in/ns/lv2core#Resource +#define LV2_CORE__ReverbPlugin LV2_CORE_PREFIX "ReverbPlugin" ///< http://lv2plug.in/ns/lv2core#ReverbPlugin +#define LV2_CORE__ScalePoint LV2_CORE_PREFIX "ScalePoint" ///< http://lv2plug.in/ns/lv2core#ScalePoint +#define LV2_CORE__SimulatorPlugin LV2_CORE_PREFIX "SimulatorPlugin" ///< http://lv2plug.in/ns/lv2core#SimulatorPlugin +#define LV2_CORE__SpatialPlugin LV2_CORE_PREFIX "SpatialPlugin" ///< http://lv2plug.in/ns/lv2core#SpatialPlugin +#define LV2_CORE__Specification LV2_CORE_PREFIX "Specification" ///< http://lv2plug.in/ns/lv2core#Specification +#define LV2_CORE__SpectralPlugin LV2_CORE_PREFIX "SpectralPlugin" ///< http://lv2plug.in/ns/lv2core#SpectralPlugin +#define LV2_CORE__UtilityPlugin LV2_CORE_PREFIX "UtilityPlugin" ///< http://lv2plug.in/ns/lv2core#UtilityPlugin +#define LV2_CORE__WaveshaperPlugin LV2_CORE_PREFIX "WaveshaperPlugin" ///< http://lv2plug.in/ns/lv2core#WaveshaperPlugin +#define LV2_CORE__appliesTo LV2_CORE_PREFIX "appliesTo" ///< http://lv2plug.in/ns/lv2core#appliesTo +#define LV2_CORE__binary LV2_CORE_PREFIX "binary" ///< http://lv2plug.in/ns/lv2core#binary +#define LV2_CORE__connectionOptional LV2_CORE_PREFIX "connectionOptional" ///< http://lv2plug.in/ns/lv2core#connectionOptional +#define LV2_CORE__control LV2_CORE_PREFIX "control" ///< http://lv2plug.in/ns/lv2core#control +#define LV2_CORE__default LV2_CORE_PREFIX "default" ///< http://lv2plug.in/ns/lv2core#default +#define LV2_CORE__designation LV2_CORE_PREFIX "designation" ///< http://lv2plug.in/ns/lv2core#designation +#define LV2_CORE__documentation LV2_CORE_PREFIX "documentation" ///< http://lv2plug.in/ns/lv2core#documentation +#define LV2_CORE__enumeration LV2_CORE_PREFIX "enumeration" ///< http://lv2plug.in/ns/lv2core#enumeration +#define LV2_CORE__extensionData LV2_CORE_PREFIX "extensionData" ///< http://lv2plug.in/ns/lv2core#extensionData +#define LV2_CORE__freeWheeling LV2_CORE_PREFIX "freeWheeling" ///< http://lv2plug.in/ns/lv2core#freeWheeling +#define LV2_CORE__hardRTCapable LV2_CORE_PREFIX "hardRTCapable" ///< http://lv2plug.in/ns/lv2core#hardRTCapable +#define LV2_CORE__inPlaceBroken LV2_CORE_PREFIX "inPlaceBroken" ///< http://lv2plug.in/ns/lv2core#inPlaceBroken +#define LV2_CORE__index LV2_CORE_PREFIX "index" ///< http://lv2plug.in/ns/lv2core#index +#define LV2_CORE__integer LV2_CORE_PREFIX "integer" ///< http://lv2plug.in/ns/lv2core#integer +#define LV2_CORE__isLive LV2_CORE_PREFIX "isLive" ///< http://lv2plug.in/ns/lv2core#isLive +#define LV2_CORE__latency LV2_CORE_PREFIX "latency" ///< http://lv2plug.in/ns/lv2core#latency +#define LV2_CORE__maximum LV2_CORE_PREFIX "maximum" ///< http://lv2plug.in/ns/lv2core#maximum +#define LV2_CORE__microVersion LV2_CORE_PREFIX "microVersion" ///< http://lv2plug.in/ns/lv2core#microVersion +#define LV2_CORE__minimum LV2_CORE_PREFIX "minimum" ///< http://lv2plug.in/ns/lv2core#minimum +#define LV2_CORE__minorVersion LV2_CORE_PREFIX "minorVersion" ///< http://lv2plug.in/ns/lv2core#minorVersion +#define LV2_CORE__name LV2_CORE_PREFIX "name" ///< http://lv2plug.in/ns/lv2core#name +#define LV2_CORE__optionalFeature LV2_CORE_PREFIX "optionalFeature" ///< http://lv2plug.in/ns/lv2core#optionalFeature +#define LV2_CORE__port LV2_CORE_PREFIX "port" ///< http://lv2plug.in/ns/lv2core#port +#define LV2_CORE__portProperty LV2_CORE_PREFIX "portProperty" ///< http://lv2plug.in/ns/lv2core#portProperty +#define LV2_CORE__project LV2_CORE_PREFIX "project" ///< http://lv2plug.in/ns/lv2core#project +#define LV2_CORE__prototype LV2_CORE_PREFIX "prototype" ///< http://lv2plug.in/ns/lv2core#prototype +#define LV2_CORE__reportsLatency LV2_CORE_PREFIX "reportsLatency" ///< http://lv2plug.in/ns/lv2core#reportsLatency +#define LV2_CORE__requiredFeature LV2_CORE_PREFIX "requiredFeature" ///< http://lv2plug.in/ns/lv2core#requiredFeature +#define LV2_CORE__sampleRate LV2_CORE_PREFIX "sampleRate" ///< http://lv2plug.in/ns/lv2core#sampleRate +#define LV2_CORE__scalePoint LV2_CORE_PREFIX "scalePoint" ///< http://lv2plug.in/ns/lv2core#scalePoint +#define LV2_CORE__symbol LV2_CORE_PREFIX "symbol" ///< http://lv2plug.in/ns/lv2core#symbol +#define LV2_CORE__toggled LV2_CORE_PREFIX "toggled" ///< http://lv2plug.in/ns/lv2core#toggled + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Plugin Instance Handle. + + This is a handle for one particular instance of a plugin. It is valid to + compare to NULL (or 0 for C++) but otherwise the host MUST NOT attempt to + interpret it. +*/ +typedef void* LV2_Handle; + +/** + Feature. + + Features allow hosts to make additional functionality available to plugins + without requiring modification to the LV2 API. Extensions may define new + features and specify the `URI` and `data` to be used if necessary. + Some features, such as lv2:isLive, do not require the host to pass data. +*/ +typedef struct { + /** + A globally unique, case-sensitive identifier (URI) for this feature. + + This MUST be a valid URI string as defined by RFC 3986. + */ + const char* URI; + + /** + Pointer to arbitrary data. + + The format of this data is defined by the extension which describes the + feature with the given `URI`. + */ + void* data; +} LV2_Feature; + +/** + Plugin Descriptor. + + This structure provides the core functions necessary to instantiate and use + a plugin. +*/ +typedef struct LV2_Descriptor { + /** + A globally unique, case-sensitive identifier for this plugin. + + This MUST be a valid URI string as defined by RFC 3986. All plugins with + the same URI MUST be compatible to some degree, see + http://lv2plug.in/ns/lv2core for details. + */ + const char* URI; + + /** + Instantiate the plugin. + + Note that instance initialisation should generally occur in activate() + rather than here. If a host calls instantiate(), it MUST call cleanup() + at some point in the future. + + @param descriptor Descriptor of the plugin to instantiate. + + @param sample_rate Sample rate, in Hz, for the new plugin instance. + + @param bundle_path Path to the LV2 bundle which contains this plugin + binary. It MUST include the trailing directory separator so that simply + appending a filename will yield the path to that file in the bundle. + + @param features A NULL terminated array of LV2_Feature structs which + represent the features the host supports. Plugins may refuse to + instantiate if required features are not found here. However, hosts MUST + NOT use this as a discovery mechanism: instead, use the RDF data to + determine which features are required and do not attempt to instantiate + unsupported plugins at all. This parameter MUST NOT be NULL, i.e. a host + that supports no features MUST pass a single element array containing + NULL. + + @return A handle for the new plugin instance, or NULL if instantiation + has failed. + */ + LV2_Handle (*instantiate)(const struct LV2_Descriptor* descriptor, + double sample_rate, + const char* bundle_path, + const LV2_Feature* const* features); + + /** + Connect a port on a plugin instance to a memory location. + + Plugin writers should be aware that the host may elect to use the same + buffer for more than one port and even use the same buffer for both + input and output (see lv2:inPlaceBroken in lv2.ttl). + + If the plugin has the feature lv2:hardRTCapable then there are various + things that the plugin MUST NOT do within the connect_port() function; + see lv2core.ttl for details. + + connect_port() MUST be called at least once for each port before run() + is called, unless that port is lv2:connectionOptional. The plugin must + pay careful attention to the block size passed to run() since the block + allocated may only just be large enough to contain the data, and is not + guaranteed to remain constant between run() calls. + + connect_port() may be called more than once for a plugin instance to + allow the host to change the buffers that the plugin is reading or + writing. These calls may be made before or after activate() or + deactivate() calls. + + @param instance Plugin instance containing the port. + + @param port Index of the port to connect. The host MUST NOT try to + connect a port index that is not defined in the plugin's RDF data. If + it does, the plugin's behaviour is undefined (a crash is likely). + + @param data_location Pointer to data of the type defined by the port + type in the plugin's RDF data (for example, an array of float for an + lv2:AudioPort). This pointer must be stored by the plugin instance and + used to read/write data when run() is called. Data present at the time + of the connect_port() call MUST NOT be considered meaningful. + */ + void (*connect_port)(LV2_Handle instance, uint32_t port, void* data_location); + + /** + Initialise a plugin instance and activate it for use. + + This is separated from instantiate() to aid real-time support and so + that hosts can reinitialise a plugin instance by calling deactivate() + and then activate(). In this case the plugin instance MUST reset all + state information dependent on the history of the plugin instance except + for any data locations provided by connect_port(). If there is nothing + for activate() to do then this field may be NULL. + + When present, hosts MUST call this function once before run() is called + for the first time. This call SHOULD be made as close to the run() call + as possible and indicates to real-time plugins that they are now live, + however plugins MUST NOT rely on a prompt call to run() after + activate(). + + The host MUST NOT call activate() again until deactivate() has been + called first. If a host calls activate(), it MUST call deactivate() at + some point in the future. Note that connect_port() may be called before + or after activate(). + */ + void (*activate)(LV2_Handle instance); + + /** + Run a plugin instance for a block. + + Note that if an activate() function exists then it must be called before + run(). If deactivate() is called for a plugin instance then run() may + not be called until activate() has been called again. + + If the plugin has the feature lv2:hardRTCapable then there are various + things that the plugin MUST NOT do within the run() function (see + lv2core.ttl for details). + + As a special case, when `sample_count` is 0, the plugin should update + any output ports that represent a single instant in time (for example, + control ports, but not audio ports). This is particularly useful for + latent plugins, which should update their latency output port so hosts + can pre-roll plugins to compute latency. Plugins MUST NOT crash when + `sample_count` is 0. + + @param instance Instance to be run. + + @param sample_count The block size (in samples) for which the plugin + instance must run. + */ + void (*run)(LV2_Handle instance, uint32_t sample_count); + + /** + Deactivate a plugin instance (counterpart to activate()). + + Hosts MUST deactivate all activated instances after they have been run() + for the last time. This call SHOULD be made as close to the last run() + call as possible and indicates to real-time plugins that they are no + longer live, however plugins MUST NOT rely on prompt deactivation. If + there is nothing for deactivate() to do then this field may be NULL + + Deactivation is not similar to pausing since the plugin instance will be + reinitialised by activate(). However, deactivate() itself MUST NOT fully + reset plugin state. For example, the host may deactivate a plugin, then + store its state (using some extension to do so). + + Hosts MUST NOT call deactivate() unless activate() was previously + called. Note that connect_port() may be called before or after + deactivate(). + */ + void (*deactivate)(LV2_Handle instance); + + /** + Clean up a plugin instance (counterpart to instantiate()). + + Once an instance of a plugin has been finished with it must be deleted + using this function. The instance handle passed ceases to be valid after + this call. + + If activate() was called for a plugin instance then a corresponding call + to deactivate() MUST be made before cleanup() is called. Hosts MUST NOT + call cleanup() unless instantiate() was previously called. + */ + void (*cleanup)(LV2_Handle instance); + + /** + Return additional plugin data defined by some extenion. + + A typical use of this facility is to return a struct containing function + pointers to extend the LV2_Descriptor API. + + The actual type and meaning of the returned object MUST be specified + precisely by the extension. This function MUST return NULL for any + unsupported URI. If a plugin does not support any extension data, this + field may be NULL. + + The host is never responsible for freeing the returned value. + */ + const void* (*extension_data)(const char* uri); +} LV2_Descriptor; + +/** + Helper macro needed for LV2_SYMBOL_EXPORT when using C++. +*/ +#ifdef __cplusplus +# define LV2_SYMBOL_EXTERN extern "C" +#else +# define LV2_SYMBOL_EXTERN +#endif + +/** + Put this (LV2_SYMBOL_EXPORT) before any functions that are to be loaded + by the host as a symbol from the dynamic library. +*/ +#ifdef _WIN32 +# define LV2_SYMBOL_EXPORT LV2_SYMBOL_EXTERN __declspec(dllexport) +#else +# define LV2_SYMBOL_EXPORT \ + LV2_SYMBOL_EXTERN __attribute__((visibility("default"))) +#endif + +/** + Prototype for plugin accessor function. + + Plugins are discovered by hosts using RDF data (not by loading libraries). + See http://lv2plug.in for details on the discovery process, though most + hosts should use an existing library to implement this functionality. + + This is the simple plugin discovery API, suitable for most statically + defined plugins. Advanced plugins that need access to their bundle during + discovery can use lv2_lib_descriptor() instead. Plugin libraries MUST + include a function called "lv2_descriptor" or "lv2_lib_descriptor" with + C-style linkage, but SHOULD provide "lv2_descriptor" wherever possible. + + When it is time to load a plugin (designated by its URI), the host loads the + plugin's library, gets the lv2_descriptor() function from it, and uses this + function to find the LV2_Descriptor for the desired plugin. Plugins are + accessed by index using values from 0 upwards. This function MUST return + NULL for out of range indices, so the host can enumerate plugins by + increasing `index` until NULL is returned. + + Note that `index` has no meaning, hosts MUST NOT depend on it remaining + consistent between loads of the plugin library. +*/ +LV2_SYMBOL_EXPORT +const LV2_Descriptor* +lv2_descriptor(uint32_t index); + +/** + Type of the lv2_descriptor() function in a library (old discovery API). +*/ +typedef const LV2_Descriptor* (*LV2_Descriptor_Function)(uint32_t index); + +/** + Handle for a library descriptor. +*/ +typedef void* LV2_Lib_Handle; + +/** + Descriptor for a plugin library. + + To access a plugin library, the host creates an LV2_Lib_Descriptor via the + lv2_lib_descriptor() function in the shared object. +*/ +typedef struct { + /** + Opaque library data which must be passed as the first parameter to all + the methods of this struct. + */ + LV2_Lib_Handle handle; + + /** + The total size of this struct. This allows for this struct to be + expanded in the future if necessary. This MUST be set by the library to + sizeof(LV2_Lib_Descriptor). The host MUST NOT access any fields of this + struct beyond get_plugin() unless this field indicates they are present. + */ + uint32_t size; + + /** + Destroy this library descriptor and free all related resources. + */ + void (*cleanup)(LV2_Lib_Handle handle); + + /** + Plugin accessor. + + Plugins are accessed by index using values from 0 upwards. Out of range + indices MUST result in this function returning NULL, so the host can + enumerate plugins by increasing `index` until NULL is returned. + */ + const LV2_Descriptor* (*get_plugin)(LV2_Lib_Handle handle, uint32_t index); +} LV2_Lib_Descriptor; + +/** + Prototype for library accessor function. + + This is the more advanced discovery API, which allows plugin libraries to + access their bundles during discovery, which makes it possible for plugins to + be dynamically defined by files in their bundle. This API also has an + explicit cleanup function, removing any need for non-portable shared library + destructors. Simple plugins that do not require these features may use + lv2_descriptor() instead. + + This is the entry point for a plugin library. Hosts load this symbol from + the library and call this function to obtain a library descriptor which can + be used to access all the contained plugins. The returned object must not + be destroyed (using LV2_Lib_Descriptor::cleanup()) until all plugins loaded + from that library have been destroyed. +*/ +LV2_SYMBOL_EXPORT +const LV2_Lib_Descriptor* +lv2_lib_descriptor(const char* bundle_path, const LV2_Feature* const* features); + +/** + Type of the lv2_lib_descriptor() function in an LV2 library. +*/ +typedef const LV2_Lib_Descriptor* (*LV2_Lib_Descriptor_Function)( + const char* bundle_path, + const LV2_Feature* const* features); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} + @} +*/ + +#endif /* LV2_H_INCLUDED */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,103 @@ +/* + Copyright 2016 David Robillard + + 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. +*/ + +/** + @defgroup util Utilities + @ingroup lv2core + @{ +*/ + +#include "lv2/core/lv2.h" + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Return the data for a feature in a features array. + + If the feature is not found, NULL is returned. Note that this function is + only useful for features with data, and can not detect features that are + present but have NULL data. +*/ +static inline void* +lv2_features_data(const LV2_Feature* const* features, const char* const uri) +{ + if (features) { + for (const LV2_Feature* const* f = features; *f; ++f) { + if (!strcmp(uri, (*f)->URI)) { + return (*f)->data; + } + } + } + return NULL; +} + +/** + Query a features array. + + This function allows getting several features in one call, and detect + missing required features, with the same caveat of lv2_features_data(). + + The arguments should be a series of const char* uri, void** data, bool + required, terminated by a NULL URI. The data pointers MUST be initialized + to NULL. For example: + + @code + LV2_URID_Log* log = NULL; + LV2_URID_Map* map = NULL; + const char* missing = lv2_features_query( + features, + LV2_LOG__log, &log, false, + LV2_URID__map, &map, true, + NULL); + @endcode + + @return NULL on success, otherwise the URI of this missing feature. +*/ +static inline const char* +lv2_features_query(const LV2_Feature* const* features, ...) +{ + va_list args; + va_start(args, features); + + const char* uri = NULL; + while ((uri = va_arg(args, const char*))) { + void** data = va_arg(args, void**); + bool required = va_arg(args, int); + + *data = lv2_features_data(features, uri); + if (required && !*data) { + va_end(args); + return uri; + } + } + + va_end(args); + return NULL; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,15 @@ +@prefix doap: . +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 18 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + + + a doap:Project ; + rdfs:seeAlso , + . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,199 @@ +@prefix dcs: . +@prefix doap: . +@prefix lv2: . +@prefix meta: . +@prefix rdf: . +@prefix rdfs: . + + + rdf:value """ +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. +""" . + + + a doap:Project ; + lv2:symbol "lv2" ; + rdfs:label "LV2" ; + rdfs:comment "The LV2 Plugin Interface Project." ; + doap:name "LV2" ; + doap:license ; + doap:shortdesc "The LV2 Plugin Interface Project." ; + doap:description "LV2 is a plugin standard for audio systems. It defines a minimal yet extensible C API for plugin code and a format for plugin bundles" ; + doap:created "2006-05-10" ; + doap:homepage ; + doap:mailing-list ; + doap:programming-language "C" ; + doap:repository [ + a doap:SVNRepository ; + doap:location + ] ; + doap:developer , + ; + doap:helper meta:larsl , + meta:bmwiedemann , + meta:gabrbedd , + meta:daste , + meta:kfoltman , + meta:paniq ; + doap:release [ + doap:revision "1.18.2" ; + doap:created "2021-01-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "eg-sampler: Save and restore gain parameter value." + ] , [ + rdfs:label "Various code cleanups and infrastructure improvements." + ] + ] + ] , [ + doap:revision "1.18.0" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] , [ + rdfs:label "Separate extended documentation from primary data." + ] + ] + ] , [ + doap:revision "1.16.0" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add core/attributes.h utility header." + ] , [ + rdfs:label "eg-sampler: Add waveform display to UI." + ] , [ + rdfs:label "eg-midigate: Respond to \"all notes off\" MIDI message." + ] , [ + rdfs:label "Simplify use of lv2specgen." + ] , [ + rdfs:label "Add lv2_validate utility." + ] , [ + rdfs:label "Install headers to simpler paths." + ] , [ + rdfs:label "Aggressively deprecate uri-map and event extensions." + ] , [ + rdfs:label "Upgrade build system and fix building with Python 3.7." + ] + ] + ] , [ + doap:revision "1.14.0" ; + doap:created "2016-09-19" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label """eg-scope: Don't feed back UI state updates.""" + ] , [ + rdfs:label "eg-sampler: Fix handling of state file paths." + ] , [ + rdfs:label "eg-sampler: Support thread-safe state restoration." + ] + ] + ] , [ + doap:revision "1.12.0" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "eg-sampler: Support patch:Get, and request initial state from UI." + ] , [ + rdfs:label "eg-sampler: Add gain parameter." + ] , [ + rdfs:label "Fix merging of version histories in specification documentation." + ] , [ + rdfs:label "Improve API documentation." + ] , [ + rdfs:label "Simplify property restrictions by removing redundancy." + ] + ] + ] , [ + doap:revision "1.10.0" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "lv2specgen: Display deprecated warning on classes marked owl:deprecated." + ] , [ + rdfs:label "Fix -Wconversion warnings in headers." + ] , [ + rdfs:label "Upgrade to waf 1.7.16." + ] + ] + ] , [ + doap:revision "1.8.0" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add scope example plugin from Robin Gareus." + ] , [ + rdfs:label "lv2specgen: Fix links to externally defined terms." + ] , [ + rdfs:label "Install lv2specgen for use by other projects." + ] + ] + ] , [ + doap:revision "1.6.0" ; + doap:created "2013-08-09" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix port indices of metronome example." + ] , [ + rdfs:label "Fix lv2specgen usage from command line." + ] , [ + rdfs:label "Upgrade to waf 1.7.11." + ] + ] + ] , [ + doap:revision "1.4.0" ; + doap:created "2013-02-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add metronome example plugin to demonstrate sample accurate tempo sync." + ] , [ + rdfs:label "Generate book-style HTML documentation from example plugins." + ] + ] + ] , [ + doap:revision "1.2.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Move all project metadata for extensions (e.g. change log) to separate files to spare hosts from loading them during discovery." + ] , [ + rdfs:label "Use stricter datatype definitions conformant with the XSD and OWL specifications for better validation." + ] + ] + ] , [ + doap:revision "1.0.0" ; + doap:created "2012-04-16" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label """Initial release as a unified project. Projects can now simply depend on the pkg-config package 'lv2' for all official LV2 APIs.""" + ] , [ + rdfs:label "New extensions: atom, log, parameters, patch, port-groups, port-props, resize-port, state, time, worker." + ] + ] + ] . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/people.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/people.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/people.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/people.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,51 @@ +@prefix foaf: . +@prefix meta: . +@prefix rdfs: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:mbox ; + rdfs:seeAlso . + + + a foaf:Person ; + foaf:name "Steve Harris" ; + foaf:mbox ; + rdfs:seeAlso . + +meta:larsl + a foaf:Person ; + foaf:name "Lars Luthman" ; + foaf:mbox . + +meta:gabrbedd + a foaf:Person ; + foaf:name "Gabriel M. Beddingfield" ; + foaf:mbox . + +meta:daste + a foaf:Person ; + foaf:name """Stefano D'Angelo""" ; + foaf:mbox . + +meta:kfoltman + a foaf:Person ; + foaf:name "Krzysztof Foltman" ; + foaf:mbox . + +meta:paniq + a foaf:Person ; + foaf:name "Leonard Ritter" ; + foaf:mbox . + +meta:harry + a foaf:Person ; + foaf:name "Harry van Haaren" ; + foaf:mbox . + +meta:bmwiedemann + a foaf:Person ; + foaf:name "Bernhard M. Wiedemann" ; + foaf:mbox . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,73 @@ +/* + Copyright 2008-2016 David Robillard + + 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. +*/ + +#ifndef LV2_DATA_ACCESS_H +#define LV2_DATA_ACCESS_H + +/** + @defgroup data-access Data Access + @ingroup lv2 + + Access to plugin extension_data() for UIs. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_DATA_ACCESS_URI "http://lv2plug.in/ns/ext/data-access" ///< http://lv2plug.in/ns/ext/data-access +#define LV2_DATA_ACCESS_PREFIX LV2_DATA_ACCESS_URI "#" ///< http://lv2plug.in/ns/ext/data-access# + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +/** + The data field of the LV2_Feature for this extension. + + To support this feature the host must pass an LV2_Feature struct to the + instantiate method with URI "http://lv2plug.in/ns/ext/data-access" + and data pointed to an instance of this struct. +*/ +typedef struct { + /** + A pointer to a method the UI can call to get data (of a type specified + by some other extension) from the plugin. + + This call never is never guaranteed to return anything, UIs should + degrade gracefully if direct access to the plugin data is not possible + (in which case this function will return NULL). + + This is for access to large data that can only possibly work if the UI + and plugin are running in the same process. For all other things, use + the normal LV2 UI communication system. + */ + const void* (*data_access)(const char* uri); +} LV2_Extension_Data_Feature; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_DATA_ACCESS_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,77 @@ +@prefix da: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + rdfs:seeAlso ; + doap:license ; + doap:name "LV2 Data Access" ; + doap:shortdesc "Provides access to plugin extension data." ; + doap:created "2008-00-00" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature, LV2_Extension_Data_Feature, which provides +access to LV2_Descriptor::extension_data() for plugin UIs or other potentially +remote users of a plugin. + +Note that the use of this extension by UIs violates the important principle of +UI/plugin separation, and is potentially a source of many problems. +Accordingly, **use of this extension is highly discouraged**, and plugins +should not expect hosts to support it, since it is often impossible to do so. + +To support this feature the host must pass an LV2_Feature struct to +LV2_Descriptor::extension_data() with URI LV2_DATA_ACCESS_URI and data pointed +to an instance of LV2_Extension_Data_Feature. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,11 @@ +@prefix da: . +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Feature ; + rdfs:label "data access" ; + rdfs:comment "A feature that provides access to plugin extension data." ; + rdfs:seeAlso , + . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,160 @@ +/* + Dynamic manifest specification for LV2 + Copyright 2008-2011 Stefano D'Angelo + + 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. +*/ + +#ifndef LV2_DYN_MANIFEST_H_INCLUDED +#define LV2_DYN_MANIFEST_H_INCLUDED + +/** + @defgroup dynmanifest Dynamic Manifest + @ingroup lv2 + + Support for dynamic data generation. + + See for details. + + @{ +*/ + +#include "lv2/core/lv2.h" + +#include + +// clang-format off + +#define LV2_DYN_MANIFEST_URI "http://lv2plug.in/ns/ext/dynmanifest" ///< http://lv2plug.in/ns/ext/dynmanifest +#define LV2_DYN_MANIFEST_PREFIX LV2_DYN_MANIFEST_URI "#" ///< http://lv2plug.in/ns/ext/dynmanifest# + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Dynamic manifest generator handle. + + This handle indicates a particular status of a dynamic manifest generator. + The host MUST NOT attempt to interpret it and, unlikely LV2_Handle, it is + NOT even valid to compare this to NULL. The dynamic manifest generator MAY + use it to reference internal data. +*/ +typedef void* LV2_Dyn_Manifest_Handle; + +/** + Generate the dynamic manifest. + + @param handle Pointer to an uninitialized dynamic manifest generator handle. + + @param features NULL terminated array of LV2_Feature structs which represent + the features the host supports. The dynamic manifest generator may refuse to + (re)generate the dynamic manifest if required features are not found here + (however hosts SHOULD NOT use this as a discovery mechanism, instead of + reading the static manifest file). This array must always exist; if a host + has no features, it MUST pass a single element array containing NULL. + + @return 0 on success, otherwise a non-zero error code. The host SHOULD + evaluate the result of the operation by examining the returned value and + MUST NOT try to interpret the value of handle. +*/ +int +lv2_dyn_manifest_open(LV2_Dyn_Manifest_Handle* handle, + const LV2_Feature* const* features); + +/** + Fetch a "list" of subject URIs described in the dynamic manifest. + + The dynamic manifest generator has to fill the resource only with the needed + triples to make the host aware of the "objects" it wants to expose. For + example, if the plugin library exposes a regular LV2 plugin, it should + output only a triple like the following: + + a lv2:Plugin . + + The objects that are elegible for exposure are those that would need to be + represented by a subject node in a static manifest. + + @param handle Dynamic manifest generator handle. + + @param fp FILE * identifying the resource the host has to set up for the + dynamic manifest generator. The host MUST pass a writable, empty resource to + this function, and the dynamic manifest generator MUST ONLY perform write + operations on it at the end of the stream (for example, using only + fprintf(), fwrite() and similar). + + @return 0 on success, otherwise a non-zero error code. +*/ +int +lv2_dyn_manifest_get_subjects(LV2_Dyn_Manifest_Handle handle, FILE* fp); + +/** + Function that fetches data related to a specific URI. + + The dynamic manifest generator has to fill the resource with data related to + object represented by the given URI. For example, if the library exposes a + regular LV2 plugin whose URI, as retrieved by the host using + lv2_dyn_manifest_get_subjects() is http://example.org/plugin then it + should output something like: + +
+   
+       a lv2:Plugin ;
+       doap:name "My Plugin" ;
+       lv2:binary  ;
+       etc:etc "..." .
+   
+ + @param handle Dynamic manifest generator handle. + + @param fp FILE * identifying the resource the host has to set up for the + dynamic manifest generator. The host MUST pass a writable resource to this + function, and the dynamic manifest generator MUST ONLY perform write + operations on it at the current position of the stream (for example, using + only fprintf(), fwrite() and similar). + + @param uri URI to get data about (in the "plain" form, i.e., absolute URI + without Turtle prefixes). + + @return 0 on success, otherwise a non-zero error code. +*/ +int +lv2_dyn_manifest_get_data(LV2_Dyn_Manifest_Handle handle, + FILE* fp, + const char* uri); + +/** + Function that ends the operations on the dynamic manifest generator. + + This function SHOULD be used by the dynamic manifest generator to perform + cleanup operations, etc. + + Once this function is called, referring to handle will cause undefined + behavior. + + @param handle Dynamic manifest generator handle. +*/ +void +lv2_dyn_manifest_close(LV2_Dyn_Manifest_Handle handle); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_DYN_MANIFEST_H_INCLUDED */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,131 @@ +@prefix dcs: . +@prefix dman: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Dynamic Manifest" ; + doap:homepage ; + doap:created "2009-06-13" ; + doap:shortdesc "Support for dynamic manifest data generation." ; + doap:programming-language "C" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-04-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +The LV2 API, on its own, cannot be used to write plugin libraries where data is +dynamically generated at runtime, since LV2 requires needed information to be +provided in one or more static data (RDF) files. This API addresses this +limitation by extending the LV2 API. + +To detect that a plugin library implements a dynamic manifest generator, the +host checks its static manifest for a description like: + + :::turtle + + a dman:DynManifest ; + lv2:binary . + +To load the data, the host loads the library (`mydynmanifest.so` in this +example) as usual and fetches the dynamic Turtle data from it using this API. + +The host is allowed to request regeneration of the dynamic manifest multiple +times, and the plugin library is expected to provide updated data if/when +possible. All data and references provided via this API before the last +regeneration of the dynamic manifest is to be considered invalid by the host, +including plugin descriptors whose URIs were discovered using this API. + +### Accessing Data + +To access data using this API, the host must: + + 1. Call lv2_dyn_manifest_open(). + + 2. Create a `FILE` for functions to write data to (for example with `tmpfile()`). + + 3. Get a list of exposed subject URIs using lv2_dyn_manifest_get_subjects(). + + 4. Call lv2_dyn_manifest_get_data() for each URI of interest to write the + related data to the file. + + 5. Call lv2_dyn_manifest_close(). + + 6. Parse the content of the file(s). + + 7. Remove the file(s). + +Each call to the above mentioned dynamic manifest functions MUST write a +complete, valid Turtle document (including all needed prefix definitions) to +the output FILE. + +Each call to lv2_dyn_manifest_open() causes the (re)generation of the dynamic +manifest data, and invalidates all data fetched before the call. + +In case the plugin library uses this same API to access other dynamic +manifests, it MUST implement some mechanism to avoid potentially endless loops +(such as A loads B, B loads A, etc.) and, in case such a loop is detected, the +operation MUST fail. For this purpose, use of a static boolean flag is +suggested. + +### Threading Rules + +All of the functions defined by this specification belong to the Discovery +class. + + +"""^^lv2:Markdown . + +dman:DynManifest + lv2:documentation """ + +There MUST NOT be any instances of dman:DynManifest in the generated manifest. + +All relative URIs in the generated data MUST be relative to the base path that +would be used to parse a normal LV2 manifest (the bundle path). + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,25 @@ +@prefix dman: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Dyn Manifest" ; + rdfs:comment "Support for dynamic manifest data generation." ; + rdfs:seeAlso , + . + +dman:DynManifest + a rdfs:Class ; + rdfs:label "Dynamic Manifest" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:binary ; + owl:minCardinality 1 ; + rdfs:comment "A DynManifest MUST have at least one lv2:binary." + ] ; + rdfs:comment "Dynamic manifest for an LV2 binary." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,306 @@ +/* + Copyright 2008-2016 David Robillard + Copyright 2006-2007 Lars Luthman + + 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. +*/ + +#ifndef LV2_EVENT_H +#define LV2_EVENT_H + +/** + @defgroup event Event + @ingroup lv2 + + Generic time-stamped events. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_EVENT_URI "http://lv2plug.in/ns/ext/event" ///< http://lv2plug.in/ns/ext/event +#define LV2_EVENT_PREFIX LV2_EVENT_URI "#" ///< http://lv2plug.in/ns/ext/event# + +#define LV2_EVENT__Event LV2_EVENT_PREFIX "Event" ///< http://lv2plug.in/ns/ext/event#Event +#define LV2_EVENT__EventPort LV2_EVENT_PREFIX "EventPort" ///< http://lv2plug.in/ns/ext/event#EventPort +#define LV2_EVENT__FrameStamp LV2_EVENT_PREFIX "FrameStamp" ///< http://lv2plug.in/ns/ext/event#FrameStamp +#define LV2_EVENT__TimeStamp LV2_EVENT_PREFIX "TimeStamp" ///< http://lv2plug.in/ns/ext/event#TimeStamp +#define LV2_EVENT__generatesTimeStamp LV2_EVENT_PREFIX "generatesTimeStamp" ///< http://lv2plug.in/ns/ext/event#generatesTimeStamp +#define LV2_EVENT__generic LV2_EVENT_PREFIX "generic" ///< http://lv2plug.in/ns/ext/event#generic +#define LV2_EVENT__inheritsEvent LV2_EVENT_PREFIX "inheritsEvent" ///< http://lv2plug.in/ns/ext/event#inheritsEvent +#define LV2_EVENT__inheritsTimeStamp LV2_EVENT_PREFIX "inheritsTimeStamp" ///< http://lv2plug.in/ns/ext/event#inheritsTimeStamp +#define LV2_EVENT__supportsEvent LV2_EVENT_PREFIX "supportsEvent" ///< http://lv2plug.in/ns/ext/event#supportsEvent +#define LV2_EVENT__supportsTimeStamp LV2_EVENT_PREFIX "supportsTimeStamp" ///< http://lv2plug.in/ns/ext/event#supportsTimeStamp + +// clang-format on + +#define LV2_EVENT_AUDIO_STAMP 0 ///< Special timestamp type for audio frames + +#include "lv2/core/attributes.h" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +LV2_DISABLE_DEPRECATION_WARNINGS + +/** + The best Pulses Per Quarter Note for tempo-based uint32_t timestamps. + Equal to 2^12 * 5 * 7 * 9 * 11 * 13 * 17, which is evenly divisble + by all integers from 1 through 18 inclusive, and powers of 2 up to 2^12. +*/ +LV2_DEPRECATED +static const uint32_t LV2_EVENT_PPQN = 3136573440U; + +/** + An LV2 event (header only). + + LV2 events are generic time-stamped containers for any type of event. + The type field defines the format of a given event's contents. + + This struct defines the header of an LV2 event. An LV2 event is a single + chunk of POD (plain old data), usually contained in a flat buffer (see + LV2_EventBuffer below). Unless a required feature says otherwise, hosts may + assume a deep copy of an LV2 event can be created safely using a simple: + + memcpy(ev_copy, ev, sizeof(LV2_Event) + ev->size); (or equivalent) +*/ +LV2_DEPRECATED +typedef struct { + /** + The frames portion of timestamp. The units used here can optionally be + set for a port (with the lv2ev:timeUnits property), otherwise this is + audio frames, corresponding to the sample_count parameter of the LV2 run + method (frame 0 is the first frame for that call to run). + */ + uint32_t frames; + + /** + The sub-frames portion of timestamp. The units used here can optionally + be set for a port (with the lv2ev:timeUnits property), otherwise this is + 1/(2^32) of an audio frame. + */ + uint32_t subframes; + + /** + The type of this event, as a number which represents some URI + defining an event type. This value MUST be some value previously + returned from a call to the uri_to_id function defined in the LV2 + URI map extension (see lv2_uri_map.h). + There are special rules which must be followed depending on the type + of an event. If the plugin recognizes an event type, the definition + of that event type will describe how to interpret the event, and + any required behaviour. Otherwise, if the type is 0, this event is a + non-POD event and lv2_event_unref MUST be called if the event is + 'dropped' (see above). Even if the plugin does not understand an event, + it may pass the event through to an output by simply copying (and NOT + calling lv2_event_unref). These rules are designed to allow for generic + event handling plugins and large non-POD events, but with minimal hassle + on simple plugins that "don't care" about these more advanced features. + */ + uint16_t type; + + /** + The size of the data portion of this event in bytes, which immediately + follows. The header size (12 bytes) is not included in this value. + */ + uint16_t size; + + /* size bytes of data follow here */ +} LV2_Event; + +/** + A buffer of LV2 events (header only). + + Like events (which this contains) an event buffer is a single chunk of POD: + the entire buffer (including contents) can be copied with a single memcpy. + The first contained event begins sizeof(LV2_EventBuffer) bytes after the + start of this struct. + + After this header, the buffer contains an event header (defined by struct + LV2_Event), followed by that event's contents (padded to 64 bits), followed + by another header, etc: + + | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | + |FRAMES |SUBFRMS|TYP|LEN|DATA..DATA..PAD|FRAMES | ... +*/ +LV2_DEPRECATED +typedef struct { + /** + The contents of the event buffer. This may or may not reside in the + same block of memory as this header, plugins must not assume either. + The host guarantees this points to at least capacity bytes of allocated + memory (though only size bytes of that are valid events). + */ + uint8_t* data; + + /** + The size of this event header in bytes (including everything). + + This is to allow for extending this header in the future without + breaking binary compatibility. Whenever this header is copied, + it MUST be done using this field (and NOT the sizeof this struct). + */ + uint16_t header_size; + + /** + The type of the time stamps for events in this buffer. + As a special exception, '0' always means audio frames and subframes + (1/UINT32_MAX'th of a frame) in the sample rate passed to instantiate. + + INPUTS: The host must set this field to the numeric ID of some URI + defining the meaning of the frames/subframes fields of contained events + (obtained by the LV2 URI Map uri_to_id function with the URI of this + extension as the 'map' argument, see lv2_uri_map.h). The host must + never pass a plugin a buffer which uses a stamp type the plugin does not + 'understand'. The value of this field must never change, except when + connect_port is called on the input port, at which time the host MUST + have set the stamp_type field to the value that will be used for all + subsequent run calls. + + OUTPUTS: The plugin may set this to any value that has been returned + from uri_to_id with the URI of this extension for a 'map' argument. + When connected to a buffer with connect_port, output ports MUST set this + field to the type of time stamp they will be writing. On any call to + connect_port on an event input port, the plugin may change this field on + any output port, it is the responsibility of the host to check if any of + these values have changed and act accordingly. + */ + uint16_t stamp_type; + + /** + The number of events in this buffer. + + INPUTS: The host must set this field to the number of events contained + in the data buffer before calling run(). The plugin must not change + this field. + + OUTPUTS: The plugin must set this field to the number of events it has + written to the buffer before returning from run(). Any initial value + should be ignored by the plugin. + */ + uint32_t event_count; + + /** + The size of the data buffer in bytes. + This is set by the host and must not be changed by the plugin. + The host is allowed to change this between run() calls. + */ + uint32_t capacity; + + /** + The size of the initial portion of the data buffer containing data. + + INPUTS: The host must set this field to the number of bytes used + by all events it has written to the buffer (including headers) + before calling the plugin's run(). + The plugin must not change this field. + + OUTPUTS: The plugin must set this field to the number of bytes + used by all events it has written to the buffer (including headers) + before returning from run(). + Any initial value should be ignored by the plugin. + */ + uint32_t size; +} LV2_Event_Buffer; + +/** + Opaque pointer to host data. +*/ +LV2_DEPRECATED +typedef void* LV2_Event_Callback_Data; + +/** + Non-POD events feature. + + To support this feature the host must pass an LV2_Feature struct to the + plugin's instantiate method with URI "http://lv2plug.in/ns/ext/event" + and data pointed to an instance of this struct. Note this feature + is not mandatory to support the event extension. +*/ +LV2_DEPRECATED +typedef struct { + /** + Opaque pointer to host data. + + The plugin MUST pass this to any call to functions in this struct. + Otherwise, it must not be interpreted in any way. + */ + LV2_Event_Callback_Data callback_data; + + /** + Take a reference to a non-POD event. + + If a plugin receives an event with type 0, it means the event is a + pointer to some object in memory and not a flat sequence of bytes + in the buffer. When receiving a non-POD event, the plugin already + has an implicit reference to the event. If the event is stored AND + passed to an output, lv2_event_ref MUST be called on that event. + If the event is only stored OR passed through, this is not necessary + (as the plugin already has 1 implicit reference). + + @param event An event received at an input that will not be copied to + an output or stored in any way. + + @param context The calling context. Like event types, this is a mapped + URI, see lv2_context.h. Simple plugin with just a run() method should + pass 0 here (the ID of the 'standard' LV2 run context). The host + guarantees that this function is realtime safe iff the context is + realtime safe. + + PLUGINS THAT VIOLATE THESE RULES MAY CAUSE CRASHES AND MEMORY LEAKS. + */ + uint32_t (*lv2_event_ref)(LV2_Event_Callback_Data callback_data, + LV2_Event* event); + + /** + Drop a reference to a non-POD event. + + If a plugin receives an event with type 0, it means the event is a + pointer to some object in memory and not a flat sequence of bytes + in the buffer. If the plugin does not pass the event through to + an output or store it internally somehow, it MUST call this function + on the event (more information on using non-POD events below). + + @param event An event received at an input that will not be copied to an + output or stored in any way. + + @param context The calling context. Like event types, this is a mapped + URI, see lv2_context.h. Simple plugin with just a run() method should + pass 0 here (the ID of the 'standard' LV2 run context). The host + guarantees that this function is realtime safe iff the context is + realtime safe. + + PLUGINS THAT VIOLATE THESE RULES MAY CAUSE CRASHES AND MEMORY LEAKS. + */ + uint32_t (*lv2_event_unref)(LV2_Event_Callback_Data callback_data, + LV2_Event* event); +} LV2_Event_Feature; + +LV2_RESTORE_WARNINGS + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_EVENT_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,255 @@ +/* + Copyright 2008-2015 David Robillard + + 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. +*/ + +#ifndef LV2_EVENT_HELPERS_H +#define LV2_EVENT_HELPERS_H + +/** + @file event-helpers.h Helper functions for the LV2 Event extension + . +*/ + +#include "lv2/core/attributes.h" +#include "lv2/event/event.h" + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +LV2_DISABLE_DEPRECATION_WARNINGS + +/** @file + * Helper functions for the LV2 Event extension + * . + * + * These functions are provided for convenience only, use of them is not + * required for supporting lv2ev (i.e. the events extension is defined by the + * raw buffer format described in lv2_event.h and NOT by this API). + * + * Note that these functions are all static inline which basically means: + * do not take the address of these functions. */ + +/** Pad a size to 64 bits (for event sizes) */ +static inline uint16_t +lv2_event_pad_size(uint16_t size) +{ + return (uint16_t)(size + 7U) & (uint16_t)(~7U); +} + +/** Initialize (empty, reset..) an existing event buffer. + * The contents of buf are ignored entirely and overwritten, except capacity + * which is unmodified. */ +static inline void +lv2_event_buffer_reset(LV2_Event_Buffer* buf, + uint16_t stamp_type, + uint8_t* data) +{ + buf->data = data; + buf->header_size = sizeof(LV2_Event_Buffer); + buf->stamp_type = stamp_type; + buf->event_count = 0; + buf->size = 0; +} + +/** Allocate a new, empty event buffer. */ +static inline LV2_Event_Buffer* +lv2_event_buffer_new(uint32_t capacity, uint16_t stamp_type) +{ + const size_t size = sizeof(LV2_Event_Buffer) + capacity; + LV2_Event_Buffer* buf = (LV2_Event_Buffer*)malloc(size); + if (buf != NULL) { + buf->capacity = capacity; + lv2_event_buffer_reset(buf, stamp_type, (uint8_t*)(buf + 1)); + return buf; + } + return NULL; +} + +/** An iterator over an LV2_Event_Buffer. + * + * Multiple simultaneous read iterators over a single buffer is fine, + * but changing the buffer invalidates all iterators. */ +typedef struct { + LV2_Event_Buffer* buf; + uint32_t offset; +} LV2_Event_Iterator; + +/** Reset an iterator to point to the start of `buf`. + * @return True if `iter` is valid, otherwise false (buffer is empty) */ +static inline bool +lv2_event_begin(LV2_Event_Iterator* iter, LV2_Event_Buffer* buf) +{ + iter->buf = buf; + iter->offset = 0; + return (buf->size > 0); +} + +/** Check if `iter` is valid. + * @return True if `iter` is valid, otherwise false (past end of buffer) */ +static inline bool +lv2_event_is_valid(LV2_Event_Iterator* iter) +{ + return (iter->buf && (iter->offset < iter->buf->size)); +} + +/** Advance `iter` forward one event. + * `iter` must be valid. + * @return True if `iter` is valid, otherwise false (reached end of buffer) */ +static inline bool +lv2_event_increment(LV2_Event_Iterator* iter) +{ + if (!lv2_event_is_valid(iter)) { + return false; + } + + LV2_Event* const ev = (LV2_Event*)(iter->buf->data + iter->offset); + + iter->offset += + lv2_event_pad_size((uint16_t)((uint16_t)sizeof(LV2_Event) + ev->size)); + + return true; +} + +/** Dereference an event iterator (get the event currently pointed at). + * `iter` must be valid. + * `data` if non-NULL, will be set to point to the contents of the event + * returned. + * @return A Pointer to the event `iter` is currently pointing at, or NULL + * if the end of the buffer is reached (in which case `data` is + * also set to NULL). */ +static inline LV2_Event* +lv2_event_get(LV2_Event_Iterator* iter, uint8_t** data) +{ + if (!lv2_event_is_valid(iter)) { + return NULL; + } + + LV2_Event* const ev = (LV2_Event*)(iter->buf->data + iter->offset); + + if (data) { + *data = (uint8_t*)ev + sizeof(LV2_Event); + } + + return ev; +} + +/** Write an event at `iter`. + * The event (if any) pointed to by `iter` will be overwritten, and `iter` + * incremented to point to the following event (i.e. several calls to this + * function can be done in sequence without twiddling iter in-between). + * @return True if event was written, otherwise false (buffer is full). */ +static inline bool +lv2_event_write(LV2_Event_Iterator* iter, + uint32_t frames, + uint32_t subframes, + uint16_t type, + uint16_t size, + const uint8_t* data) +{ + if (!iter->buf) { + return false; + } + + if (iter->buf->capacity - iter->buf->size < sizeof(LV2_Event) + size) { + return false; + } + + LV2_Event* const ev = (LV2_Event*)(iter->buf->data + iter->offset); + + ev->frames = frames; + ev->subframes = subframes; + ev->type = type; + ev->size = size; + memcpy((uint8_t*)ev + sizeof(LV2_Event), data, size); + ++iter->buf->event_count; + + size = lv2_event_pad_size((uint16_t)(sizeof(LV2_Event) + size)); + iter->buf->size += size; + iter->offset += size; + + return true; +} + +/** Reserve space for an event in the buffer and return a pointer to + the memory where the caller can write the event data, or NULL if there + is not enough room in the buffer. */ +static inline uint8_t* +lv2_event_reserve(LV2_Event_Iterator* iter, + uint32_t frames, + uint32_t subframes, + uint16_t type, + uint16_t size) +{ + const uint16_t total_size = (uint16_t)(sizeof(LV2_Event) + size); + if (iter->buf->capacity - iter->buf->size < total_size) { + return NULL; + } + + LV2_Event* const ev = (LV2_Event*)(iter->buf->data + iter->offset); + + ev->frames = frames; + ev->subframes = subframes; + ev->type = type; + ev->size = size; + ++iter->buf->event_count; + + const uint16_t padded_size = lv2_event_pad_size(total_size); + iter->buf->size += padded_size; + iter->offset += padded_size; + + return (uint8_t*)ev + sizeof(LV2_Event); +} + +/** Write an event at `iter`. + * The event (if any) pointed to by `iter` will be overwritten, and `iter` + * incremented to point to the following event (i.e. several calls to this + * function can be done in sequence without twiddling iter in-between). + * @return True if event was written, otherwise false (buffer is full). */ +static inline bool +lv2_event_write_event(LV2_Event_Iterator* iter, + const LV2_Event* ev, + const uint8_t* data) +{ + const uint16_t total_size = (uint16_t)(sizeof(LV2_Event) + ev->size); + if (iter->buf->capacity - iter->buf->size < total_size) { + return false; + } + + LV2_Event* const write_ev = (LV2_Event*)(iter->buf->data + iter->offset); + + *write_ev = *ev; + memcpy((uint8_t*)write_ev + sizeof(LV2_Event), data, ev->size); + ++iter->buf->event_count; + + const uint16_t padded_size = lv2_event_pad_size(total_size); + iter->buf->size += padded_size; + iter->offset += padded_size; + + return true; +} + +LV2_RESTORE_WARNINGS + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_EVENT_HELPERS_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,246 @@ +@prefix dcs: . +@prefix doap: . +@prefix ev: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Event" ; + doap:shortdesc "A port-based real-time generic event interface." ; + doap:created "2008-00-00" ; + doap:developer , + ; + doap:release [ + doap:revision "1.12" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Minor documentation improvements." + ] + ] + ] , [ + doap:revision "1.10" ; + doap:created "2013-01-13" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect return type in lv2_event_get()." + ] + ] + ] , [ + doap:revision "1.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make event iterator gracefully handle optional ports." + ] , [ + rdfs:label "Remove asserts from event-helper.h." + ] , [ + rdfs:label "Use more precise domain and range for EventPort properties." + ] , [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix bug in lv2_event_reserve()." + ] , [ + rdfs:label "Fix incorrect ranges of some properties." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] , [ + rdfs:label "Use lv2:Specification to be discovered as an extension." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-11-24" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension is deprecated. New implementations +should use LV2 Atom instead. + +This extension defines a generic time-stamped event port type, which can be +used to create plugins that read and write real-time events, such as MIDI, +OSC, or any other type of event payload. The type(s) of event supported by +a port is defined in the data file for a plugin, for example: + + :::turtle + + lv2:port [ + a ev:EventPort, lv2:InputPort ; + lv2:index 0 ; + ev:supportsEvent ; + lv2:symbol "midi_input" ; + lv2:name "MIDI input" ; + ] . + +"""^^lv2:Markdown . + +ev:EventPort + lv2:documentation """ + +Ports of this type will be connected to a struct of type LV2_Event_Buffer, +defined in event.h. These ports contain a sequence of generic events (possibly +several types mixed in a single stream), the specific types of which are +defined by some URI in another LV2 extension. + +"""^^lv2:Markdown . + +ev:Event + a rdfs:Class ; + rdfs:label "Event" ; + lv2:documentation """ + +An ev:EventPort contains an LV2_Event_Buffer which contains a sequence of these +events. The binary format of LV2 events is defined by the LV2_Event struct in +event.h. + +Specific event types (such as MIDI or OSC) are defined by extensions, and +should be rdfs:subClassOf this class. + +"""^^lv2:Markdown . + +ev:TimeStamp + lv2:documentation """ + +This defines the meaning of the 'frames' and 'subframes' fields of an LV2_Event +(both unsigned 32-bit integers). + +"""^^lv2:Markdown . + +ev:FrameStamp + lv2:documentation """ + +The default time stamp unit for an LV2 event: the frames field represents audio +frames (in the sample rate passed to intantiate), and the subframes field is +1/UINT32_MAX of a frame. + +"""^^lv2:Markdown . + +ev:generic + lv2:documentation """ + +Indicates that this port does something meaningful for any event type. This is +useful for things like event mixers, delays, serialisers, and so on. + +If this property is set, hosts should consider the port suitable for any type +of event. Otherwise, hosts should consider the port 'appropriate' only for the +specific event types listed with :supportsEvent. Note that plugins must +gracefully handle unknown event types whether or not this property is present. + +"""^^lv2:Markdown . + +ev:supportsEvent + lv2:documentation """ + +Indicates that this port supports or "understands" a certain event type. + +For input ports, this means the plugin understands and does something useful +with events of this type. For output ports, this means the plugin may generate +events of this type. If the plugin never actually generates events of this +type, but might pass them through from an input, this property should not be +set (use ev:inheritsEvent for that). + +Plugins with event input ports must always gracefully handle any type of event, +even if it does not 'support' it. This property should always be set for event +types the plugin understands/generates so hosts can discover plugins +appropriate for a given scenario (for example, plugins with a MIDI input). +Hosts are not expected to consider event ports suitable for some type of event +if the relevant :supportsEvent property is not set, unless the ev:generic +property for that port is also set. + + +"""^^lv2:Markdown . + +ev:inheritsEvent + lv2:documentation """ + +Indicates that this output port might pass through events that arrived at some +other input port (or generate an event of the same type as events arriving at +that input). The host must always check the stamp type of all outputs when +connecting an input, but this property should be set whenever it applies. + + +"""^^lv2:Markdown . + +ev:supportsTimeStamp + lv2:documentation """ + +Indicates that this port supports or "understands" a certain time stamp type. +Meaningful only for input ports, the host must never connect a port to an event +buffer with a time stamp type that isn't supported by the port. + +"""^^lv2:Markdown . + +ev:generatesTimeStamp + lv2:documentation """ + +Indicates that this port may output a certain time stamp type, regardless of +the time stamp type of any input ports. + +If the port outputs stamps based on what type inputs are connected to, this +property should not be set (use the ev:inheritsTimeStamp property for that). +Hosts MUST check the time_stamp value of any output port buffers after a call +to connect_port on ANY event input port on the plugin. + +If the plugin changes the stamp_type field of an output event buffer during a +call to run(), the plugin must call the stamp_type_changed function provided by +the host in the LV2_Event_Feature struct, if it is non-NULL. + +"""^^lv2:Markdown . + +ev:inheritsTimeStamp + lv2:documentation """ + +Indicates that this port follows the time stamp type of an input port. + +This property is not necessary, but it should be set for outputs that base +their output type on an input port so the host can make more sense of the +plugin and provide a more sensible interface. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,86 @@ +@prefix ev: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . + + + a owl:Ontology ; + owl:deprecated true ; + rdfs:label "LV2 Event" ; + rdfs:comment "A port-based real-time generic event interface." ; + rdfs:seeAlso , + , + . + +ev:EventPort + a rdfs:Class ; + rdfs:label "Event Port" ; + rdfs:subClassOf lv2:Port ; + rdfs:comment "An LV2 event port." . + +ev:Event + a rdfs:Class ; + rdfs:label "Event" ; + rdfs:comment "A single generic time-stamped event." . + +ev:TimeStamp + a rdfs:Class ; + rdfs:label "Event Time Stamp" ; + rdfs:comment "The time stamp of an Event." . + +ev:FrameStamp + a rdfs:Class ; + rdfs:subClassOf ev:TimeStamp ; + rdfs:label "Audio Frame Time Stamp" ; + rdfs:comment "The default time stamp unit for an event." . + +ev:generic + a lv2:PortProperty ; + rdfs:label "generic event port" ; + rdfs:comment "Port works with generic events." . + +ev:supportsEvent + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort ; + rdfs:range rdfs:Class ; + rdfs:label "supports event type" ; + rdfs:comment "An event type supported by this port." . + +ev:inheritsEvent + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:OutputPort ; + rdfs:range lv2:Port ; + rdfs:label "inherits event type" ; + rdfs:comment "Output port inherits event types from an input port." . + +ev:supportsTimeStamp + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:InputPort ; + rdfs:range rdfs:Class ; + rdfs:label "supports time stamp type" ; + rdfs:comment "A time stamp type suported by this input port." . + +ev:generatesTimeStamp + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:OutputPort ; + rdfs:range rdfs:Class ; + rdfs:label "generates time stamp type" ; + rdfs:comment "A time stamp type generated by this input port." . + +ev:inheritsTimeStamp + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:OutputPort ; + rdfs:range lv2:Port ; + rdfs:label "inherits time stamp type" ; + rdfs:comment "Output port inherits time stamp types from an input port." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 12 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,41 @@ +/* + Copyright 2008-2016 David Robillard + + 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. +*/ + +#ifndef LV2_INSTANCE_ACCESS_H +#define LV2_INSTANCE_ACCESS_H + +/** + @defgroup instance-access Instance Access + @ingroup lv2 + + Access to the LV2_Handle of a plugin for UIs. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_INSTANCE_ACCESS_URI "http://lv2plug.in/ns/ext/instance-access" ///< http://lv2plug.in/ns/ext/instance-access + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_INSTANCE_ACCESS_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,75 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix ia: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Instance Access" ; + doap:shortdesc "Provides access to the LV2_Handle of a plugin." ; + doap:created "2010-10-04" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature which allows plugin UIs to get a direct handle +to an LV2 plugin instance (LV2_Handle), if possible. + +Note that the use of this extension by UIs violates the important principle of +UI/plugin separation, and is potentially a source of many problems. +Accordingly, **use of this extension is highly discouraged**, and plugins +should not expect hosts to support it, since it is often impossible to do so. + +To support this feature the host must pass an LV2_Feature struct to the UI +instantiate method with URI LV2_INSTANCE_ACCESS_URI and data pointed directly +to the LV2_Handle of the plugin instance. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,11 @@ +@prefix ia: . +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Feature ; + rdfs:label "instance access" ; + rdfs:comment "A feature that provides access to a plugin instance." ; + rdfs:seeAlso , + . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,157 @@ +/* + Copyright 2012-2016 David Robillard + + 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. +*/ + +#ifndef LV2_ATOM_LOGGER_H +#define LV2_ATOM_LOGGER_H + +/** + @defgroup logger Logger + @ingroup log + + Convenience API for easy logging in plugin code. This API provides simple + wrappers for logging from a plugin, which automatically fall back to + printing to stderr if host support is unavailabe. + + @{ +*/ + +#include "lv2/log/log.h" +#include "lv2/urid/urid.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Logger convenience API state. +*/ +typedef struct { + LV2_Log_Log* log; + + LV2_URID Error; + LV2_URID Note; + LV2_URID Trace; + LV2_URID Warning; +} LV2_Log_Logger; + +/** + Set `map` as the URI map for `logger`. + + This affects the message type URIDs (Error, Warning, etc) which are passed + to the log's print functions. +*/ +static inline void +lv2_log_logger_set_map(LV2_Log_Logger* logger, LV2_URID_Map* map) +{ + if (map) { + logger->Error = map->map(map->handle, LV2_LOG__Error); + logger->Note = map->map(map->handle, LV2_LOG__Note); + logger->Trace = map->map(map->handle, LV2_LOG__Trace); + logger->Warning = map->map(map->handle, LV2_LOG__Warning); + } else { + logger->Error = logger->Note = logger->Trace = logger->Warning = 0; + } +} + +/** + Initialise `logger`. + + URIs will be mapped using `map` and stored, a reference to `map` itself is + not held. Both `map` and `log` may be NULL when unsupported by the host, + in which case the implementation will fall back to printing to stderr. +*/ +static inline void +lv2_log_logger_init(LV2_Log_Logger* logger, LV2_URID_Map* map, LV2_Log_Log* log) +{ + logger->log = log; + lv2_log_logger_set_map(logger, map); +} + +/** + Log a message to the host, or stderr if support is unavailable. +*/ +LV2_LOG_FUNC(3, 0) +static inline int +lv2_log_vprintf(LV2_Log_Logger* logger, + LV2_URID type, + const char* fmt, + va_list args) +{ + return ((logger && logger->log) + ? logger->log->vprintf(logger->log->handle, type, fmt, args) + : vfprintf(stderr, fmt, args)); +} + +/** Log an error via lv2_log_vprintf(). */ +LV2_LOG_FUNC(2, 3) +static inline int +lv2_log_error(LV2_Log_Logger* logger, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = lv2_log_vprintf(logger, logger->Error, fmt, args); + va_end(args); + return ret; +} + +/** Log a note via lv2_log_vprintf(). */ +LV2_LOG_FUNC(2, 3) +static inline int +lv2_log_note(LV2_Log_Logger* logger, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = lv2_log_vprintf(logger, logger->Note, fmt, args); + va_end(args); + return ret; +} + +/** Log a trace via lv2_log_vprintf(). */ +LV2_LOG_FUNC(2, 3) +static inline int +lv2_log_trace(LV2_Log_Logger* logger, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = lv2_log_vprintf(logger, logger->Trace, fmt, args); + va_end(args); + return ret; +} + +/** Log a warning via lv2_log_vprintf(). */ +LV2_LOG_FUNC(2, 3) +static inline int +lv2_log_warning(LV2_Log_Logger* logger, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = lv2_log_vprintf(logger, logger->Warning, fmt, args); + va_end(args); + return ret; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_LOG_LOGGER_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,113 @@ +/* + Copyright 2012-2016 David Robillard + + 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. +*/ + +#ifndef LV2_LOG_H +#define LV2_LOG_H + +/** + @defgroup log Log + @ingroup lv2 + + Interface for plugins to log via the host. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_LOG_URI "http://lv2plug.in/ns/ext/log" ///< http://lv2plug.in/ns/ext/log +#define LV2_LOG_PREFIX LV2_LOG_URI "#" ///< http://lv2plug.in/ns/ext/log# + +#define LV2_LOG__Entry LV2_LOG_PREFIX "Entry" ///< http://lv2plug.in/ns/ext/log#Entry +#define LV2_LOG__Error LV2_LOG_PREFIX "Error" ///< http://lv2plug.in/ns/ext/log#Error +#define LV2_LOG__Note LV2_LOG_PREFIX "Note" ///< http://lv2plug.in/ns/ext/log#Note +#define LV2_LOG__Trace LV2_LOG_PREFIX "Trace" ///< http://lv2plug.in/ns/ext/log#Trace +#define LV2_LOG__Warning LV2_LOG_PREFIX "Warning" ///< http://lv2plug.in/ns/ext/log#Warning +#define LV2_LOG__log LV2_LOG_PREFIX "log" ///< http://lv2plug.in/ns/ext/log#log + +// clang-format on + +#include "lv2/urid/urid.h" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond */ +#ifdef __GNUC__ +/** Allow type checking of printf-like functions. */ +# define LV2_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define LV2_LOG_FUNC(fmt, arg1) +#endif +/** @endcond */ + +/** + Opaque data to host data for LV2_Log_Log. +*/ +typedef void* LV2_Log_Handle; + +/** + Log feature (LV2_LOG__log) +*/ +typedef struct { + /** + Opaque pointer to host data. + + This MUST be passed to methods in this struct whenever they are called. + Otherwise, it must not be interpreted in any way. + */ + LV2_Log_Handle handle; + + /** + Log a message, passing format parameters directly. + + The API of this function matches that of the standard C printf function, + except for the addition of the first two parameters. This function may + be called from any non-realtime context, or from any context if `type` + is @ref LV2_LOG__Trace. + */ + LV2_LOG_FUNC(3, 4) + int (*printf)(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...); + + /** + Log a message, passing format parameters in a va_list. + + The API of this function matches that of the standard C vprintf + function, except for the addition of the first two parameters. This + function may be called from any non-realtime context, or from any + context if `type` is @ref LV2_LOG__Trace. + */ + LV2_LOG_FUNC(3, 0) + int (*vprintf)(LV2_Log_Handle handle, + LV2_URID type, + const char* fmt, + va_list ap); +} LV2_Log_Log; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_LOG_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,126 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix log: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Log" ; + doap:shortdesc "A feature for writing log messages." ; + doap:created "2012-01-12" ; + doap:developer ; + doap:release [ + doap:revision "2.4" ; + doap:created "2016-07-30" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2_log_logger_set_map() for changing the URI map of an existing logger." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add missing include string.h to logger.h for memset." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2013-01-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add logger convenience API." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature, log:log, which allows plugins to print log +messages with an API similar to the standard C `printf` function. This allows, +for example, plugin logs to be nicely presented to the user in a graphical user +interface. + +Different log levels are defined by URI and passed as an LV2_URID. This +extensions defines standard levels which are expected to be understood by all +implementations and should be sufficient in most cases, but advanced +implementations may define and use additional levels to suit their needs. + +"""^^lv2:Markdown . + +log:Entry + a rdfs:Class ; + rdfs:label "Log Entry" ; + lv2:documentation """ + +Subclasses of this are passed as the `type` parameter to LV2_Log_Log methods to +describe the nature of the log entry. + +"""^^lv2:Markdown . + +log:Error + lv2:documentation """ + +An error should only be posted when a serious unexpected error occurs, and +should be actively shown to the user by the host. + +"""^^lv2:Markdown . + +log:Note + lv2:documentation """ + +A note records some useful piece of information, but may be ignored. The host +should provide passive access to note entries to the user. + +"""^^lv2:Markdown . + +log:Warning + lv2:documentation """ + +A warning should be posted when an unexpected, but non-critical, error occurs. +The host should provide passive access to warnings entries to the user, but may +also choose to actively show them. + +"""^^lv2:Markdown . + +log:Trace + lv2:documentation """ + +A trace should not be displayed during normal operation, but the host may +implement an option to display them for debugging purposes. + +This entry type is special in that one may be posted in a real-time thread. It +is assumed that if debug tracing is enabled, real-time performance is not a +concern. However, the host MUST guarantee that posting a trace _is_ real-time +safe if debug tracing is not enabled (for example, by simply ignoring the call +as early as possible). + +"""^^lv2:Markdown . + +log:log + lv2:documentation """ + +A feature which plugins may use to log messages. To support this feature, +the host must pass an LV2_Feature to LV2_Descriptor::instantiate() with URI +LV2_LOG__log and data pointed to an instance of LV2_Log_Log. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,48 @@ +@prefix log: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Log" ; + rdfs:comment "A feature for writing log messages." ; + rdfs:seeAlso , + . + +log:Entry + a rdfs:Class ; + rdfs:label "Entry" ; + rdfs:comment "A log entry." . + +log:Error + a rdfs:Class ; + rdfs:label "Error" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "An error message." . + +log:Note + a rdfs:Class ; + rdfs:label "Note" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "An informative message." . + +log:Warning + a rdfs:Class ; + rdfs:label "Warning" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "A warning message." . + +log:Trace + a rdfs:Class ; + rdfs:label "Trace" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "A debugging trace message." . + +log:log + a lv2:Feature ; + rdfs:label "log" ; + rdfs:comment "Logging feature." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 10 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,248 @@ +/* + Copyright 2012-2016 David Robillard + + 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. +*/ + +#ifndef LV2_MIDI_H +#define LV2_MIDI_H + +/** + @defgroup midi MIDI + @ingroup lv2 + + Definitions of standard MIDI messages. + + See for details. + + @{ +*/ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// clang-format off + +#define LV2_MIDI_URI "http://lv2plug.in/ns/ext/midi" ///< http://lv2plug.in/ns/ext/midi +#define LV2_MIDI_PREFIX LV2_MIDI_URI "#" ///< http://lv2plug.in/ns/ext/midi# + +#define LV2_MIDI__ActiveSense LV2_MIDI_PREFIX "ActiveSense" ///< http://lv2plug.in/ns/ext/midi#ActiveSense +#define LV2_MIDI__Aftertouch LV2_MIDI_PREFIX "Aftertouch" ///< http://lv2plug.in/ns/ext/midi#Aftertouch +#define LV2_MIDI__Bender LV2_MIDI_PREFIX "Bender" ///< http://lv2plug.in/ns/ext/midi#Bender +#define LV2_MIDI__ChannelPressure LV2_MIDI_PREFIX "ChannelPressure" ///< http://lv2plug.in/ns/ext/midi#ChannelPressure +#define LV2_MIDI__Chunk LV2_MIDI_PREFIX "Chunk" ///< http://lv2plug.in/ns/ext/midi#Chunk +#define LV2_MIDI__Clock LV2_MIDI_PREFIX "Clock" ///< http://lv2plug.in/ns/ext/midi#Clock +#define LV2_MIDI__Continue LV2_MIDI_PREFIX "Continue" ///< http://lv2plug.in/ns/ext/midi#Continue +#define LV2_MIDI__Controller LV2_MIDI_PREFIX "Controller" ///< http://lv2plug.in/ns/ext/midi#Controller +#define LV2_MIDI__MidiEvent LV2_MIDI_PREFIX "MidiEvent" ///< http://lv2plug.in/ns/ext/midi#MidiEvent +#define LV2_MIDI__NoteOff LV2_MIDI_PREFIX "NoteOff" ///< http://lv2plug.in/ns/ext/midi#NoteOff +#define LV2_MIDI__NoteOn LV2_MIDI_PREFIX "NoteOn" ///< http://lv2plug.in/ns/ext/midi#NoteOn +#define LV2_MIDI__ProgramChange LV2_MIDI_PREFIX "ProgramChange" ///< http://lv2plug.in/ns/ext/midi#ProgramChange +#define LV2_MIDI__QuarterFrame LV2_MIDI_PREFIX "QuarterFrame" ///< http://lv2plug.in/ns/ext/midi#QuarterFrame +#define LV2_MIDI__Reset LV2_MIDI_PREFIX "Reset" ///< http://lv2plug.in/ns/ext/midi#Reset +#define LV2_MIDI__SongPosition LV2_MIDI_PREFIX "SongPosition" ///< http://lv2plug.in/ns/ext/midi#SongPosition +#define LV2_MIDI__SongSelect LV2_MIDI_PREFIX "SongSelect" ///< http://lv2plug.in/ns/ext/midi#SongSelect +#define LV2_MIDI__Start LV2_MIDI_PREFIX "Start" ///< http://lv2plug.in/ns/ext/midi#Start +#define LV2_MIDI__Stop LV2_MIDI_PREFIX "Stop" ///< http://lv2plug.in/ns/ext/midi#Stop +#define LV2_MIDI__SystemCommon LV2_MIDI_PREFIX "SystemCommon" ///< http://lv2plug.in/ns/ext/midi#SystemCommon +#define LV2_MIDI__SystemExclusive LV2_MIDI_PREFIX "SystemExclusive" ///< http://lv2plug.in/ns/ext/midi#SystemExclusive +#define LV2_MIDI__SystemMessage LV2_MIDI_PREFIX "SystemMessage" ///< http://lv2plug.in/ns/ext/midi#SystemMessage +#define LV2_MIDI__SystemRealtime LV2_MIDI_PREFIX "SystemRealtime" ///< http://lv2plug.in/ns/ext/midi#SystemRealtime +#define LV2_MIDI__Tick LV2_MIDI_PREFIX "Tick" ///< http://lv2plug.in/ns/ext/midi#Tick +#define LV2_MIDI__TuneRequest LV2_MIDI_PREFIX "TuneRequest" ///< http://lv2plug.in/ns/ext/midi#TuneRequest +#define LV2_MIDI__VoiceMessage LV2_MIDI_PREFIX "VoiceMessage" ///< http://lv2plug.in/ns/ext/midi#VoiceMessage +#define LV2_MIDI__benderValue LV2_MIDI_PREFIX "benderValue" ///< http://lv2plug.in/ns/ext/midi#benderValue +#define LV2_MIDI__binding LV2_MIDI_PREFIX "binding" ///< http://lv2plug.in/ns/ext/midi#binding +#define LV2_MIDI__byteNumber LV2_MIDI_PREFIX "byteNumber" ///< http://lv2plug.in/ns/ext/midi#byteNumber +#define LV2_MIDI__channel LV2_MIDI_PREFIX "channel" ///< http://lv2plug.in/ns/ext/midi#channel +#define LV2_MIDI__chunk LV2_MIDI_PREFIX "chunk" ///< http://lv2plug.in/ns/ext/midi#chunk +#define LV2_MIDI__controllerNumber LV2_MIDI_PREFIX "controllerNumber" ///< http://lv2plug.in/ns/ext/midi#controllerNumber +#define LV2_MIDI__controllerValue LV2_MIDI_PREFIX "controllerValue" ///< http://lv2plug.in/ns/ext/midi#controllerValue +#define LV2_MIDI__noteNumber LV2_MIDI_PREFIX "noteNumber" ///< http://lv2plug.in/ns/ext/midi#noteNumber +#define LV2_MIDI__pressure LV2_MIDI_PREFIX "pressure" ///< http://lv2plug.in/ns/ext/midi#pressure +#define LV2_MIDI__programNumber LV2_MIDI_PREFIX "programNumber" ///< http://lv2plug.in/ns/ext/midi#programNumber +#define LV2_MIDI__property LV2_MIDI_PREFIX "property" ///< http://lv2plug.in/ns/ext/midi#property +#define LV2_MIDI__songNumber LV2_MIDI_PREFIX "songNumber" ///< http://lv2plug.in/ns/ext/midi#songNumber +#define LV2_MIDI__songPosition LV2_MIDI_PREFIX "songPosition" ///< http://lv2plug.in/ns/ext/midi#songPosition +#define LV2_MIDI__status LV2_MIDI_PREFIX "status" ///< http://lv2plug.in/ns/ext/midi#status +#define LV2_MIDI__statusMask LV2_MIDI_PREFIX "statusMask" ///< http://lv2plug.in/ns/ext/midi#statusMask +#define LV2_MIDI__velocity LV2_MIDI_PREFIX "velocity" ///< http://lv2plug.in/ns/ext/midi#velocity + +// clang-format on + +/** + MIDI Message Type. + + This includes both voice messages (which have a channel) and system messages + (which do not), as well as a sentinel value for invalid messages. To get + the type of a message suitable for use in a switch statement, use + lv2_midi_get_type() on the status byte. +*/ +typedef enum { + LV2_MIDI_MSG_INVALID = 0, /**< Invalid Message */ + LV2_MIDI_MSG_NOTE_OFF = 0x80, /**< Note Off */ + LV2_MIDI_MSG_NOTE_ON = 0x90, /**< Note On */ + LV2_MIDI_MSG_NOTE_PRESSURE = 0xA0, /**< Note Pressure */ + LV2_MIDI_MSG_CONTROLLER = 0xB0, /**< Controller */ + LV2_MIDI_MSG_PGM_CHANGE = 0xC0, /**< Program Change */ + LV2_MIDI_MSG_CHANNEL_PRESSURE = 0xD0, /**< Channel Pressure */ + LV2_MIDI_MSG_BENDER = 0xE0, /**< Pitch Bender */ + LV2_MIDI_MSG_SYSTEM_EXCLUSIVE = 0xF0, /**< System Exclusive Begin */ + LV2_MIDI_MSG_MTC_QUARTER = 0xF1, /**< MTC Quarter Frame */ + LV2_MIDI_MSG_SONG_POS = 0xF2, /**< Song Position */ + LV2_MIDI_MSG_SONG_SELECT = 0xF3, /**< Song Select */ + LV2_MIDI_MSG_TUNE_REQUEST = 0xF6, /**< Tune Request */ + LV2_MIDI_MSG_CLOCK = 0xF8, /**< Clock */ + LV2_MIDI_MSG_START = 0xFA, /**< Start */ + LV2_MIDI_MSG_CONTINUE = 0xFB, /**< Continue */ + LV2_MIDI_MSG_STOP = 0xFC, /**< Stop */ + LV2_MIDI_MSG_ACTIVE_SENSE = 0xFE, /**< Active Sensing */ + LV2_MIDI_MSG_RESET = 0xFF /**< Reset */ +} LV2_Midi_Message_Type; + +/** + Standard MIDI Controller Numbers. +*/ +typedef enum { + LV2_MIDI_CTL_MSB_BANK = 0x00, /**< Bank Selection */ + LV2_MIDI_CTL_MSB_MODWHEEL = 0x01, /**< Modulation */ + LV2_MIDI_CTL_MSB_BREATH = 0x02, /**< Breath */ + LV2_MIDI_CTL_MSB_FOOT = 0x04, /**< Foot */ + LV2_MIDI_CTL_MSB_PORTAMENTO_TIME = 0x05, /**< Portamento Time */ + LV2_MIDI_CTL_MSB_DATA_ENTRY = 0x06, /**< Data Entry */ + LV2_MIDI_CTL_MSB_MAIN_VOLUME = 0x07, /**< Main Volume */ + LV2_MIDI_CTL_MSB_BALANCE = 0x08, /**< Balance */ + LV2_MIDI_CTL_MSB_PAN = 0x0A, /**< Panpot */ + LV2_MIDI_CTL_MSB_EXPRESSION = 0x0B, /**< Expression */ + LV2_MIDI_CTL_MSB_EFFECT1 = 0x0C, /**< Effect1 */ + LV2_MIDI_CTL_MSB_EFFECT2 = 0x0D, /**< Effect2 */ + LV2_MIDI_CTL_MSB_GENERAL_PURPOSE1 = 0x10, /**< General Purpose 1 */ + LV2_MIDI_CTL_MSB_GENERAL_PURPOSE2 = 0x11, /**< General Purpose 2 */ + LV2_MIDI_CTL_MSB_GENERAL_PURPOSE3 = 0x12, /**< General Purpose 3 */ + LV2_MIDI_CTL_MSB_GENERAL_PURPOSE4 = 0x13, /**< General Purpose 4 */ + LV2_MIDI_CTL_LSB_BANK = 0x20, /**< Bank Selection */ + LV2_MIDI_CTL_LSB_MODWHEEL = 0x21, /**< Modulation */ + LV2_MIDI_CTL_LSB_BREATH = 0x22, /**< Breath */ + LV2_MIDI_CTL_LSB_FOOT = 0x24, /**< Foot */ + LV2_MIDI_CTL_LSB_PORTAMENTO_TIME = 0x25, /**< Portamento Time */ + LV2_MIDI_CTL_LSB_DATA_ENTRY = 0x26, /**< Data Entry */ + LV2_MIDI_CTL_LSB_MAIN_VOLUME = 0x27, /**< Main Volume */ + LV2_MIDI_CTL_LSB_BALANCE = 0x28, /**< Balance */ + LV2_MIDI_CTL_LSB_PAN = 0x2A, /**< Panpot */ + LV2_MIDI_CTL_LSB_EXPRESSION = 0x2B, /**< Expression */ + LV2_MIDI_CTL_LSB_EFFECT1 = 0x2C, /**< Effect1 */ + LV2_MIDI_CTL_LSB_EFFECT2 = 0x2D, /**< Effect2 */ + LV2_MIDI_CTL_LSB_GENERAL_PURPOSE1 = 0x30, /**< General Purpose 1 */ + LV2_MIDI_CTL_LSB_GENERAL_PURPOSE2 = 0x31, /**< General Purpose 2 */ + LV2_MIDI_CTL_LSB_GENERAL_PURPOSE3 = 0x32, /**< General Purpose 3 */ + LV2_MIDI_CTL_LSB_GENERAL_PURPOSE4 = 0x33, /**< General Purpose 4 */ + LV2_MIDI_CTL_SUSTAIN = 0x40, /**< Sustain Pedal */ + LV2_MIDI_CTL_PORTAMENTO = 0x41, /**< Portamento */ + LV2_MIDI_CTL_SOSTENUTO = 0x42, /**< Sostenuto */ + LV2_MIDI_CTL_SOFT_PEDAL = 0x43, /**< Soft Pedal */ + LV2_MIDI_CTL_LEGATO_FOOTSWITCH = 0x44, /**< Legato Foot Switch */ + LV2_MIDI_CTL_HOLD2 = 0x45, /**< Hold2 */ + LV2_MIDI_CTL_SC1_SOUND_VARIATION = 0x46, /**< SC1 Sound Variation */ + LV2_MIDI_CTL_SC2_TIMBRE = 0x47, /**< SC2 Timbre */ + LV2_MIDI_CTL_SC3_RELEASE_TIME = 0x48, /**< SC3 Release Time */ + LV2_MIDI_CTL_SC4_ATTACK_TIME = 0x49, /**< SC4 Attack Time */ + LV2_MIDI_CTL_SC5_BRIGHTNESS = 0x4A, /**< SC5 Brightness */ + LV2_MIDI_CTL_SC6 = 0x4B, /**< SC6 */ + LV2_MIDI_CTL_SC7 = 0x4C, /**< SC7 */ + LV2_MIDI_CTL_SC8 = 0x4D, /**< SC8 */ + LV2_MIDI_CTL_SC9 = 0x4E, /**< SC9 */ + LV2_MIDI_CTL_SC10 = 0x4F, /**< SC10 */ + LV2_MIDI_CTL_GENERAL_PURPOSE5 = 0x50, /**< General Purpose 5 */ + LV2_MIDI_CTL_GENERAL_PURPOSE6 = 0x51, /**< General Purpose 6 */ + LV2_MIDI_CTL_GENERAL_PURPOSE7 = 0x52, /**< General Purpose 7 */ + LV2_MIDI_CTL_GENERAL_PURPOSE8 = 0x53, /**< General Purpose 8 */ + LV2_MIDI_CTL_PORTAMENTO_CONTROL = 0x54, /**< Portamento Control */ + LV2_MIDI_CTL_E1_REVERB_DEPTH = 0x5B, /**< E1 Reverb Depth */ + LV2_MIDI_CTL_E2_TREMOLO_DEPTH = 0x5C, /**< E2 Tremolo Depth */ + LV2_MIDI_CTL_E3_CHORUS_DEPTH = 0x5D, /**< E3 Chorus Depth */ + LV2_MIDI_CTL_E4_DETUNE_DEPTH = 0x5E, /**< E4 Detune Depth */ + LV2_MIDI_CTL_E5_PHASER_DEPTH = 0x5F, /**< E5 Phaser Depth */ + LV2_MIDI_CTL_DATA_INCREMENT = 0x60, /**< Data Increment */ + LV2_MIDI_CTL_DATA_DECREMENT = 0x61, /**< Data Decrement */ + LV2_MIDI_CTL_NRPN_LSB = 0x62, /**< Non-registered Parameter Number */ + LV2_MIDI_CTL_NRPN_MSB = 0x63, /**< Non-registered Parameter Number */ + LV2_MIDI_CTL_RPN_LSB = 0x64, /**< Registered Parameter Number */ + LV2_MIDI_CTL_RPN_MSB = 0x65, /**< Registered Parameter Number */ + LV2_MIDI_CTL_ALL_SOUNDS_OFF = 0x78, /**< All Sounds Off */ + LV2_MIDI_CTL_RESET_CONTROLLERS = 0x79, /**< Reset Controllers */ + LV2_MIDI_CTL_LOCAL_CONTROL_SWITCH = 0x7A, /**< Local Control Switch */ + LV2_MIDI_CTL_ALL_NOTES_OFF = 0x7B, /**< All Notes Off */ + LV2_MIDI_CTL_OMNI_OFF = 0x7C, /**< Omni Off */ + LV2_MIDI_CTL_OMNI_ON = 0x7D, /**< Omni On */ + LV2_MIDI_CTL_MONO1 = 0x7E, /**< Mono1 */ + LV2_MIDI_CTL_MONO2 = 0x7F /**< Mono2 */ +} LV2_Midi_Controller; + +/** + Return true iff `msg` is a MIDI voice message (which has a channel). +*/ +static inline bool +lv2_midi_is_voice_message(const uint8_t* msg) +{ + return msg[0] >= 0x80 && msg[0] < 0xF0; +} + +/** + Return true iff `msg` is a MIDI system message (which has no channel). +*/ +static inline bool +lv2_midi_is_system_message(const uint8_t* msg) +{ + switch (msg[0]) { + case 0xF4: + case 0xF5: + case 0xF7: + case 0xF9: + case 0xFD: + return false; + default: + return (msg[0] & 0xF0) == 0xF0; + } +} + +/** + Return the type of a MIDI message. + @param msg Pointer to the start (status byte) of a MIDI message. +*/ +static inline LV2_Midi_Message_Type +lv2_midi_message_type(const uint8_t* msg) +{ + if (lv2_midi_is_voice_message(msg)) { + return (LV2_Midi_Message_Type)(msg[0] & 0xF0); + } + + if (lv2_midi_is_system_message(msg)) { + return (LV2_Midi_Message_Type)msg[0]; + } + + return LV2_MIDI_MSG_INVALID; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_MIDI_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,153 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix midi: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 MIDI" ; + doap:shortdesc "A normalised definition of raw MIDI." ; + doap:maintainer ; + doap:created "2006-00-00" ; + doap:developer , + ; + doap:release [ + doap:revision "1.10" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect range of midi:chunk." + ] + ] + ] , [ + doap:revision "1.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add midi:binding and midi:channel predicates." + ] , [ + rdfs:label "Add midi:HexByte datatype for status bytes and masks." + ] , [ + rdfs:label "Remove non-standard midi:Tick message type." + ] , [ + rdfs:label "Add C definitions for message types and standard controllers." + ] , [ + rdfs:label "Fix definition of SystemExclusive status byte." + ] + ] + ] , [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add class definitions for various message types." + ] , [ + rdfs:label "Document how to serialise a MidiEvent to a string." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This specification defines a data type for a MIDI message, midi:MidiEvent, +which is normalised for fast and convenient real-time processing. MIDI is the +Musical Instrument Digital Interface, a ubiquitous binary standard for +controlling digital music devices. + +For plugins that process MIDI (or other situations where MIDI is sent via a +generic transport) the main type defined here, midi:MidiEvent, can be mapped to +an integer and used as the type of an LV2 [Atom](atom.html#Atom) or +[Event](event.html#Event). + +This specification also defines a complete vocabulary for the MIDI standard, +except for standard controller numbers. These descriptions are detailed enough +to express any MIDI message as properties. + +"""^^lv2:Markdown . + +midi:MidiEvent + lv2:documentation """ + +A single raw MIDI message (a sequence of bytes). + +This is equivalent to a standard MIDI messages, except with the following +restrictions to simplify handling: + + * Running status is not allowed, every message must have its own status byte. + + * Note On messages with velocity 0 are not allowed. These messages are + equivalent to Note Off in standard MIDI streams, but here only proper Note + Off messages are allowed. + + * "Realtime messages" (status bytes 0xF8 to 0xFF) are allowed, but may not + occur inside other messages like they can in standard MIDI streams. + + * All messages are complete valid MIDI messages. This means, for example, + that only the first byte in each event (the status byte) may have the + eighth bit set, that Note On and Note Off events are always 3 bytes long, + etc. + +Where messages are communicated, the writer is responsible for writing valid +messages, and the reader may assume that all events are valid. + +If a midi:MidiEvent is serialised to a string, the format should be +xsd:hexBinary, for example: + + :::turtle + [] eg:someEvent "901A01"^^midi:MidiEvent . + +"""^^lv2:Markdown . + +midi:statusMask + lv2:documentation """ + +This is a status byte with the lower nibble set to zero. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,366 @@ +@prefix atom: . +@prefix ev: . +@prefix lv2: . +@prefix midi: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 MIDI" ; + rdfs:comment "A normalised definition of raw MIDI." ; + rdfs:seeAlso , + . + +midi:ActiveSense + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Active Sense" ; + rdfs:comment "MIDI active sense message." ; + midi:status "FE"^^xsd:hexBinary . + +midi:Aftertouch + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Aftertouch" ; + rdfs:comment "MIDI aftertouch message." ; + midi:statusMask "A0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:noteNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:pressure + ] . + +midi:Bender + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Bender" ; + rdfs:comment "MIDI bender message." ; + midi:statusMask "E0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 , + 1 ; + midi:property midi:benderValue + ] . + +midi:ChannelPressure + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Channel Pressure" ; + rdfs:comment "MIDI channel pressure message." ; + midi:statusMask "D0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:pressure + ] . + +midi:Chunk + a rdfs:Class ; + rdfs:label "Chunk" ; + rdfs:comment "A sequence of contiguous bytes in a MIDI message." . + +midi:Clock + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Clock" ; + rdfs:comment "MIDI clock message." ; + midi:status "F8"^^xsd:hexBinary . + +midi:Continue + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Continue" ; + rdfs:comment "MIDI continue message." ; + midi:status "FB"^^xsd:hexBinary . + +midi:Controller + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Controller" ; + rdfs:comment "MIDI controller change message." ; + midi:statusMask "B0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:controllerNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:controllerValue + ] . + +midi:HexByte + a rdfs:Datatype ; + owl:onDatatype xsd:hexBinary ; + owl:withRestrictions ( + [ + xsd:maxInclusive "FF" + ] + ) ; + rdfs:label "Hex Byte" ; + rdfs:comment "A hexadecimal byte, which has a value <= FF." . + +midi:MidiEvent + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf ev:Event , + atom:Atom ; + owl:onDatatype xsd:hexBinary ; + rdfs:label "MIDI Message" ; + rdfs:comment "A single raw MIDI message." . + +midi:NoteOff + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Note Off" ; + rdfs:comment "MIDI note off message." ; + midi:statusMask "80"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:noteNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:velocity + ] . + +midi:NoteOn + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Note On" ; + rdfs:comment "MIDI note on message." ; + midi:statusMask "90"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:noteNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:velocity + ] . + +midi:ProgramChange + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Program Change" ; + rdfs:comment "MIDI program change message." ; + midi:statusMask "C0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:programNumber + ] . + +midi:QuarterFrame + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Quarter Frame" ; + rdfs:comment "MIDI quarter frame message." ; + midi:status "F1"^^xsd:hexBinary . + +midi:Reset + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Reset" ; + rdfs:comment "MIDI reset message." ; + midi:status "FF"^^xsd:hexBinary . + +midi:SongPosition + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Song Position" ; + rdfs:comment "MIDI song position pointer message." ; + midi:status "F2"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 , + 1 ; + midi:property midi:songPosition + ] . + +midi:SongSelect + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Song Select" ; + rdfs:comment "MIDI song select message." ; + midi:status "F3"^^xsd:hexBinary . + +midi:Start + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Start" ; + rdfs:comment "MIDI start message." ; + midi:status "FA"^^xsd:hexBinary . + +midi:Stop + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Stop" ; + rdfs:comment "MIDI stop message." ; + midi:status "FC"^^xsd:hexBinary . + +midi:SystemCommon + a rdfs:Class ; + rdfs:subClassOf midi:SystemMessage ; + rdfs:label "System Common" ; + rdfs:comment "MIDI system common message." . + +midi:SystemExclusive + a rdfs:Class ; + rdfs:subClassOf midi:SystemMessage ; + rdfs:label "System Exclusive" ; + rdfs:comment "MIDI system exclusive message." ; + midi:status "F0"^^xsd:hexBinary . + +midi:SystemMessage + a rdfs:Class ; + rdfs:subClassOf midi:MidiEvent ; + rdfs:label "System Message" ; + rdfs:comment "MIDI system message." ; + midi:statusMask "F0"^^xsd:hexBinary . + +midi:SystemRealtime + a rdfs:Class ; + rdfs:subClassOf midi:SystemMessage ; + rdfs:label "System Realtime" ; + rdfs:comment "MIDI system realtime message." . + +midi:TuneRequest + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Tune Request" ; + rdfs:comment "MIDI tune request message." ; + midi:status "F6"^^xsd:hexBinary . + +midi:VoiceMessage + a rdfs:Class ; + rdfs:subClassOf midi:MidiEvent ; + rdfs:label "Voice Message" ; + rdfs:comment "MIDI voice message." ; + midi:statusMask "F0"^^xsd:hexBinary . + +midi:benderValue + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "bender value" ; + rdfs:range xsd:short ; + rdfs:comment "MIDI pitch bender message (-8192 to 8192)." . + +midi:binding + a rdf:Property , + owl:ObjectProperty ; + rdfs:range midi:MidiEvent ; + rdfs:label "binding" ; + rdfs:comment "The MIDI event to bind a parameter to." . + +midi:byteNumber + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "byte number" ; + rdfs:domain midi:Chunk ; + rdfs:range xsd:unsignedByte ; + rdfs:comment "The 0-based index of a byte which is part of this chunk." . + +midi:channel + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "MIDI channel" ; + rdfs:range xsd:unsignedByte ; + rdfs:comment "The channel number of a MIDI message." . + +midi:chunk + a rdf:Property , + owl:ObjectProperty ; + rdfs:range midi:Chunk ; + rdfs:label "MIDI chunk" ; + rdfs:comment "A chunk of a MIDI message." . + +midi:controllerNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "MIDI controller number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a controller (0 to 127)." . + +midi:controllerValue + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "MIDI controller value" ; + rdfs:range xsd:byte ; + rdfs:comment "The value of a controller (0 to 127)." . + +midi:noteNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "note number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a note (0 to 127)." . + +midi:pressure + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "key pressure" ; + rdfs:range xsd:byte ; + rdfs:comment "Key pressure (0 to 127)." . + +midi:programNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "program number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a program (0 to 127)." . + +midi:property + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:label "property" ; + rdfs:domain midi:Chunk ; + rdfs:range rdf:Property ; + rdfs:comment "The property this chunk represents." . + +midi:songNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "song number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a song (0 to 127)." . + +midi:songPosition + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "song position" ; + rdfs:range xsd:short ; + rdfs:comment "Song position in MIDI beats (16th notes) (-8192 to 8192)." . + +midi:status + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "status byte" ; + rdfs:range midi:HexByte ; + rdfs:comment "The exact status byte for a message of this type." . + +midi:statusMask + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "status mask" ; + rdfs:range midi:HexByte ; + rdfs:comment "The status byte for a message of this type on channel 1." . + +midi:velocity + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "velocity" ; + rdfs:range midi:HexByte ; + rdfs:comment "The velocity of a note message (0 to 127)." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,48 @@ +/* + Copyright 2012-2016 David Robillard + + 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. +*/ + +#ifndef LV2_MORPH_H +#define LV2_MORPH_H + +/** + @defgroup morph Morph + @ingroup lv2 + + Ports that can dynamically change type. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_MORPH_URI "http://lv2plug.in/ns/ext/morph" ///< http://lv2plug.in/ns/ext/morph +#define LV2_MORPH_PREFIX LV2_MORPH_URI "#" ///< http://lv2plug.in/ns/ext/morph# + +#define LV2_MORPH__AutoMorphPort LV2_MORPH_PREFIX "AutoMorphPort" ///< http://lv2plug.in/ns/ext/morph#AutoMorphPort +#define LV2_MORPH__MorphPort LV2_MORPH_PREFIX "MorphPort" ///< http://lv2plug.in/ns/ext/morph#MorphPort +#define LV2_MORPH__interface LV2_MORPH_PREFIX "interface" ///< http://lv2plug.in/ns/ext/morph#interface +#define LV2_MORPH__supportsType LV2_MORPH_PREFIX "supportsType" ///< http://lv2plug.in/ns/ext/morph#supportsType +#define LV2_MORPH__currentType LV2_MORPH_PREFIX "currentType" ///< http://lv2plug.in/ns/ext/morph#currentType + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_MORPH_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,90 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix morph: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Morph" ; + doap:shortdesc "Ports that can dynamically change type." ; + doap:created "2012-05-22" ; + doap:developer ; + doap:release [ + doap:revision "1.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines two port types: morph:MorphPort, which has a +host-configurable type, and morph:AutoMorphPort, which may automatically change +type when a MorphPort's type is changed. These ports always have a default +type and work normally work in hosts that are unaware of this extension. Thus, +this extension provides a backwards compatibility mechanism which allows +plugins to use new port types but gracefully fall back to a default type in +hosts that do not support them. + +This extension only defines port types and properties for describing morph +ports. The actual run-time switching is done via the opts:interface API. + +"""^^lv2:Markdown . + +morph:MorphPort + lv2:documentation """ + +Ports of this type MUST have another type which defines the default buffer +format (for example lv2:ControlPort) but can be dynamically changed to a +different type in hosts that support opts:interface. + +The host may change the type of a MorphPort by setting its morph:currentType +with LV2_Options_Interface::set(). If the plugin has any morph:AutoMorphPort +ports, the host MUST check their types after changing any port type since they +may have changed. + +"""^^lv2:Markdown . + +morph:AutoMorphPort + lv2:documentation """ + +Ports of this type MUST have another type which defines the default buffer +format (for example, lv2:ControlPort) but may dynamically change types based on +the configured types of any morph:MorphPort ports on the same plugin instance. + +The type of a port may only change in response to a host call to +LV2_Options_Interface::set(). Whenever any port type on the instance changes, +the host MUST check the type of all morph:AutoMorphPort ports with +LV2_Options_Interface::get() before calling run() again, since they may have +changed. If the type of any port is zero, it means the current configuration +is invalid and the plugin may not be run (unless that port is +lv2:connectionOptional and connected to NULL). + +This is mainly useful for outputs whose type depends on the type of +corresponding inputs. + +"""^^lv2:Markdown . + +morph:supportsType + lv2:documentation """ + +Indicates that a port supports being switched to a certain type. A MorphPort +MUST list each type it supports being switched to in the plugin data using this +property. + +"""^^lv2:Markdown . + +morph:currentType + lv2:documentation """ + +The currently active type of the port. This is for dynamic use as an option +and SHOULD NOT be listed in the static plugin data. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,46 @@ +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix morph: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Morph" ; + rdfs:comment "Ports that can dynamically change type." ; + rdfs:seeAlso , + . + +morph:MorphPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Morph Port" ; + rdfs:comment "A port which can be switched to another type." . + +morph:AutoMorphPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Auto Morph Port" ; + rdfs:comment "A port that can change its type based on that of another." . + +morph:supportsType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain morph:MorphPort ; + rdfs:label "supports type" ; + rdfs:comment "A type that a port supports being switched to." . + +morph:currentType + a rdf:Property , + opts:Option , + owl:ObjectProperty ; + rdfs:domain morph:MorphPort ; + rdfs:label "current type" ; + rdfs:comment "The currently active type of the port." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,149 @@ +/* + Copyright 2012-2016 David Robillard + + 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. +*/ + +#ifndef LV2_OPTIONS_H +#define LV2_OPTIONS_H + +/** + @defgroup options Options + @ingroup lv2 + + Instantiation time options. + + See for details. + + @{ +*/ + +#include "lv2/core/lv2.h" +#include "lv2/urid/urid.h" + +#include + +// clang-format off + +#define LV2_OPTIONS_URI "http://lv2plug.in/ns/ext/options" ///< http://lv2plug.in/ns/ext/options +#define LV2_OPTIONS_PREFIX LV2_OPTIONS_URI "#" ///< http://lv2plug.in/ns/ext/options# + +#define LV2_OPTIONS__Option LV2_OPTIONS_PREFIX "Option" ///< http://lv2plug.in/ns/ext/options#Option +#define LV2_OPTIONS__interface LV2_OPTIONS_PREFIX "interface" ///< http://lv2plug.in/ns/ext/options#interface +#define LV2_OPTIONS__options LV2_OPTIONS_PREFIX "options" ///< http://lv2plug.in/ns/ext/options#options +#define LV2_OPTIONS__requiredOption LV2_OPTIONS_PREFIX "requiredOption" ///< http://lv2plug.in/ns/ext/options#requiredOption +#define LV2_OPTIONS__supportedOption LV2_OPTIONS_PREFIX "supportedOption" ///< http://lv2plug.in/ns/ext/options#supportedOption + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +/** + The context of an Option, which defines the subject it applies to. +*/ +typedef enum { + /** + This option applies to the instance itself. The subject must be + ignored. + */ + LV2_OPTIONS_INSTANCE, + + /** + This option applies to some named resource. The subject is a URI mapped + to an integer (a LV2_URID, like the key) + */ + LV2_OPTIONS_RESOURCE, + + /** + This option applies to some blank node. The subject is a blank node + identifier, which is valid only within the current local scope. + */ + LV2_OPTIONS_BLANK, + + /** + This option applies to a port on the instance. The subject is the + port's index. + */ + LV2_OPTIONS_PORT +} LV2_Options_Context; + +/** + An option. + + This is a property with a subject, also known as a triple or statement. + + This struct is useful anywhere a statement needs to be passed where no + memory ownership issues are present (since the value is a const pointer). + + Options can be passed to an instance via the feature LV2_OPTIONS__options + with data pointed to an array of options terminated by a zeroed option, or + accessed/manipulated using LV2_Options_Interface. +*/ +typedef struct { + LV2_Options_Context context; /**< Context (type of subject). */ + uint32_t subject; /**< Subject. */ + LV2_URID key; /**< Key (property). */ + uint32_t size; /**< Size of value in bytes. */ + LV2_URID type; /**< Type of value (datatype). */ + const void* value; /**< Pointer to value (object). */ +} LV2_Options_Option; + +/** A status code for option functions. */ +typedef enum { + LV2_OPTIONS_SUCCESS = 0, /**< Completed successfully. */ + LV2_OPTIONS_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_OPTIONS_ERR_BAD_SUBJECT = 1 << 1, /**< Invalid/unsupported subject. */ + LV2_OPTIONS_ERR_BAD_KEY = 1 << 2, /**< Invalid/unsupported key. */ + LV2_OPTIONS_ERR_BAD_VALUE = 1 << 3 /**< Invalid/unsupported value. */ +} LV2_Options_Status; + +/** + Interface for dynamically setting options (LV2_OPTIONS__interface). +*/ +typedef struct { + /** + Get the given options. + + Each element of the passed options array MUST have type, subject, and + key set. All other fields (size, type, value) MUST be initialised to + zero, and are set to the option value if such an option is found. + + This function is in the "instantiation" LV2 threading class, so no other + instance functions may be called concurrently. + + @return Bitwise OR of LV2_Options_Status values. + */ + uint32_t (*get)(LV2_Handle instance, LV2_Options_Option* options); + + /** + Set the given options. + + This function is in the "instantiation" LV2 threading class, so no other + instance functions may be called concurrently. + + @return Bitwise OR of LV2_Options_Status values. + */ + uint32_t (*set)(LV2_Handle instance, const LV2_Options_Option* options); +} LV2_Options_Interface; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_OPTIONS_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,129 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix opts: . +@prefix rdf: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Options" ; + doap:shortdesc "Runtime options for LV2 plugins and UIs." ; + doap:created "2012-08-20" ; + doap:developer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Relax range of opts:requiredOption and opts:supportedOption" + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2013-01-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Set the range of opts:requiredOption and opts:supportedOption to opts:Option." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a facility for options, which are values the host +passes to a plugin or UI at run time. + +There are two facilities for passing options to an instance: opts:options +allows passing options at instantiation time, and the opts:interface interface +allows options to be dynamically set and retrieved after instantiation. + +Note that this extension is only for allowing hosts to configure plugins, and +is not a live control mechanism. For real-time control, use event-based +control via an atom:AtomPort with an atom:Sequence buffer. + +Instances may indicate they require an option with the opts:requiredOption +property, or that they optionally support an option with the +opts:supportedOption property. + +"""^^lv2:Markdown . + +opts:Option + lv2:documentation """ + +It is not required for a property to explicitly be an Option in order to be +used as such. However, properties which are primarily intended for use as +options, or are at least particularly useful as options, should be explicitly +given this type for documentation purposes, and to assist hosts in discovering +option definitions. + +"""^^lv2:Markdown . + +opts:interface + lv2:documentation """ + +An interface (LV2_Options_Interface) for dynamically setting and getting +options. Note that this is intended for use by the host for configuring +plugins only, and is not a live plugin control mechanism. + +The plugin data file should advertise this interface like so: + + :::turtle + @prefix opts: . + + + a lv2:Plugin ; + lv2:extensionData opts:interface . + +"""^^lv2:Markdown . + +opts:options + lv2:documentation """ + +To implement this feature, hosts MUST pass an LV2_Feature to the appropriate +instantiate method with this URI and data pointed to an array of +LV2_Options_Option terminated by an element with both key and value set to +zero. The instance should cast this data pointer to `const +LV2_Options_Option*` and scan the array for any options of interest. The +instance MUST NOT modify the options array in any way. + +Note that requiring this feature may reduce the number of compatible hosts. +Unless some options are strictly required by the instance, this feature SHOULD +be listed as an lv2:optionalFeature. + +"""^^lv2:Markdown . + +opts:requiredOption + lv2:documentation """ + +The host MUST pass a value for the specified option via opts:options during +instantiation. + +Note that use of this property may reduce the number of compatible hosts. +Wherever possible, it is better to list options with opts:supportedOption and +fall back to a reasonable default value if it is not provided. + +"""^^lv2:Markdown . + +opts:supportedOption + lv2:documentation """ + +The host SHOULD provide a value for the specified option if one is known, or +provide the user an opportunity to specify one if possible. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,44 @@ +@prefix lv2: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Options" ; + rdfs:comment "Runtime options for LV2 plugins and UIs." ; + rdfs:seeAlso , + . + +opts:Option + a rdfs:Class ; + rdfs:label "Option" ; + rdfs:subClassOf rdf:Property ; + rdfs:comment "A value for a static option passed to an instance." . + +opts:interface + a lv2:ExtensionData ; + rdfs:label "interface" ; + rdfs:comment "An interface for dynamically setting and getting options." . + +opts:options + a lv2:Feature ; + rdfs:label "options" ; + rdfs:comment "The feature used to provide options to an instance." . + +opts:requiredOption + a rdf:Property , + owl:ObjectProperty ; + rdfs:range rdf:Property ; + rdfs:label "required option" ; + rdfs:comment "An option required by the instance to function at all." . + +opts:supportedOption + a rdf:Property , + owl:ObjectProperty ; + rdfs:range rdf:Property ; + rdfs:label "supported option" ; + rdfs:comment "An option supported or by the instance." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,68 @@ +/* + Copyright 2012-2016 David Robillard + + 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. +*/ + +#ifndef LV2_PARAMETERS_H +#define LV2_PARAMETERS_H + +/** + @defgroup parameters Parameters + @ingroup lv2 + + Common parameters for audio processing. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_PARAMETERS_URI "http://lv2plug.in/ns/ext/parameters" ///< http://lv2plug.in/ns/ext/parameters +#define LV2_PARAMETERS_PREFIX LV2_PARAMETERS_URI "#" ///< http://lv2plug.in/ns/ext/parameters# + +#define LV2_PARAMETERS__CompressorControls LV2_PARAMETERS_PREFIX "CompressorControls" ///< http://lv2plug.in/ns/ext/parameters#CompressorControls +#define LV2_PARAMETERS__ControlGroup LV2_PARAMETERS_PREFIX "ControlGroup" ///< http://lv2plug.in/ns/ext/parameters#ControlGroup +#define LV2_PARAMETERS__EnvelopeControls LV2_PARAMETERS_PREFIX "EnvelopeControls" ///< http://lv2plug.in/ns/ext/parameters#EnvelopeControls +#define LV2_PARAMETERS__FilterControls LV2_PARAMETERS_PREFIX "FilterControls" ///< http://lv2plug.in/ns/ext/parameters#FilterControls +#define LV2_PARAMETERS__OscillatorControls LV2_PARAMETERS_PREFIX "OscillatorControls" ///< http://lv2plug.in/ns/ext/parameters#OscillatorControls +#define LV2_PARAMETERS__amplitude LV2_PARAMETERS_PREFIX "amplitude" ///< http://lv2plug.in/ns/ext/parameters#amplitude +#define LV2_PARAMETERS__attack LV2_PARAMETERS_PREFIX "attack" ///< http://lv2plug.in/ns/ext/parameters#attack +#define LV2_PARAMETERS__bypass LV2_PARAMETERS_PREFIX "bypass" ///< http://lv2plug.in/ns/ext/parameters#bypass +#define LV2_PARAMETERS__cutoffFrequency LV2_PARAMETERS_PREFIX "cutoffFrequency" ///< http://lv2plug.in/ns/ext/parameters#cutoffFrequency +#define LV2_PARAMETERS__decay LV2_PARAMETERS_PREFIX "decay" ///< http://lv2plug.in/ns/ext/parameters#decay +#define LV2_PARAMETERS__delay LV2_PARAMETERS_PREFIX "delay" ///< http://lv2plug.in/ns/ext/parameters#delay +#define LV2_PARAMETERS__dryLevel LV2_PARAMETERS_PREFIX "dryLevel" ///< http://lv2plug.in/ns/ext/parameters#dryLevel +#define LV2_PARAMETERS__frequency LV2_PARAMETERS_PREFIX "frequency" ///< http://lv2plug.in/ns/ext/parameters#frequency +#define LV2_PARAMETERS__gain LV2_PARAMETERS_PREFIX "gain" ///< http://lv2plug.in/ns/ext/parameters#gain +#define LV2_PARAMETERS__hold LV2_PARAMETERS_PREFIX "hold" ///< http://lv2plug.in/ns/ext/parameters#hold +#define LV2_PARAMETERS__pulseWidth LV2_PARAMETERS_PREFIX "pulseWidth" ///< http://lv2plug.in/ns/ext/parameters#pulseWidth +#define LV2_PARAMETERS__ratio LV2_PARAMETERS_PREFIX "ratio" ///< http://lv2plug.in/ns/ext/parameters#ratio +#define LV2_PARAMETERS__release LV2_PARAMETERS_PREFIX "release" ///< http://lv2plug.in/ns/ext/parameters#release +#define LV2_PARAMETERS__resonance LV2_PARAMETERS_PREFIX "resonance" ///< http://lv2plug.in/ns/ext/parameters#resonance +#define LV2_PARAMETERS__sampleRate LV2_PARAMETERS_PREFIX "sampleRate" ///< http://lv2plug.in/ns/ext/parameters#sampleRate +#define LV2_PARAMETERS__sustain LV2_PARAMETERS_PREFIX "sustain" ///< http://lv2plug.in/ns/ext/parameters#sustain +#define LV2_PARAMETERS__threshold LV2_PARAMETERS_PREFIX "threshold" ///< http://lv2plug.in/ns/ext/parameters#threshold +#define LV2_PARAMETERS__waveform LV2_PARAMETERS_PREFIX "waveform" ///< http://lv2plug.in/ns/ext/parameters#waveform +#define LV2_PARAMETERS__wetDryRatio LV2_PARAMETERS_PREFIX "wetDryRatio" ///< http://lv2plug.in/ns/ext/parameters#wetDryRatio +#define LV2_PARAMETERS__wetLevel LV2_PARAMETERS_PREFIX "wetLevel" ///< http://lv2plug.in/ns/ext/parameters#wetLevel + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_PARAMETERS_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,75 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix param: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Parameters" ; + doap:release [ + doap:revision "1.4" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add range to parameters so hosts know how to control them." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add param:sampleRate." + ] , [ + rdfs:label "Add parameters.h of URI defines for convenience." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + doap:created "2009-00-00" ; + doap:shortdesc "Common parameters for audio processing." ; + doap:maintainer ; + doap:developer ; + lv2:documentation """ + +This is a vocabulary for parameters that are common in audio processing +software. A parameter is purely a metadata concept, unrelated to any +particular code mechanism. Parameters are used to assign meaning to controls +(for example, using lv2:designation for ports) so they can be used more +intelligently or presented to the user more efficiently. + +"""^^lv2:Markdown . + +param:wetDryRatio + a lv2:Parameter ; + rdfs:label "wet/dry ratio" ; + lv2:documentation """ + +The ratio between processed and bypass components in output signal. The dry +and wet percentages can be calculated from the following equations: + + :::c + dry = (wetDryRatio.maximum - wetDryRatio.value) / wetDryRatio.maximum + wet = wetDryRatio.value / wetDryRatio.maximum + +Typically, maximum value of 1 or 100 and minimum value of 0 should be used. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,202 @@ +@prefix atom: . +@prefix lv2: . +@prefix owl: . +@prefix param: . +@prefix pg: . +@prefix rdf: . +@prefix rdfs: . +@prefix units: . + + + a owl:Ontology ; + rdfs:label "LV2 Parameters" ; + rdfs:comment "Common parameters for audio processing." ; + rdfs:seeAlso . + +param:ControlGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Control Group" ; + rdfs:comment "A group representing a set of associated controls." . + +param:amplitude + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "amplitude" ; + rdfs:comment "An amplitude as a factor, where 0 is silent and 1 is unity." . + +param:attack + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "attack" ; + rdfs:comment "The duration of an envelope attack stage." . + +param:cutoffFrequency + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "cutoff frequency" ; + rdfs:comment "The cutoff frequency, typically in Hz, for a filter." . + +param:decay + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "decay" ; + rdfs:comment "The duration of an envelope decay stage." . + +param:delay + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "delay" ; + rdfs:comment "The duration of an envelope delay stage." . + +param:frequency + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "frequency" ; + rdfs:comment "A frequency, typically in Hz." . + +param:hold + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "hold" ; + rdfs:comment "The duration of an envelope hold stage." . + +param:pulseWidth + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "pulse width" ; + rdfs:comment "The width of a pulse of a rectangular waveform." . + +param:ratio + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "ratio" ; + rdfs:comment "Compression ratio." . + +param:release + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "release" ; + rdfs:comment "The duration of an envelope release stage." . + +param:resonance + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "resonance" ; + rdfs:comment "The resonance of a filter." . + +param:sustain + a lv2:Parameter ; + rdfs:label "sustain" ; + rdfs:range atom:Float ; + rdfs:comment "The level of an envelope sustain stage as a factor." . + +param:threshold + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "threshold" ; + rdfs:comment "Compression threshold." . + +param:waveform + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "waveform" ; + rdfs:comment """The waveform "fader" for oscillators or modulators that have several.""" . + +param:gain + a lv2:Parameter ; + rdfs:range atom:Float ; + lv2:default 0.0 ; + lv2:minimum -20.0 ; + lv2:maximum 20.0 ; + units:unit units:db ; + rdfs:label "gain" ; + rdfs:comment "Gain in decibels." . + +param:wetDryRatio + a lv2:Parameter ; + rdfs:label "wet/dry ratio" ; + rdfs:comment "The ratio between processed and bypassed levels in the output." . + +param:wetLevel + a lv2:Parameter ; + rdfs:label "wet level" ; + rdfs:comment "The level of the processed component of a signal." . + +param:dryLevel + a lv2:Parameter ; + rdfs:label "dry level" ; + rdfs:comment "The level of the unprocessed component of a signal." . + +param:bypass + a lv2:Parameter ; + rdfs:label "bypass" ; + rdfs:comment "A boolean parameter that disables processing if true." . + +param:sampleRate + a lv2:Parameter ; + rdfs:label "sample rate" ; + rdfs:comment "A sample rate in Hz." . + +param:EnvelopeControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Envelope Controls" ; + rdfs:comment "Typical controls for a DAHDSR envelope." ; + pg:element [ + lv2:index 0 ; + lv2:designation param:delay + ] , [ + lv2:index 1 ; + lv2:designation param:attack + ] , [ + lv2:index 2 ; + lv2:designation param:hold + ] , [ + lv2:index 3 ; + lv2:designation param:decay + ] , [ + lv2:index 4 ; + lv2:designation param:sustain + ] , [ + lv2:index 5 ; + lv2:designation param:release + ] . + +param:OscillatorControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Oscillator Controls" ; + rdfs:comment "Typical controls for an oscillator." ; + pg:element [ + lv2:designation param:frequency + ] , [ + lv2:designation param:amplitude + ] , [ + lv2:designation param:waveform + ] , [ + lv2:designation param:pulseWidth + ] . + +param:FilterControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Filter Controls" ; + rdfs:comment "Typical controls for a filter." ; + pg:element [ + lv2:designation param:cutoffFrequency + ] , [ + lv2:designation param:resonance + ] . + +param:CompressorControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Compressor Controls" ; + rdfs:comment "Typical controls for a compressor." ; + pg:element [ + lv2:designation param:threshold + ] , [ + lv2:designation param:ratio + ] . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 8 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,73 @@ +/* + Copyright 2012-2016 David Robillard + + 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. +*/ + +#ifndef LV2_PATCH_H +#define LV2_PATCH_H + +/** + @defgroup patch Patch + @ingroup lv2 + + Messages for accessing and manipulating properties. + + Note the patch extension is purely data, this header merely defines URIs for + convenience. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_PATCH_URI "http://lv2plug.in/ns/ext/patch" ///< http://lv2plug.in/ns/ext/patch +#define LV2_PATCH_PREFIX LV2_PATCH_URI "#" ///< http://lv2plug.in/ns/ext/patch# + +#define LV2_PATCH__Ack LV2_PATCH_PREFIX "Ack" ///< http://lv2plug.in/ns/ext/patch#Ack +#define LV2_PATCH__Delete LV2_PATCH_PREFIX "Delete" ///< http://lv2plug.in/ns/ext/patch#Delete +#define LV2_PATCH__Copy LV2_PATCH_PREFIX "Copy" ///< http://lv2plug.in/ns/ext/patch#Copy +#define LV2_PATCH__Error LV2_PATCH_PREFIX "Error" ///< http://lv2plug.in/ns/ext/patch#Error +#define LV2_PATCH__Get LV2_PATCH_PREFIX "Get" ///< http://lv2plug.in/ns/ext/patch#Get +#define LV2_PATCH__Message LV2_PATCH_PREFIX "Message" ///< http://lv2plug.in/ns/ext/patch#Message +#define LV2_PATCH__Move LV2_PATCH_PREFIX "Move" ///< http://lv2plug.in/ns/ext/patch#Move +#define LV2_PATCH__Patch LV2_PATCH_PREFIX "Patch" ///< http://lv2plug.in/ns/ext/patch#Patch +#define LV2_PATCH__Post LV2_PATCH_PREFIX "Post" ///< http://lv2plug.in/ns/ext/patch#Post +#define LV2_PATCH__Put LV2_PATCH_PREFIX "Put" ///< http://lv2plug.in/ns/ext/patch#Put +#define LV2_PATCH__Request LV2_PATCH_PREFIX "Request" ///< http://lv2plug.in/ns/ext/patch#Request +#define LV2_PATCH__Response LV2_PATCH_PREFIX "Response" ///< http://lv2plug.in/ns/ext/patch#Response +#define LV2_PATCH__Set LV2_PATCH_PREFIX "Set" ///< http://lv2plug.in/ns/ext/patch#Set +#define LV2_PATCH__accept LV2_PATCH_PREFIX "accept" ///< http://lv2plug.in/ns/ext/patch#accept +#define LV2_PATCH__add LV2_PATCH_PREFIX "add" ///< http://lv2plug.in/ns/ext/patch#add +#define LV2_PATCH__body LV2_PATCH_PREFIX "body" ///< http://lv2plug.in/ns/ext/patch#body +#define LV2_PATCH__context LV2_PATCH_PREFIX "context" ///< http://lv2plug.in/ns/ext/patch#context +#define LV2_PATCH__destination LV2_PATCH_PREFIX "destination" ///< http://lv2plug.in/ns/ext/patch#destination +#define LV2_PATCH__property LV2_PATCH_PREFIX "property" ///< http://lv2plug.in/ns/ext/patch#property +#define LV2_PATCH__readable LV2_PATCH_PREFIX "readable" ///< http://lv2plug.in/ns/ext/patch#readable +#define LV2_PATCH__remove LV2_PATCH_PREFIX "remove" ///< http://lv2plug.in/ns/ext/patch#remove +#define LV2_PATCH__request LV2_PATCH_PREFIX "request" ///< http://lv2plug.in/ns/ext/patch#request +#define LV2_PATCH__subject LV2_PATCH_PREFIX "subject" ///< http://lv2plug.in/ns/ext/patch#subject +#define LV2_PATCH__sequenceNumber LV2_PATCH_PREFIX "sequenceNumber" ///< http://lv2plug.in/ns/ext/patch#sequenceNumber +#define LV2_PATCH__value LV2_PATCH_PREFIX "value" ///< http://lv2plug.in/ns/ext/patch#value +#define LV2_PATCH__wildcard LV2_PATCH_PREFIX "wildcard" ///< http://lv2plug.in/ns/ext/patch#wildcard +#define LV2_PATCH__writable LV2_PATCH_PREFIX "writable" ///< http://lv2plug.in/ns/ext/patch#writable + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_PATCH_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,374 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix patch: . +@prefix rdfs: . + + + a doap:Project ; + doap:created "2012-02-09" ; + doap:license ; + doap:developer ; + doap:name "LV2 Patch" ; + doap:shortdesc "A protocol for accessing and manipulating properties." ; + doap:release [ + doap:revision "2.8" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect type of patch:sequenceNumber." + ] + ] + ] , [ + doap:revision "2.6" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add patch:accept property." + ] , [ + rdfs:label "Add patch:context property." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Define patch:Get with no subject to implicitly apply to reciever. This can be used by UIs to get an initial description of a plugin." + ] , [ + rdfs:label "Add patch:Copy method." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add patch:sequenceNumber for associating replies with requests." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2013-01-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make patch:Set a compact message for setting one property." + ] , [ + rdfs:label "Add patch:readable and patch:writable for describing available properties." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This is a vocabulary for messages that access and manipulate properties. +It can be used as a dynamic control interface for plugins, +or anything else with a property-based model. + +The key underlying concept here is to control things by manipulating arbitrary properties, +rather than by calling application-specific methods. +This allows implementations to understand what messages do +(at least in a mechanical sense), +which makes things like caching, proxying, or undo relatively straightforward to implement. +Note, however, that this is only conceptual: +there is no requirement to implement a general property store. +Typically, a plugin will understand a fixed set of properties that represent its parameters or other internal state, and ignore everything else. + +This protocol is syntax-agnostic, +and [homoiconic](https://en.wikipedia.org/wiki/Homoiconicity) +in the sense that the messages use the same format as the data they manipulate. +In particular, messages can be serialised as a binary [Object](atom.html#Object) for realtime plugin control, +or as Turtle for saving to a file, +sending over a network, +printing for debugging purposes, +and so on. + +This specification only defines a semantic protocol, +there is no corresponding API. +It can be used with the [Atom](atom.html) extension to control plugins which support message-based parameters as defined by the [Parameters](parameters.html) extension. + +For example, if a plugin defines a `eg:volume` parameter, it can be controlled by the host by sending a patch:Set message to the plugin instance: + + :::turtle + [ + a patch:Set ; + patch:property eg:volume ; + patch:value 11.0 ; + ] + +Similarly, the host could get the current value for this parameter by sending a patch:Get message: + + :::turtle + [ + a patch:Get ; + patch:property eg:volume ; + ] + +The plugin would then respond with the same patch:Set message as above. +In this case, the plugin instance is implicitly the patch:subject, +but a specific subject can also be given for deeper control. + +"""^^lv2:Markdown . + +patch:Copy + lv2:documentation """ + +After this, the destination has the same description as the subject, +and the subject is unchanged. + +It is an error if the subject does not exist, +or if the destination already exists. + +Multiple subjects may be given if the destination is a container, +but the semantics of this case are application-defined. + +"""^^lv2:Markdown . + +patch:Get + lv2:documentation """ + +If a patch:property is given, +then the receiver should respond with a patch:Set message that gives only that property. + +Otherwise, it should respond with a [concise bounded description](http://www.w3.org/Submission/CBD/) in a patch:Put message, +that is, a description that recursively includes any blank node values. + +If a patch:subject is given, then the response should have the same subject. +If no subject is given, then the receiver is implicitly the subject. + +If a patch:request node or a patch:sequenceNumber is given, +then the response should be a patch:Response and have the same property. +If neither is given, then the receiver can respond with a simple patch:Put message. +For example: + + :::turtle + [] + a patch:Get ; + patch:subject eg:something . + +Could result in: + + :::turtle + [] + a patch:Put ; + patch:subject eg:something ; + patch:body [ + eg:name "Something" ; + eg:ratio 1.6180339887 ; + ] . + +"""^^lv2:Markdown . + +patch:Insert + lv2:documentation """ + +If the subject does not exist, it is created. If the subject does already +exist, it is added to. + +This request only adds properties, it never removes them. The user must take +care that multiple values are not set for properties which should only have +one. + +"""^^lv2:Markdown . + +patch:Message + lv2:documentation """ + +This is an abstract base class for all patch messages. Concrete messages are +either a patch:Request or a patch:Response. + +"""^^lv2:Markdown . + +patch:Move + lv2:documentation """ + +After this, the destination has the description that the subject had, and the +subject no longer exists. + +It is an error if the subject does not exist, or if the destination already +exists. + +"""^^lv2:Markdown . + +patch:Patch + lv2:documentation """ + +This method always has at least one subject, and exactly one patch:add and +patch:remove property. The value of patch:add and patch:remove are nodes which +have the properties to add or remove from the subject(s), respectively. The +special value patch:wildcard may be used as the value of a remove property to +remove all properties with the given predicate. For example: + + :::turtle + [] + a patch:Patch ; + patch:subject ; + patch:add [ + eg:name "New name" ; + eg:age 42 ; + ] ; + patch:remove [ + eg:name "Old name" ; + eg:age patch:wildcard ; # Remove all old eg:age properties + ] . + +"""^^lv2:Markdown . + +patch:Put + lv2:documentation """ + +If the subject does not already exist, it is created. If the subject does +already exist, the patch:body is considered an updated version of it, and the +previous version is replaced. + + :::turtle + [] + a patch:Put ; + patch:subject ; + patch:body [ + eg:name "New name" ; + eg:age 42 ; + ] . + +"""^^lv2:Markdown . + +patch:Request + a rdfs:Class ; + rdfs:label "Request" ; + rdfs:subClassOf patch:Message ; + lv2:documentation """ + +A request may have a patch:subject property, which specifies the resource that +the request applies to. The subject may be omitted in contexts where it is +implicit, for example if the recipient is the subject. + +"""^^lv2:Markdown . + +patch:Set + lv2:documentation """ + +This is equivalent to a patch:Patch which removes _all_ pre-existing values for +the property before setting the new value. For example: + + :::turtle + [] + a patch:Set ; + patch:subject ; + patch:property eg:name ; + patch:value "New name" . + +Which is equivalent to: + + :::turtle + [] + a patch:Patch ; + patch:subject ; + patch:add [ + eg:name "New name" ; + ] ; + patch:remove [ + eg:name patch:wildcard ; + ] . + +"""^^lv2:Markdown . + +patch:body + lv2:documentation """ + +The details of this property's value depend on the type of message it is a part +of. + +"""^^lv2:Markdown . + +patch:context + lv2:documentation """ + +For example, a plugin may have a special context for ephemeral properties which +are only relevant during the lifetime of the instance and should not be saved +in state. + +The specific uses for contexts are application specific. However, the context +MUST be a URI, and can be interpreted as the ID of a data model where +properties should be stored. Implementations MAY have special support for +contexts, for example by storing in a quad store or serializing to a format +that supports multiple RDF graphs such as TriG. + +"""^^lv2:Markdown . + +patch:readable + lv2:documentation """ + +See the similar patch:writable property for details. + +"""^^lv2:Markdown . + +patch:request + lv2:documentation """ + +This can be used if referring directly to the URI or blank node ID of the +request is possible. Otherwise, use patch:sequenceNumber. + +"""^^lv2:Markdown . + +patch:sequenceNumber + lv2:documentation """ + +This property is used to associate replies with requests when it is not +feasible to refer to request URIs with patch:request. A patch:Response with a +given sequence number is the reply to the previously send patch:Request with +the same sequence number. + +The special sequence number 0 means that no reply is desired. + +"""^^lv2:Markdown . + +patch:wildcard + lv2:documentation """ + +This makes it possible to describe the removal of all values for a given +property. + +"""^^lv2:Markdown . + +patch:writable + lv2:documentation """ + +This is used to list properties that can be changed, for example to allow user +interfaces to present appropriate controls. For example: + + :::turtle + @prefix eg: . + @prefix rdf: . + @prefix rdfs: . + @prefix xsd: . + + eg:title + a rdf:Property ; + rdfs:label "title" ; + rdfs:range xsd:string . + + eg:plugin + patch:writable eg:title . + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,251 @@ +@prefix foaf: . +@prefix owl: . +@prefix patch: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:seeAlso , + ; + rdfs:label "LV2 Patch" ; + rdfs:comment "A protocol for accessing and manipulating properties." . + +patch:Ack + a rdfs:Class ; + rdfs:subClassOf patch:Response ; + rdfs:label "Ack" ; + rdfs:comment "An acknowledgement that a request was successful." . + +patch:Copy + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Copy" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty patch:subject + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:destination + ] ; + rdfs:comment "A request to copy the patch:subject to the patch:destination." . + +patch:Delete + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Delete" ; + rdfs:comment "Request that the patch:subject or subjects be deleted." . + +patch:Error + a rdfs:Class ; + rdfs:subClassOf patch:Response ; + rdfs:label "Error" ; + rdfs:comment "A response indicating an error processing a request." . + +patch:Get + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Get" ; + rdfs:comment "A request for a description of the patch:subject." . + +patch:Insert + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Insert" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:subject + ] ; + rdfs:comment "A request to insert a patch:body into the patch:subject." . + +patch:Message + a rdfs:Class ; + rdfs:label "Patch Message" ; + rdfs:comment "A patch message." . + +patch:Move + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Move" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:subject + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:destination + ] ; + rdfs:comment "A request to move the patch:subject to the patch:destination." . + +patch:Patch + a rdfs:Class ; + rdfs:subClassOf patch:Request , + [ + a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty patch:subject + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:add + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:remove + ] ; + rdfs:label "Patch" ; + rdfs:comment "A request to add and/or remove properties of the patch:subject." . + +patch:Put + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Put" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:subject + ] ; + rdfs:comment "A request to put the patch:body as the patch:subject." . + +patch:Request + a rdfs:Class ; + rdfs:label "Request" ; + rdfs:subClassOf patch:Message ; + rdfs:comment "A patch request message." . + +patch:Response + a rdfs:Class ; + rdfs:subClassOf patch:Message ; + rdfs:label "Response" ; + rdfs:comment "A response to a patch:Request." . + +patch:Set + a rdfs:Class ; + rdfs:label "Set" ; + rdfs:subClassOf patch:Request , + [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:property + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:value + ] ; + rdfs:comment "A compact request to set a property to a value." . + +patch:accept + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "accept" ; + rdfs:domain patch:Request ; + rdfs:range rdfs:Class ; + rdfs:comment "An accepted type for a response." . + +patch:add + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Patch ; + rdfs:range rdfs:Resource ; + rdfs:label "add" ; + rdfs:comment "The properties to add to the subject." . + +patch:body + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Message ; + rdfs:label "body" ; + rdfs:comment "The body of a message." . + +patch:context + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain patch:Message ; + rdfs:label "context" ; + rdfs:comment "The context of properties in this message." . + +patch:destination + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Message ; + rdfs:label "destination" ; + rdfs:comment "The destination to move the patch:subject to." . + +patch:property + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "property" ; + rdfs:domain patch:Message ; + rdfs:range rdf:Property ; + rdfs:comment "The property for a patch:Set or patch:Get message." . + +patch:readable + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "readable" ; + rdfs:range rdf:Property ; + rdfs:comment "A property that can be read with a patch:Get message." . + +patch:remove + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:label "remove" ; + rdfs:domain patch:Patch ; + rdfs:range rdfs:Resource ; + rdfs:comment "The properties to remove from the subject." . + +patch:request + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:label "request" ; + rdfs:domain patch:Response ; + rdfs:range patch:Request ; + rdfs:comment "The request this is a response to." . + +patch:sequenceNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "sequence number" ; + rdfs:domain patch:Message ; + rdfs:range xsd:int ; + rdfs:comment "The sequence number of a request or response." . + +patch:subject + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Message ; + rdfs:label "subject" ; + rdfs:comment "The subject this message applies to." . + +patch:value + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "value" ; + rdfs:domain patch:Set ; + rdfs:range rdf:Property ; + rdfs:comment "The value of a property in a patch:Set message." . + +patch:wildcard + a rdfs:Resource ; + rdfs:label "wildcard" ; + rdfs:comment "A wildcard that matches any resource." . + +patch:writable + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "writable" ; + rdfs:range rdf:Property ; + rdfs:comment "A property that can be set with a patch:Set or patch:Patch message." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,77 @@ +/* + Copyright 2012-2016 David Robillard + + 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. +*/ + +#ifndef LV2_PORT_GROUPS_H +#define LV2_PORT_GROUPS_H + +/** + @defgroup port-groups Port Groups + @ingroup lv2 + + Multi-channel groups of LV2 ports. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_PORT_GROUPS_URI "http://lv2plug.in/ns/ext/port-groups" ///< http://lv2plug.in/ns/ext/port-groups +#define LV2_PORT_GROUPS_PREFIX LV2_PORT_GROUPS_URI "#" ///< http://lv2plug.in/ns/ext/port-groups# + +#define LV2_PORT_GROUPS__DiscreteGroup LV2_PORT_GROUPS_PREFIX "DiscreteGroup" ///< http://lv2plug.in/ns/ext/port-groups#DiscreteGroup +#define LV2_PORT_GROUPS__Element LV2_PORT_GROUPS_PREFIX "Element" ///< http://lv2plug.in/ns/ext/port-groups#Element +#define LV2_PORT_GROUPS__FivePointOneGroup LV2_PORT_GROUPS_PREFIX "FivePointOneGroup" ///< http://lv2plug.in/ns/ext/port-groups#FivePointOneGroup +#define LV2_PORT_GROUPS__FivePointZeroGroup LV2_PORT_GROUPS_PREFIX "FivePointZeroGroup" ///< http://lv2plug.in/ns/ext/port-groups#FivePointZeroGroup +#define LV2_PORT_GROUPS__FourPointZeroGroup LV2_PORT_GROUPS_PREFIX "FourPointZeroGroup" ///< http://lv2plug.in/ns/ext/port-groups#FourPointZeroGroup +#define LV2_PORT_GROUPS__Group LV2_PORT_GROUPS_PREFIX "Group" ///< http://lv2plug.in/ns/ext/port-groups#Group +#define LV2_PORT_GROUPS__InputGroup LV2_PORT_GROUPS_PREFIX "InputGroup" ///< http://lv2plug.in/ns/ext/port-groups#InputGroup +#define LV2_PORT_GROUPS__MidSideGroup LV2_PORT_GROUPS_PREFIX "MidSideGroup" ///< http://lv2plug.in/ns/ext/port-groups#MidSideGroup +#define LV2_PORT_GROUPS__MonoGroup LV2_PORT_GROUPS_PREFIX "MonoGroup" ///< http://lv2plug.in/ns/ext/port-groups#MonoGroup +#define LV2_PORT_GROUPS__OutputGroup LV2_PORT_GROUPS_PREFIX "OutputGroup" ///< http://lv2plug.in/ns/ext/port-groups#OutputGroup +#define LV2_PORT_GROUPS__SevenPointOneGroup LV2_PORT_GROUPS_PREFIX "SevenPointOneGroup" ///< http://lv2plug.in/ns/ext/port-groups#SevenPointOneGroup +#define LV2_PORT_GROUPS__SevenPointOneWideGroup LV2_PORT_GROUPS_PREFIX "SevenPointOneWideGroup" ///< http://lv2plug.in/ns/ext/port-groups#SevenPointOneWideGroup +#define LV2_PORT_GROUPS__SixPointOneGroup LV2_PORT_GROUPS_PREFIX "SixPointOneGroup" ///< http://lv2plug.in/ns/ext/port-groups#SixPointOneGroup +#define LV2_PORT_GROUPS__StereoGroup LV2_PORT_GROUPS_PREFIX "StereoGroup" ///< http://lv2plug.in/ns/ext/port-groups#StereoGroup +#define LV2_PORT_GROUPS__ThreePointZeroGroup LV2_PORT_GROUPS_PREFIX "ThreePointZeroGroup" ///< http://lv2plug.in/ns/ext/port-groups#ThreePointZeroGroup +#define LV2_PORT_GROUPS__center LV2_PORT_GROUPS_PREFIX "center" ///< http://lv2plug.in/ns/ext/port-groups#center +#define LV2_PORT_GROUPS__centerLeft LV2_PORT_GROUPS_PREFIX "centerLeft" ///< http://lv2plug.in/ns/ext/port-groups#centerLeft +#define LV2_PORT_GROUPS__centerRight LV2_PORT_GROUPS_PREFIX "centerRight" ///< http://lv2plug.in/ns/ext/port-groups#centerRight +#define LV2_PORT_GROUPS__element LV2_PORT_GROUPS_PREFIX "element" ///< http://lv2plug.in/ns/ext/port-groups#element +#define LV2_PORT_GROUPS__group LV2_PORT_GROUPS_PREFIX "group" ///< http://lv2plug.in/ns/ext/port-groups#group +#define LV2_PORT_GROUPS__left LV2_PORT_GROUPS_PREFIX "left" ///< http://lv2plug.in/ns/ext/port-groups#left +#define LV2_PORT_GROUPS__lowFrequencyEffects LV2_PORT_GROUPS_PREFIX "lowFrequencyEffects" ///< http://lv2plug.in/ns/ext/port-groups#lowFrequencyEffects +#define LV2_PORT_GROUPS__mainInput LV2_PORT_GROUPS_PREFIX "mainInput" ///< http://lv2plug.in/ns/ext/port-groups#mainInput +#define LV2_PORT_GROUPS__mainOutput LV2_PORT_GROUPS_PREFIX "mainOutput" ///< http://lv2plug.in/ns/ext/port-groups#mainOutput +#define LV2_PORT_GROUPS__rearCenter LV2_PORT_GROUPS_PREFIX "rearCenter" ///< http://lv2plug.in/ns/ext/port-groups#rearCenter +#define LV2_PORT_GROUPS__rearLeft LV2_PORT_GROUPS_PREFIX "rearLeft" ///< http://lv2plug.in/ns/ext/port-groups#rearLeft +#define LV2_PORT_GROUPS__rearRight LV2_PORT_GROUPS_PREFIX "rearRight" ///< http://lv2plug.in/ns/ext/port-groups#rearRight +#define LV2_PORT_GROUPS__right LV2_PORT_GROUPS_PREFIX "right" ///< http://lv2plug.in/ns/ext/port-groups#right +#define LV2_PORT_GROUPS__side LV2_PORT_GROUPS_PREFIX "side" ///< http://lv2plug.in/ns/ext/port-groups#side +#define LV2_PORT_GROUPS__sideChainOf LV2_PORT_GROUPS_PREFIX "sideChainOf" ///< http://lv2plug.in/ns/ext/port-groups#sideChainOf +#define LV2_PORT_GROUPS__sideLeft LV2_PORT_GROUPS_PREFIX "sideLeft" ///< http://lv2plug.in/ns/ext/port-groups#sideLeft +#define LV2_PORT_GROUPS__sideRight LV2_PORT_GROUPS_PREFIX "sideRight" ///< http://lv2plug.in/ns/ext/port-groups#sideRight +#define LV2_PORT_GROUPS__source LV2_PORT_GROUPS_PREFIX "source" ///< http://lv2plug.in/ns/ext/port-groups#source +#define LV2_PORT_GROUPS__subGroupOf LV2_PORT_GROUPS_PREFIX "subGroupOf" ///< http://lv2plug.in/ns/ext/port-groups#subGroupOf + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_PORT_GROUPS_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,144 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pg: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Port Groups" ; + doap:shortdesc "Multi-channel groups of LV2 ports." ; + doap:created "2008-00-00" ; + doap:developer , + ; + doap:release [ + doap:revision "1.4" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Replace broken links with detailed Ambisonic channel descriptions." + ] , [ + rdfs:label "Remove incorrect type of pg:letterCode." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] . + +pg:Group + lv2:documentation """ + +A group logically combines ports which should be considered part of the same +stream. For example, two audio ports in a group may form a stereo stream. + +Like ports, groups have a lv2:symbol that is unique within the context of the +plugin, where group symbols and port symbols reside in the same namespace. In +other words, a group on a plugin MUST NOT have the same symbol as any other +group or port on that plugin. This makes it possible to uniquely reference a +port or group on a plugin with a single identifier and no context. + +Group definitions may be shared across plugins for brevity. For example, a +plugin collection may define a single URI for a pg:StereoGroup with the symbol +"input" and use it in many plugins. + +"""^^lv2:Markdown . + +pg:sideChainOf + lv2:documentation """ + +Indicates that this port or group should be considered a "side chain" of some +other port or group. The precise definition of "side chain" depends on the +plugin, but in general this group should be considered a modifier to some other +group, rather than an independent input itself. + +"""^^lv2:Markdown . + +pg:subGroupOf + lv2:documentation """ + +Indicates that this group is a child of another group. This property has no +meaning with respect to plugin execution, but the host may find this +information useful to provide a better user interface. Note that being a +sub-group does not relax the restriction that the group MUST have a unique +symbol with respect to the plugin. + +"""^^lv2:Markdown . + +pg:source + lv2:documentation """ + +Indicates that this port or group should be considered the "result" of some +other port or group. This property only makes sense on groups with outputs +when the source is a group with inputs. This can be used to convey a +relationship between corresponding input and output groups with different +types, for example in a mono to stereo plugin. + +"""^^lv2:Markdown . + +pg:mainInput + lv2:documentation """ + +Indicates that this group should be considered the "main" input, i.e. the +primary task is processing the signal in this group. A plugin MUST NOT have +more than one pg:mainInput property. + +"""^^lv2:Markdown . + +pg:mainOutput + lv2:documentation """ + +Indicates that this group should be considered the "main" output. The main +output group SHOULD have the main input group as a pg:source. + +"""^^lv2:Markdown . + +pg:group + lv2:documentation """ + +Indicates that this port is a part of a group of ports on the plugin. The port +should also have an lv2:designation property to define its designation within +that group. + +"""^^lv2:Markdown . + +pg:DiscreteGroup + lv2:documentation """ + +These groups are divided into channels where each represents a particular +speaker location. The position of sound in one of these groups depends on a +particular speaker configuration. + +"""^^lv2:Markdown . + +pg:AmbisonicGroup + lv2:documentation """ + +These groups are divided into channels which together represent a position in +an abstract n-dimensional space. The position of sound in one of these groups +does not depend on a particular speaker configuration; a decoder can be used to +convert an ambisonic stream for any speaker configuration. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,807 @@ +@prefix lv2: . +@prefix owl: . +@prefix pg: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Port Groups" ; + rdfs:comment "Multi-channel groups of LV2 ports." ; + rdfs:seeAlso . + +pg:Group + a rdfs:Class ; + rdfs:label "Port Group" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:symbol ; + owl:cardinality 1 ; + rdfs:comment "A Group MUST have exactly one string lv2:symbol." + ] ; + rdfs:comment "A set of ports that are logicaly grouped together." . + +pg:InputGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Input Group" ; + rdfs:comment "A group which contains exclusively inputs." . + +pg:OutputGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Output Group" ; + rdfs:comment "A group which contains exclusively outputs." . + +pg:Element + a rdfs:Class ; + rdfs:label "Element" ; + rdfs:comment "An ordered element of a group." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:designation ; + owl:cardinality 1 ; + rdfs:comment "An element MUST have exactly one lv2:designation." + ] ; + rdfs:comment "An element of a group, with a designation and optional index." . + +pg:element + a rdf:Property , + owl:ObjectProperty ; + rdfs:range pg:Element ; + rdfs:label "element" ; + rdfs:comment "An element within a port group." . + +pg:sideChainOf + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "side-chain of" ; + rdfs:comment "Port or group is a side chain of another." . + +pg:subGroupOf + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain pg:Group ; + rdfs:range pg:Group ; + rdfs:label "sub-group of" ; + rdfs:comment "Group is a child of another group." . + +pg:source + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain pg:OutputGroup ; + rdfs:range pg:InputGroup ; + rdfs:label "source" ; + rdfs:comment "Port or group that this group is the output of." . + +pg:mainInput + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Plugin ; + rdfs:range pg:InputGroup ; + rdfs:label "main input" ; + rdfs:comment "Input group that is the primary input of the plugin." . + +pg:mainOutput + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Plugin ; + rdfs:range pg:OutputGroup ; + rdfs:label "main output" ; + rdfs:comment "Output group that is the primary output of the plugin." . + +pg:group + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Port ; + rdfs:range pg:Group ; + rdfs:label "group" ; + rdfs:comment "Group that this port is a part of." . + +pg:DiscreteGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Discrete Group" ; + rdfs:comment "A group of discrete channels." . + +pg:left + a lv2:Channel ; + rdfs:label "left" ; + rdfs:comment "The left channel of a stereo audio group." . + +pg:right + a lv2:Channel ; + rdfs:label "right" ; + rdfs:comment "The right channel of a stereo audio group." . + +pg:center + a lv2:Channel ; + rdfs:label "center" ; + rdfs:comment "The center channel of a discrete audio group." . + +pg:side + a lv2:Channel ; + rdfs:label "side" ; + rdfs:comment "The side channel of a mid-side audio group." . + +pg:centerLeft + a lv2:Channel ; + rdfs:label "center left" ; + rdfs:comment "The center-left channel of a 7.1 wide surround sound group." . + +pg:centerRight + a lv2:Channel ; + rdfs:label "center right" ; + rdfs:comment "The center-right channel of a 7.1 wide surround sound group." . + +pg:sideLeft + a lv2:Channel ; + rdfs:label "side left" ; + rdfs:comment "The side-left channel of a 6.1 or 7.1 surround sound group." . + +pg:sideRight + a lv2:Channel ; + rdfs:label "side right" ; + rdfs:comment "The side-right channel of a 6.1 or 7.1 surround sound group." . + +pg:rearLeft + a lv2:Channel ; + rdfs:label "rear left" ; + rdfs:comment "The rear-left channel of a surround sound group." . + +pg:rearRight + a lv2:Channel ; + rdfs:label "rear right" ; + rdfs:comment "The rear-right channel of a surround sound group." . + +pg:rearCenter + a lv2:Channel ; + rdfs:label "rear center" ; + rdfs:comment "The rear-center channel of a surround sound group." . + +pg:lowFrequencyEffects + a lv2:Channel ; + rdfs:label "low-frequency effects" ; + rdfs:comment "The LFE channel of a *.1 surround sound group." . + +pg:MonoGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Mono" ; + rdfs:comment "A single channel audio group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:center + ] . + +pg:StereoGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Stereo" ; + rdfs:comment "A 2-channel discrete stereo audio group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:right + ] . + +pg:MidSideGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Mid-Side Stereo" ; + rdfs:comment "A 2-channel mid-side stereo audio group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:center + ] , [ + lv2:index 1 ; + lv2:designation pg:side + ] . + +pg:ThreePointZeroGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "3.0 Surround" ; + rdfs:comment "A 3.0 discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:right + ] , [ + lv2:index 2 ; + lv2:designation pg:rearCenter + ] . + +pg:FourPointZeroGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "4.0 Surround" ; + rdfs:comment "A 4.0 (Quadraphonic) discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:rearCenter + ] . + +pg:FivePointZeroGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "5.0 Surround" ; + rdfs:comment "A 5.0 (3-2 stereo) discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:rearRight + ] . + +pg:FivePointOneGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "5.1 Surround" ; + rdfs:comment "A 5.1 (3-2 stereo with sub) discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:rearRight + ] , [ + lv2:index 5 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:SixPointOneGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "6.1 Surround" ; + rdfs:comment "A 6.1 discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:sideLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:sideRight + ] , [ + lv2:index 5 ; + lv2:designation pg:rearCenter + ] , [ + lv2:index 6 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:SevenPointOneGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "7.1 Surround" ; + rdfs:comment "A 7.1 discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:sideLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:sideRight + ] , [ + lv2:index 5 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 6 ; + lv2:designation pg:rearRight + ] , [ + lv2:index 7 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:SevenPointOneWideGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "7.1 Surround (Wide)" ; + rdfs:comment "A 7.1 wide discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:centerLeft + ] , [ + lv2:index 2 ; + lv2:designation pg:center + ] , [ + lv2:index 3 ; + lv2:designation pg:centerRight + ] , [ + lv2:index 4 ; + lv2:designation pg:right + ] , [ + lv2:index 5 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 6 ; + lv2:designation pg:rearRight + ] , [ + lv2:index 7 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:letterCode + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Channel ; + rdfs:range rdf:PlainLiteral ; + rdfs:label "ambisonic letter code" ; + rdfs:comment "The YuMa letter code for an Ambisonic channel." . + +pg:harmonicDegree + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Channel ; + rdfs:range xsd:integer ; + rdfs:label "harmonic degree" ; + rdfs:comment "The degree coefficient (l) of the spherical harmonic for an Ambisonic channel." . + +pg:harmonicIndex + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Channel ; + rdfs:range xsd:integer ; + rdfs:label "harmonic index" ; + rdfs:comment "The index coefficient (m) of the spherical harmonic for an Ambisonic channel." . + +pg:ACN0 + a lv2:Channel ; + pg:letterCode "W" ; + pg:harmonicDegree 0 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN0" ; + rdfs:comment "Ambisonic channel 0 (W): degree 0, index 0." . + +pg:ACN1 + a lv2:Channel ; + pg:letterCode "Y" ; + pg:harmonicDegree 1 ; + pg:harmonicIndex -1 ; + rdfs:label "ACN1" ; + rdfs:comment "Ambisonic channel 1 (Y): degree 1, index -1." . + +pg:ACN2 + a lv2:Channel ; + pg:letterCode "Z" ; + pg:harmonicDegree 1 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN2" ; + rdfs:comment "Ambisonic channel 2 (Z): degree 1, index 0." . + +pg:ACN3 + a lv2:Channel ; + pg:letterCode "X" ; + pg:harmonicDegree 1 ; + pg:harmonicIndex 1 ; + rdfs:label "ACN3" ; + rdfs:comment "Ambisonic channel 3 (X): degree 1, index 1." . + +pg:ACN4 + a lv2:Channel ; + pg:letterCode "V" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex -2 ; + rdfs:label "ACN4" ; + rdfs:comment "Ambisonic channel 4 (V): degree 2, index -2." . + +pg:ACN5 + a lv2:Channel ; + pg:letterCode "T" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex -1 ; + rdfs:label "ACN5" ; + rdfs:comment "Ambisonic channel 5 (T): degree 2, index -1." . + +pg:ACN6 + a lv2:Channel ; + pg:letterCode "R" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN6" ; + rdfs:comment "Ambisonic channel 6 (R): degree 2, index 0." . + +pg:ACN7 + a lv2:Channel ; + pg:letterCode "S" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex 1 ; + rdfs:label "ACN7" ; + rdfs:comment "Ambisonic channel 7 (S): degree 2, index 1." . + +pg:ACN8 + a lv2:Channel ; + pg:letterCode "U" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex 2 ; + rdfs:label "ACN8" ; + rdfs:comment "Ambisonic channel 8 (U): degree 2, index 2." . + +pg:ACN9 + a lv2:Channel ; + pg:letterCode "Q" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex -3 ; + rdfs:label "ACN9" ; + rdfs:comment "Ambisonic channel 9 (Q): degree 3, index -3." . + +pg:ACN10 + a lv2:Channel ; + pg:letterCode "O" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex -2 ; + rdfs:label "ACN10" ; + rdfs:comment "Ambisonic channel 10 (O): degree 3, index -2." . + +pg:ACN11 + a lv2:Channel ; + pg:letterCode "M" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex -1 ; + rdfs:label "ACN11" ; + rdfs:comment "Ambisonic channel 11 (M): degree 3, index -1." . + +pg:ACN12 + a lv2:Channel ; + pg:letterCode "K" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN12" ; + rdfs:comment "Ambisonic channel 12 (K): degree 3, index 0." . + +pg:ACN13 + a lv2:Channel ; + pg:letterCode "L" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 1 ; + rdfs:label "ACN13" ; + rdfs:comment "Ambisonic channel 13 (L): degree 3, index 1." . + +pg:ACN14 + a lv2:Channel ; + pg:letterCode "N" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 2 ; + rdfs:label "ACN14" ; + rdfs:comment "Ambisonic channel 14 (N): degree 3, index 2." . + +pg:ACN15 + a lv2:Channel ; + pg:letterCode "P" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 3 ; + rdfs:label "ACN15" ; + rdfs:comment "Ambisonic channel 15 (P): degree 3, index 3." . + +pg:AmbisonicGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Ambisonic Group" ; + rdfs:comment "A group of Ambisonic channels." . + +pg:AmbisonicBH1P0Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH1P0" ; + rdfs:comment "Ambisonic B stream of horizontal order 1 and peripheral order 0." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN3 + ] . + +pg:AmbisonicBH1P1Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH1P1" ; + rdfs:comment "Ambisonic B stream of horizontal order 1 and peripheral order 1." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] . + +pg:AmbisonicBH2P0Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH2P0" ; + rdfs:comment "Ambisonic B stream of horizontal order 2 and peripheral order 0." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN8 + ] . + +pg:AmbisonicBH2P1Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH2P1" ; + rdfs:comment "Ambisonic B stream of horizontal order 2 and peripheral order 1." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN8 + ] . + +pg:AmbisonicBH2P2Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH2P2" ; + rdfs:comment "Ambisonic B stream of horizontal order 2 and peripheral order 2." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN5 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN6 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN7 + ] , [ + lv2:index 8 ; + lv2:designation pg:ACN8 + ] . + +pg:AmbisonicBH3P0Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P0" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 0." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN15 + ] . + +pg:AmbisonicBH3P1Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P1" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 1." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN15 + ] . + +pg:AmbisonicBH3P2Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P2" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 2." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN5 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN6 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN7 + ] , [ + lv2:index 8 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 9 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 10 ; + lv2:designation pg:ACN15 + ] . + +pg:AmbisonicBH3P3Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P3" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 3." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN5 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN6 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN7 + ] , [ + lv2:index 8 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 9 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 10 ; + lv2:designation pg:ACN10 + ] , [ + lv2:index 11 ; + lv2:designation pg:ACN11 + ] , [ + lv2:index 12 ; + lv2:designation pg:ACN12 + ] , [ + lv2:index 13 ; + lv2:designation pg:ACN13 + ] , [ + lv2:index 14 ; + lv2:designation pg:ACN14 + ] , [ + lv2:index 15 ; + lv2:designation pg:ACN15 + ] . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,53 @@ +/* + Copyright 2012-2016 David Robillard + + 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. +*/ + +#ifndef LV2_PORT_PROPS_H +#define LV2_PORT_PROPS_H + +/** + @defgroup port-props Port Properties + @ingroup lv2 + + Various port properties. + + @{ +*/ + +// clang-format off + +#define LV2_PORT_PROPS_URI "http://lv2plug.in/ns/ext/port-props" ///< http://lv2plug.in/ns/ext/port-props +#define LV2_PORT_PROPS_PREFIX LV2_PORT_PROPS_URI "#" ///< http://lv2plug.in/ns/ext/port-props# + +#define LV2_PORT_PROPS__causesArtifacts LV2_PORT_PROPS_PREFIX "causesArtifacts" ///< http://lv2plug.in/ns/ext/port-props#causesArtifacts +#define LV2_PORT_PROPS__continuousCV LV2_PORT_PROPS_PREFIX "continuousCV" ///< http://lv2plug.in/ns/ext/port-props#continuousCV +#define LV2_PORT_PROPS__discreteCV LV2_PORT_PROPS_PREFIX "discreteCV" ///< http://lv2plug.in/ns/ext/port-props#discreteCV +#define LV2_PORT_PROPS__displayPriority LV2_PORT_PROPS_PREFIX "displayPriority" ///< http://lv2plug.in/ns/ext/port-props#displayPriority +#define LV2_PORT_PROPS__expensive LV2_PORT_PROPS_PREFIX "expensive" ///< http://lv2plug.in/ns/ext/port-props#expensive +#define LV2_PORT_PROPS__hasStrictBounds LV2_PORT_PROPS_PREFIX "hasStrictBounds" ///< http://lv2plug.in/ns/ext/port-props#hasStrictBounds +#define LV2_PORT_PROPS__logarithmic LV2_PORT_PROPS_PREFIX "logarithmic" ///< http://lv2plug.in/ns/ext/port-props#logarithmic +#define LV2_PORT_PROPS__notAutomatic LV2_PORT_PROPS_PREFIX "notAutomatic" ///< http://lv2plug.in/ns/ext/port-props#notAutomatic +#define LV2_PORT_PROPS__notOnGUI LV2_PORT_PROPS_PREFIX "notOnGUI" ///< http://lv2plug.in/ns/ext/port-props#notOnGUI +#define LV2_PORT_PROPS__rangeSteps LV2_PORT_PROPS_PREFIX "rangeSteps" ///< http://lv2plug.in/ns/ext/port-props#rangeSteps +#define LV2_PORT_PROPS__supportsStrictBounds LV2_PORT_PROPS_PREFIX "supportsStrictBounds" ///< http://lv2plug.in/ns/ext/port-props#supportsStrictBounds +#define LV2_PORT_PROPS__trigger LV2_PORT_PROPS_PREFIX "trigger" ///< http://lv2plug.in/ns/ext/port-props#trigger + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_PORT_PROPS_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,202 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pprops: . +@prefix rdf: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Port Properties" ; + doap:created "2009-01-01" ; + doap:shortdesc "Various properties for LV2 plugin ports." ; + doap:maintainer ; + doap:developer ; + doap:release [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This vocabulary defines various properties for plugin ports, which can be used +to better describe how a plugin can be controlled. Using this metadata, hosts +can build better UIs for plugins, and provide more advanced automatic +functionality. + +"""^^lv2:Markdown . + +pprops:trigger + lv2:documentation """ + +Indicates that the data item corresponds to a momentary event that has been +detected (control output ports) or is to be triggered (control input ports). +For input ports, the port needs to be reset to lv2:default value after run() +function of the plugin has returned. If the control port is assigned a GUI +widget by the host, the widget should be of auto-off (momentary, one-shot) type +- for example, a push button if the port is also declared as lv2:toggled, or a +series of push button or auto-clear input box with a "Send" button if the port +is also lv2:integer. + +"""^^lv2:Markdown . + +pprops:supportsStrictBounds + lv2:documentation """ + +Indicates use of host support for pprops:hasStrictBounds port property. A +plugin that specifies it as optional feature can omit value clamping for +hasStrictBounds ports, if the feature is supported by the host. When specified +as required feature, it indicates that the plugin does not do any clamping for +input ports that have a pprops:hasStrictBounds property. + +"""^^lv2:Markdown . + +pprops:hasStrictBounds + lv2:documentation """ + +For hosts that support pprops:supportsStrictBounds, this indicates that the +value of the port should never exceed the port's minimum and maximum control +points. For input ports, it moves the responsibility for limiting the range of +values to host, if it supports pprops:supportsStrictBounds. For output ports, +it indicates that values within specified range are to be expected, and +breaking that should be considered by the host as error in plugin +implementation. + +"""^^lv2:Markdown . + +pprops:expensive + lv2:documentation """ + +Input ports only. Indicates that any changes to the port value may trigger +expensive background calculation (for example, regeneration of lookup tables in +a background thread). Any value changes may have not have immediate effect, or +may cause silence or diminished-quality version of the output until background +processing is finished. Ports having this property are typically not well +suited for connection to outputs of other plugins, and should not be offered as +connection targets or for automation by default. + +"""^^lv2:Markdown . + +pprops:causesArtifacts + lv2:documentation """ + +Input ports only. Indicates that any changes to the port value may produce +slight artifacts to produced audio signals (zipper noise and other results of +signal discontinuities). Connecting ports of this type to continuous signals +is not recommended, and when presenting a list of automation targets, those +ports may be marked as artifact-producing. + +"""^^lv2:Markdown . + +pprops:continuousCV + lv2:documentation """ + +Indicates that the port carries a "smooth" modulation signal. Control input +ports of this type are well-suited for being connected to sources of smooth +signals (knobs with smoothing, modulation rate oscillators, output ports with +continuousCV type, etc.). Typically, the plugin with ports which have this +property will implement appropriate smoothing to avoid audio artifacts. For +output ports, this property suggests the value of the port is likely to change +frequently, and describes a smooth signal (so successive values may be +considered points along a curve). + +"""^^lv2:Markdown . + +pprops:discreteCV + lv2:documentation """ + +Indicates that the port carries a "discrete" modulation signal. Input ports of +this type are well-suited for being connected to sources of discrete signals +(switches, buttons, classifiers, event detectors, etc.). May be combined with +pprops:trigger property. For output ports, this property suggests the value of +the port describe discrete values that should be interpreted as steps (and not +points along a curve). + +"""^^lv2:Markdown . + +pprops:logarithmic + lv2:documentation """ + +Indicates that port value behaviour within specified range (bounds) is a value +using logarithmic scale. The lower and upper bounds must be specified, and +must be of the same sign. + +"""^^lv2:Markdown . + +pprops:notAutomatic + lv2:documentation """ + +Indicates that the port is not primarily intended to be fed with modulation +signals from external sources (other plugins, etc.). It is merely a UI hint +and hosts may allow the user to override it. + +"""^^lv2:Markdown . + +pprops:notOnGUI + lv2:documentation """ + +Indicates that the port is not primarily intended to be represented by a +separate control in the user interface window (or any similar mechanism used +for direct, immediate control of control ports). It is merely a UI hint and +hosts may allow the user to override it. + +"""^^lv2:Markdown . + +pprops:displayPriority + lv2:documentation """ + +Indicates how important a port is to controlling the plugin. If a host can +only display some ports of a plugin, it should prefer ports with a higher +display priority. Priorities do not need to be unique, and are only meaningful +when compared to each other. + +"""^^lv2:Markdown . + +pprops:rangeSteps + lv2:documentation """ + +This value indicates into how many evenly-divided points the (control) port +range should be divided for step-wise control. This may be used for changing +the value with step-based controllers like arrow keys, mouse wheel, rotary +encoders, and so on. + +Note that when used with a pprops:logarithmic port, the steps are logarithmic +too, and port value can be calculated as: + + :::c + value = lower * pow(upper / lower, step / (steps - 1)) + +and the step from value is: + + :::c + step = (steps - 1) * log(value / lower) / log(upper / lower) + +where: + + * `value` is the port value. + + * `step` is the step number (0..steps). + + * `steps` is the number of steps (= value of :rangeSteps property). + + * `lower` and upper are the bounds. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,79 @@ +@prefix lv2: . +@prefix owl: . +@prefix pprops: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Port Properties" ; + rdfs:comment "Various properties for LV2 plugin ports." ; + rdfs:seeAlso . + +pprops:trigger + a lv2:PortProperty ; + rdfs:label "trigger" ; + rdfs:comment "Port is a momentary trigger." . + +pprops:supportsStrictBounds + a lv2:Feature ; + rdfs:label "supports strict bounds" ; + rdfs:comment "A feature indicating plugin support for strict port bounds." . + +pprops:hasStrictBounds + a lv2:PortProperty ; + rdfs:label "has strict bounds" ; + rdfs:comment "Port has strict bounds which are not internally clamped." . + +pprops:expensive + a lv2:PortProperty ; + rdfs:label "changes are expensive" ; + rdfs:comment "Input port is expensive to change." . + +pprops:causesArtifacts + a lv2:PortProperty ; + rdfs:label "changes cause artifacts" ; + rdfs:comment "Input port causes audible artifacts when changed." . + +pprops:continuousCV + a lv2:PortProperty ; + rdfs:label "smooth modulation signal" ; + rdfs:comment "Port carries a smooth modulation signal." . + +pprops:discreteCV + a lv2:PortProperty ; + rdfs:label "discrete modulation signal" ; + rdfs:comment "Port carries a discrete modulation signal." . + +pprops:logarithmic + a lv2:PortProperty ; + rdfs:label "logarithmic" ; + rdfs:comment "Port value is logarithmic." . + +pprops:notAutomatic + a lv2:PortProperty ; + rdfs:label "not automatic" ; + rdfs:comment "Port that is not intended to be fed with a modulation signal." . + +pprops:notOnGUI + a lv2:PortProperty ; + rdfs:label "not on GUI" ; + rdfs:comment "Port that should not be displayed on a GUI." . + +pprops:displayPriority + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "display priority" ; + rdfs:comment "A priority ranking this port in importance to its plugin." . + +pprops:rangeSteps + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "range steps" ; + rdfs:comment "The number of even steps the range should be divided into." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 8 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,48 @@ +/* + Copyright 2012-2016 David Robillard + + 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. +*/ + +#ifndef LV2_PRESETS_H +#define LV2_PRESETS_H + +/** + @defgroup presets Presets + @ingroup lv2 + + Presets for plugins. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_PRESETS_URI "http://lv2plug.in/ns/ext/presets" ///< http://lv2plug.in/ns/ext/presets +#define LV2_PRESETS_PREFIX LV2_PRESETS_URI "#" ///< http://lv2plug.in/ns/ext/presets# + +#define LV2_PRESETS__Bank LV2_PRESETS_PREFIX "Bank" ///< http://lv2plug.in/ns/ext/presets#Bank +#define LV2_PRESETS__Preset LV2_PRESETS_PREFIX "Preset" ///< http://lv2plug.in/ns/ext/presets#Preset +#define LV2_PRESETS__bank LV2_PRESETS_PREFIX "bank" ///< http://lv2plug.in/ns/ext/presets#bank +#define LV2_PRESETS__preset LV2_PRESETS_PREFIX "preset" ///< http://lv2plug.in/ns/ext/presets#preset +#define LV2_PRESETS__value LV2_PRESETS_PREFIX "value" ///< http://lv2plug.in/ns/ext/presets#value + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_PRESETS_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,132 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pset: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Presets" ; + doap:shortdesc "Presets for LV2 plugins." ; + doap:created "2009-00-00" ; + doap:developer ; + doap:release [ + doap:revision "2.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add preset banks." + ] + ] + ] , [ + doap:revision "2.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add pset:preset property for describing the preset currently applied to a plugin instance." + ] , [ + rdfs:label "Remove pset:appliesTo property, use lv2:appliesTo instead." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This is a vocabulary for LV2 plugin presets, that is, named sets of control +values and possibly other state. The structure of a pset:Preset is +deliberately identical to that of an lv2:Plugin, and can be thought of as a +plugin template or overlay. + +Presets may be defined in any bundle, including the plugin's bundle, separate +third party preset bundles, or user preset bundles saved by hosts. Since +preset data tends to be large, it is recommended that plugins describe presets +in a separate file(s) to avoid slowing down hosts. The `manifest.ttl` of a +bundle containing presets should list them like so: + + :::turtle + eg:mypreset + a pset:Preset ; + lv2:appliesTo eg:myplugin ; + rdfs:seeAlso . + +"""^^lv2:Markdown . + +pset:Preset + lv2:documentation """ + +The structure of a Preset deliberately mirrors that of a plugin, so existing +predicates can be used to describe any data associated with the preset. For +example: + + :::turtle + @prefix eg: . + + eg:mypreset + a pset:Preset ; + rdfs:label "One louder" ; + lv2:appliesTo eg:myplugin ; + lv2:port [ + lv2:symbol "volume1" ; + pset:value 11.0 + ] , [ + lv2:symbol "volume2" ; + pset:value 11.0 + ] . + +A Preset SHOULD have at least one lv2:appliesTo property. Each Port on a +Preset MUST have at least a lv2:symbol property and a pset:value property. + +Hosts SHOULD save user presets to a bundle in the user-local LV2 directory (for +example `~/.lv2`) with a name like `_.preset.lv2` +(for example `LV2_Amp_At_Eleven.preset.lv2`), where names are transformed to be +valid LV2 symbols for maximum compatibility. + +"""^^lv2:Markdown . + +pset:value + lv2:documentation """ + +This property is used in a similar way to lv2:default. + +"""^^lv2:Markdown . + +pset:preset + lv2:documentation """ + +Specifies the preset currently applied to a plugin instance. This property may +be useful for saving state, or notifying a plugin instance at run-time about a +preset change. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,60 @@ +@prefix lv2: . +@prefix owl: . +@prefix pset: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Presets" ; + rdfs:comment "Presets for LV2 plugins." ; + rdfs:seeAlso . + +pset:Bank + a rdfs:Class ; + rdfs:label "Bank" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty rdfs:label ; + owl:someValuesFrom xsd:string ; + rdfs:comment "A Bank MUST have at least one string rdfs:label." + ] ; + rdfs:comment "A bank of presets." . + +pset:Preset + a rdfs:Class ; + rdfs:subClassOf lv2:PluginBase ; + rdfs:label "Preset" ; + rdfs:comment "A preset for an LV2 plugin." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty rdfs:label ; + owl:someValuesFrom xsd:string ; + rdfs:comment "A Preset MUST have at least one string rdfs:label." + ] . + +pset:bank + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain pset:Preset ; + rdfs:range pset:Bank ; + rdfs:label "bank" ; + rdfs:comment "The bank this preset belongs to." . + +pset:value + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:PortBase ; + rdfs:label "value" ; + rdfs:comment "The value of a port in a preset." . + +pset:preset + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:PluginBase ; + rdfs:range pset:Preset ; + rdfs:label "preset" ; + rdfs:comment "The preset currently applied to a plugin instance." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,89 @@ +/* + Copyright 2007-2016 David Robillard + + 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. +*/ + +#ifndef LV2_RESIZE_PORT_H +#define LV2_RESIZE_PORT_H + +/** + @defgroup resize-port Resize Port + @ingroup lv2 + + Dynamically sized LV2 port buffers. + + @{ +*/ + +#include +#include + +// clang-format off + +#define LV2_RESIZE_PORT_URI "http://lv2plug.in/ns/ext/resize-port" ///< http://lv2plug.in/ns/ext/resize-port +#define LV2_RESIZE_PORT_PREFIX LV2_RESIZE_PORT_URI "#" ///< http://lv2plug.in/ns/ext/resize-port# + +#define LV2_RESIZE_PORT__asLargeAs LV2_RESIZE_PORT_PREFIX "asLargeAs" ///< http://lv2plug.in/ns/ext/resize-port#asLargeAs +#define LV2_RESIZE_PORT__minimumSize LV2_RESIZE_PORT_PREFIX "minimumSize" ///< http://lv2plug.in/ns/ext/resize-port#minimumSize +#define LV2_RESIZE_PORT__resize LV2_RESIZE_PORT_PREFIX "resize" ///< http://lv2plug.in/ns/ext/resize-port#resize + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +/** A status code for state functions. */ +typedef enum { + LV2_RESIZE_PORT_SUCCESS = 0, /**< Completed successfully. */ + LV2_RESIZE_PORT_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_RESIZE_PORT_ERR_NO_SPACE = 2 /**< Insufficient space. */ +} LV2_Resize_Port_Status; + +/** Opaque data for resize method. */ +typedef void* LV2_Resize_Port_Feature_Data; + +/** Host feature to allow plugins to resize their port buffers. */ +typedef struct { + /** Opaque data for resize method. */ + LV2_Resize_Port_Feature_Data data; + + /** + Resize a port buffer to at least `size` bytes. + + This function MAY return an error, in which case the port buffer was not + resized and the port is still connected to the same location. Plugins + MUST gracefully handle this situation. + + This function is in the audio threading class. + + The host MUST preserve the contents of the port buffer when resizing. + + Plugins MAY resize a port many times in a single run callback. Hosts + SHOULD make this as inexpensive as possible. + */ + LV2_Resize_Port_Status (*resize)(LV2_Resize_Port_Feature_Data data, + uint32_t index, + size_t size); +} LV2_Resize_Port_Resize; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_RESIZE_PORT_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,74 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix rsz: . + + + a doap:Project ; + doap:name "LV2 Resize Port" ; + doap:shortdesc "Dynamically sized LV2 port buffers." ; + doap:created "2007-00-00" ; + doap:developer ; + doap:release [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature, rsz:resize, which allows plugins to +dynamically resize their output port buffers. + +In addition to the dynamic feature, there are properties which describe the +space required for a particular port buffer which can be used statically in +data files. + +"""^^lv2:Markdown . + +rsz:resize + lv2:documentation """ + +A feature to resize output port buffers in LV2_Plugin_Descriptor::run(). + +To support this feature, the host must pass an LV2_Feature to the plugin's +instantiate method with URI LV2_RESIZE_PORT__resize and a pointer to a +LV2_Resize_Port_Resize structure. This structure provides a resize_port +function which plugins may use to resize output port buffers as necessary. + +"""^^lv2:Markdown . + +rsz:asLargeAs + lv2:documentation """ + +Indicates that a port requires at least as much buffer space as the port with +the given symbol on the same plugin instance. This may be used for any ports, +but is generally most useful to indicate an output port must be at least as +large as some input port (because it will copy from it). If a port is +asLargeAs several ports, it is asLargeAs the largest such port (not the sum of +those ports' sizes). + +The host guarantees that whenever an ObjectPort's run method is called, any +output `O` that is rsz:asLargeAs an input `I` is connected to a buffer large +enough to copy `I`, or `NULL` if the port is lv2:connectionOptional. + +"""^^lv2:Markdown . + +rsz:minimumSize + lv2:documentation """ + +Indicates that a port requires a buffer at least this large, in bytes. Any +host that supports the resize-port feature MUST connect any port with a +minimumSize specified to a buffer at least as large as the value given for this +property. Any host, especially those that do NOT support dynamic port +resizing, SHOULD do so or reduced functionality may result. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,36 @@ +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix rsz: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Resize Port" ; + rdfs:comment "Dynamically sized LV2 port buffers." ; + rdfs:seeAlso , + . + +rsz:resize + a lv2:Feature ; + rdfs:label "resize" ; + rdfs:comment "A feature for resizing output port buffers." . + +rsz:asLargeAs + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range lv2:Symbol ; + rdfs:label "as large as" ; + rdfs:comment "Port that this port must have at least as much buffer space as." . + +rsz:minimumSize + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "minimum size" ; + rdfs:comment "Minimum buffer size required by a port, in bytes." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 8 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,392 @@ +/* + Copyright 2010-2016 David Robillard + Copyright 2010 Leonard Ritter + + 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. +*/ + +#ifndef LV2_STATE_H +#define LV2_STATE_H + +/** + @defgroup state State + @ingroup lv2 + + An interface for LV2 plugins to save and restore state. + + See for details. + + @{ +*/ + +#include "lv2/core/lv2.h" + +#include +#include + +// clang-format off + +#define LV2_STATE_URI "http://lv2plug.in/ns/ext/state" ///< http://lv2plug.in/ns/ext/state +#define LV2_STATE_PREFIX LV2_STATE_URI "#" ///< http://lv2plug.in/ns/ext/state# + +#define LV2_STATE__State LV2_STATE_PREFIX "State" ///< http://lv2plug.in/ns/ext/state#State +#define LV2_STATE__interface LV2_STATE_PREFIX "interface" ///< http://lv2plug.in/ns/ext/state#interface +#define LV2_STATE__loadDefaultState LV2_STATE_PREFIX "loadDefaultState" ///< http://lv2plug.in/ns/ext/state#loadDefaultState +#define LV2_STATE__freePath LV2_STATE_PREFIX "freePath" ///< http://lv2plug.in/ns/ext/state#freePath +#define LV2_STATE__makePath LV2_STATE_PREFIX "makePath" ///< http://lv2plug.in/ns/ext/state#makePath +#define LV2_STATE__mapPath LV2_STATE_PREFIX "mapPath" ///< http://lv2plug.in/ns/ext/state#mapPath +#define LV2_STATE__state LV2_STATE_PREFIX "state" ///< http://lv2plug.in/ns/ext/state#state +#define LV2_STATE__threadSafeRestore LV2_STATE_PREFIX "threadSafeRestore" ///< http://lv2plug.in/ns/ext/state#threadSafeRestore +#define LV2_STATE__StateChanged LV2_STATE_PREFIX "StateChanged" ///< http://lv2plug.in/ns/ext/state#StateChanged + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* LV2_State_Handle; ///< Opaque handle for state save/restore +typedef void* + LV2_State_Free_Path_Handle; ///< Opaque handle for state:freePath feature +typedef void* + LV2_State_Map_Path_Handle; ///< Opaque handle for state:mapPath feature +typedef void* + LV2_State_Make_Path_Handle; ///< Opaque handle for state:makePath feature + +/** + Flags describing value characteristics. + + These flags are used along with the value's type URI to determine how to + (de-)serialise the value data, or whether it is even possible to do so. +*/ +typedef enum { + /** + Plain Old Data. + + Values with this flag contain no pointers or references to other areas + of memory. It is safe to copy POD values with a simple memcpy and store + them for the duration of the process. A POD value is not necessarily + safe to trasmit between processes or machines (for example, filenames + are POD), see LV2_STATE_IS_PORTABLE for details. + + Implementations MUST NOT attempt to copy or serialise a non-POD value if + they do not understand its type (and thus know how to correctly do so). + */ + LV2_STATE_IS_POD = 1, + + /** + Portable (architecture independent) data. + + Values with this flag are in a format that is usable on any + architecture. A portable value saved on one machine can be restored on + another machine regardless of architecture. The format of portable + values MUST NOT depend on architecture-specific properties like + endianness or alignment. Portable values MUST NOT contain filenames. + */ + LV2_STATE_IS_PORTABLE = 1 << 1, + + /** + Native data. + + This flag is used by the host to indicate that the saved data is only + going to be used locally in the currently running process (for things + like instance duplication or snapshots), so the plugin should use the + most efficient representation possible and not worry about serialisation + and portability. + */ + LV2_STATE_IS_NATIVE = 1 << 2 +} LV2_State_Flags; + +/** A status code for state functions. */ +typedef enum { + LV2_STATE_SUCCESS = 0, /**< Completed successfully. */ + LV2_STATE_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_STATE_ERR_BAD_TYPE = 2, /**< Failed due to unsupported type. */ + LV2_STATE_ERR_BAD_FLAGS = 3, /**< Failed due to unsupported flags. */ + LV2_STATE_ERR_NO_FEATURE = 4, /**< Failed due to missing features. */ + LV2_STATE_ERR_NO_PROPERTY = 5, /**< Failed due to missing property. */ + LV2_STATE_ERR_NO_SPACE = 6 /**< Failed due to insufficient space. */ +} LV2_State_Status; + +/** + A host-provided function to store a property. + @param handle Must be the handle passed to LV2_State_Interface.save(). + @param key The key to store `value` under (URID). + @param value Pointer to the value to be stored. + @param size The size of `value` in bytes. + @param type The type of `value` (URID). + @param flags LV2_State_Flags for `value`. + @return 0 on success, otherwise a non-zero error code. + + The host passes a callback of this type to LV2_State_Interface.save(). This + callback is called repeatedly by the plugin to store all the properties that + describe its current state. + + DO NOT INVENT NONSENSE URI SCHEMES FOR THE KEY. Best is to use keys from + existing vocabularies. If nothing appropriate is available, use http URIs + that point to somewhere you can host documents so documentation can be made + resolvable (typically a child of the plugin or project URI). If this is not + possible, invent a URN scheme, e.g. urn:myproj:whatever. The plugin MUST + NOT pass an invalid URI key. + + The host MAY fail to store a property for whatever reason, but SHOULD + store any property that is LV2_STATE_IS_POD and LV2_STATE_IS_PORTABLE. + Implementations SHOULD use the types from the LV2 Atom extension + (http://lv2plug.in/ns/ext/atom) wherever possible. The plugin SHOULD + attempt to fall-back and avoid the error if possible. + + Note that `size` MUST be > 0, and `value` MUST point to a valid region of + memory `size` bytes long (this is required to make restore unambiguous). + + The plugin MUST NOT attempt to use this function outside of the + LV2_State_Interface.restore() context. +*/ +typedef LV2_State_Status (*LV2_State_Store_Function)(LV2_State_Handle handle, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags); + +/** + A host-provided function to retrieve a property. + @param handle Must be the handle passed to LV2_State_Interface.restore(). + @param key The key of the property to retrieve (URID). + @param size (Output) If non-NULL, set to the size of the restored value. + @param type (Output) If non-NULL, set to the type of the restored value. + @param flags (Output) If non-NULL, set to the flags for the restored value. + @return A pointer to the restored value (object), or NULL if no value + has been stored under `key`. + + A callback of this type is passed by the host to + LV2_State_Interface.restore(). This callback is called repeatedly by the + plugin to retrieve any properties it requires to restore its state. + + The returned value MUST remain valid until LV2_State_Interface.restore() + returns. The plugin MUST NOT attempt to use this function, or any value + returned from it, outside of the LV2_State_Interface.restore() context. +*/ +typedef const void* (*LV2_State_Retrieve_Function)(LV2_State_Handle handle, + uint32_t key, + size_t* size, + uint32_t* type, + uint32_t* flags); + +/** + LV2 Plugin State Interface. + + When the plugin's extension_data is called with argument + LV2_STATE__interface, the plugin MUST return an LV2_State_Interface + structure, which remains valid for the lifetime of the plugin. + + The host can use the contained function pointers to save and restore the + state of a plugin instance at any time, provided the threading restrictions + of the functions are met. + + Stored data is only guaranteed to be compatible between instances of plugins + with the same URI (i.e. if a change to a plugin would cause a fatal error + when restoring state saved by a previous version of that plugin, the plugin + URI MUST change just as it must when ports change incompatibly). Plugin + authors should consider this possibility, and always store sensible data + with meaningful types to avoid such problems in the future. +*/ +typedef struct { + /** + Save plugin state using a host-provided `store` callback. + + @param instance The instance handle of the plugin. + @param store The host-provided store callback. + @param handle An opaque pointer to host data which MUST be passed as the + handle parameter to `store` if it is called. + @param flags Flags describing desired properties of this save. These + flags may be used to determine the most appropriate values to store. + @param features Extensible parameter for passing any additional + features to be used for this save. + + The plugin is expected to store everything necessary to completely + restore its state later. Plugins SHOULD store simple POD data whenever + possible, and consider the possibility of state being restored much + later on a different machine. + + The `handle` pointer and `store` function MUST NOT be used + beyond the scope of save(). + + This function has its own special threading class: it may not be called + concurrently with any "Instantiation" function, but it may be called + concurrently with functions in any other class, unless the definition of + that class prohibits it (for example, it may not be called concurrently + with a "Discovery" function, but it may be called concurrently with an + "Audio" function. The plugin is responsible for any locking or + lock-free techniques necessary to make this possible. + + Note that in the simple case where state is only modified by restore(), + there are no synchronization issues since save() is never called + concurrently with restore() (though run() may read it during a save). + + Plugins that dynamically modify state while running, however, must take + care to do so in such a way that a concurrent call to save() will save a + consistent representation of plugin state for a single instant in time. + */ + LV2_State_Status (*save)(LV2_Handle instance, + LV2_State_Store_Function store, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature* const* features); + + /** + Restore plugin state using a host-provided `retrieve` callback. + + @param instance The instance handle of the plugin. + @param retrieve The host-provided retrieve callback. + @param handle An opaque pointer to host data which MUST be passed as the + handle parameter to `retrieve` if it is called. + @param flags Currently unused. + @param features Extensible parameter for passing any additional + features to be used for this restore. + + The plugin MAY assume a restored value was set by a previous call to + LV2_State_Interface.save() by a plugin with the same URI. + + The plugin MUST gracefully fall back to a default value when a value can + not be retrieved. This allows the host to reset the plugin state with + an empty map. + + The `handle` pointer and `store` function MUST NOT be used + beyond the scope of restore(). + + This function is in the "Instantiation" threading class as defined by + LV2. This means it MUST NOT be called concurrently with any other + function on the same plugin instance. + */ + LV2_State_Status (*restore)(LV2_Handle instance, + LV2_State_Retrieve_Function retrieve, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature* const* features); +} LV2_State_Interface; + +/** + Feature data for state:mapPath (@ref LV2_STATE__mapPath). +*/ +typedef struct { + /** + Opaque host data. + */ + LV2_State_Map_Path_Handle handle; + + /** + Map an absolute path to an abstract path for use in plugin state. + @param handle MUST be the `handle` member of this struct. + @param absolute_path The absolute path of a file. + @return An abstract path suitable for use in plugin state. + + The plugin MUST use this function to map any paths that will be stored + in plugin state. The returned value is an abstract path which MAY not + be an actual file system path; absolute_path() MUST be used to map + it to an actual path in order to use the file. + + Plugins MUST NOT make any assumptions about abstract paths except that + they can be mapped back to the absolute path of the "same" file (though + not necessarily the same original path) using absolute_path(). + + This function may only be called within the context of + LV2_State_Interface methods. The caller must free the returned value + with LV2_State_Free_Path.free_path(). + */ + char* (*abstract_path)(LV2_State_Map_Path_Handle handle, + const char* absolute_path); + + /** + Map an abstract path from plugin state to an absolute path. + @param handle MUST be the `handle` member of this struct. + @param abstract_path An abstract path (typically from plugin state). + @return An absolute file system path. + + The plugin MUST use this function in order to actually open or otherwise + use any paths loaded from plugin state. + + This function may only be called within the context of + LV2_State_Interface methods. The caller must free the returned value + with LV2_State_Free_Path.free_path(). + */ + char* (*absolute_path)(LV2_State_Map_Path_Handle handle, + const char* abstract_path); +} LV2_State_Map_Path; + +/** + Feature data for state:makePath (@ref LV2_STATE__makePath). +*/ +typedef struct { + /** + Opaque host data. + */ + LV2_State_Make_Path_Handle handle; + + /** + Return a path the plugin may use to create a new file. + @param handle MUST be the `handle` member of this struct. + @param path The path of the new file within a namespace unique to this + plugin instance. + @return The absolute path to use for the new file. + + This function can be used by plugins to create files and directories, + either at state saving time (if this feature is passed to + LV2_State_Interface.save()) or any time (if this feature is passed to + LV2_Descriptor.instantiate()). + + The host MUST do whatever is necessary for the plugin to be able to + create a file at the returned path (for example, using fopen()), + including creating any leading directories. + + If this function is passed to LV2_Descriptor.instantiate(), it may be + called from any non-realtime context. If it is passed to + LV2_State_Interface.save(), it may only be called within the dynamic + scope of that function call. + + The caller must free the returned value with + LV2_State_Free_Path.free_path(). + */ + char* (*path)(LV2_State_Make_Path_Handle handle, const char* path); +} LV2_State_Make_Path; + +/** + Feature data for state:freePath (@ref LV2_STATE__freePath). +*/ +typedef struct { + /** + Opaque host data. + */ + LV2_State_Free_Path_Handle handle; + + /** + Free a path returned by a state feature. + + @param handle MUST be the `handle` member of this struct. + @param path The path previously returned by a state feature. + + This function can be used by plugins to free paths allocated by the host + and returned by state features (LV2_State_Map_Path.abstract_path(), + LV2_State_Map_Path.absolute_path(), and LV2_State_Make_Path.path()). + */ + void (*free_path)(LV2_State_Free_Path_Handle handle, char* path); +} LV2_State_Free_Path; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_STATE_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,467 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix state: . + + + a doap:Project ; + doap:created "2010-11-09" ; + doap:name "LV2 State" ; + doap:shortdesc "An interface for LV2 plugins to save and restore state." ; + doap:license ; + doap:developer , + ; + doap:maintainer ; + doap:release [ + doap:revision "2.8" ; + doap:created "2021-01-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix state:StateChanged URI in metadata and documentation." + ] + ] + ] , [ + doap:revision "2.6" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add state:freePath feature." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add state:StateChanged for notification events." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2016-07-31" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add LV2_STATE_ERR_NO_SPACE status flag." + ] , [ + rdfs:label "Add state:threadSafeRestore feature for dropout-free state restoration." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2013-01-16" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add state:loadDefaultState feature so plugins can have their default state loaded without hard-coding default state as a special case." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a simple mechanism that allows hosts to save and restore +a plugin instance's state. The goal is for an instance's state to be +completely described by port values and a simple dictionary. + +The state defined here is conceptually a key:value dictionary, with URI keys +and values of any type. For performance reasons the key and value type are +actually a "URID", a URI mapped to an integer. A single key:value pair is +called a "property". + +This state model is simple yet has many benefits: + + * Both fast and extensible thanks to URID keys. + + * No limitations on possible value types. + + * Easy to serialise in almost any format. + + * Easy to store in a typical "map" or "dictionary" data structure. + + * Elegantly described in Turtle, so state can be described in LV2 data files + (including presets). + + * Does not impose any file formats, data structures, or file system + requirements. + + * Suitable for portable persistent state as well as fast in-memory snapshots. + + * Keys _may_ be well-defined and used meaningfully across several + implementations. + + * State _may_ be dynamic, but plugins are not required to have a dynamic + dictionary data structure available. + +To implement state, the plugin provides a state:interface to the host. To save +or restore, the host calls LV2_State_Interface::save() or +LV2_State_Interface::restore(), passing a callback to be used for handling a +single property. The host is free to implement property storage and retrieval +in any way. + +Since value types are defined by URI, any type is possible. However, a set of +standard types is defined by the [LV2 Atom](atom.html) extension. Use of these +types is recommended. Hosts MUST implement at least +[atom:String](atom.html#String), which is simply a C string. + +### Referring to Files + +Plugins may need to refer to existing files (such as loaded samples) in their +state. This is done by storing the file's path as a property just like any +other value. However, there are some rules which MUST be followed when storing +paths, see state:mapPath for details. Plugins MUST use the type +[atom:Path](atom.html#Path) for all paths in their state. + +Plugins are strongly encouraged to avoid creating files, instead storing all +state as properties. However, occasionally the ability to create files is +necessary. To make this possible, the host can provide the feature +state:makePath which allocates paths for plugin-created files. Plugins MUST +NOT create files in any other locations. + +### Plugin Code Example + + :::c + + /* Namespace for this plugin's keys. This SHOULD be something that could be + published as a document, even if that document does not exist right now. + */ + #define NS_MY "http://example.org/myplugin/schema#" + + #define DEFAULT_GREETING "Hello" + + LV2_Handle + my_instantiate(...) + { + MyPlugin* plugin = ...; + plugin->uris.atom_String = map_uri(LV2_ATOM__String); + plugin->uris.my_greeting = map_uri(NS_MY "greeting"); + plugin->state.greeting = strdup(DEFAULT_GREETING); + return plugin; + } + + LV2_State_Status + my_save(LV2_Handle instance, + LV2_State_Store_Function store, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature *const * features) + { + MyPlugin* plugin = (MyPlugin*)instance; + const char* greeting = plugin->state.greeting; + + store(handle, + plugin->uris.my_greeting, + greeting, + strlen(greeting) + 1, // Careful! Need space for terminator + plugin->uris.atom_String, + LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE); + + return LV2_STATE_SUCCESS; + } + + LV2_State_Status + my_restore(LV2_Handle instance, + LV2_State_Retrieve_Function retrieve, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature *const * features) + { + MyPlugin* plugin = (MyPlugin*)instance; + + size_t size; + uint32_t type; + uint32_t flags; + const char* greeting = retrieve( + handle, plugin->uris.my_greeting, &size, &type, &flags); + + if (greeting) { + free(plugin->state->greeting); + plugin->state->greeting = strdup(greeting); + } else { + plugin->state->greeting = strdup(DEFAULT_GREETING); + } + + return LV2_STATE_SUCCESS; + } + + const void* + my_extension_data(const char* uri) + { + static const LV2_State_Interface state_iface = { my_save, my_restore }; + if (!strcmp(uri, LV2_STATE__interface)) { + return &state_iface; + } + } + +### Host Code Example + + :::c + LV2_State_Status + store_callback(LV2_State_Handle handle, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags) + { + if ((flags & LV2_STATE_IS_POD)) { + // We only care about POD since we're keeping state in memory only. + // Disk or network use would also require LV2_STATE_IS_PORTABLE. + Map* state_map = (Map*)handle; + state_map->insert(key, Value(copy(value), size, type)); + return LV2_STATE_SUCCESS;; + } else { + return LV2_STATE_ERR_BAD_FLAGS; // Non-POD events are unsupported + } + } + + Map + get_plugin_state(LV2_Handle instance) + { + LV2_State* state = instance.extension_data(LV2_STATE__interface); + + // Request a fast/native/POD save, since we're just copying in memory + Map state_map; + state.save(instance, store_callback, &state_map, + LV2_STATE_IS_POD|LV2_STATE_IS_NATIVE); + + return state_map; + } + +### Extensions to this Specification + +It is likely that other interfaces for working with plugin state will be +developed as needed. This is encouraged, however everything SHOULD work within +the state _model_ defined here. That is, **do not complicate the state +model**. Implementations can assume the following: + + * The current port values and state dictionary completely describe a plugin + instance, at least well enough that saving and restoring will yield an + "identical" instance from the user's perspective. + + * Hosts are not expected to save and/or restore any other attributes of a + plugin instance. + +### The "Property Principle" + +The main benefit of this meaningful state model is that it can double as a +plugin control/query mechanism. For plugins that require more advanced control +than simple control ports, instead of defining a set of commands, define +properties whose values can be set appropriately. This provides both a way to +control and save that state "for free", since there is no need to define +commands _and_ a set of properties for storing their effects. In particular, +this is a good way for UIs to achieve more advanced control of plugins. + +This "property principle" is summed up in the phrase: "Don't stop; set playing +to false". + +This extension does not define a dynamic mechanism for state access and +manipulation. The [LV2 Patch](patch.html) extension defines a generic set of +messages which can be used to access or manipulate properties, and the [LV2 +Atom](atom.html) extension defines a port type and data container capable of +transmitting those messages. + +"""^^lv2:Markdown . + +state:interface + lv2:documentation """ + +A structure (LV2_State_Interface) which contains functions to be called by the +host to save and restore state. In order to support this extension, the plugin +must return a valid LV2_State_Interface from LV2_Descriptor::extension_data() +when it is called with URI LV2_STATE__interface. + +The plugin data file should describe this like so: + + :::turtle + @prefix state: . + + + a lv2:Plugin ; + lv2:extensionData state:interface . + +"""^^lv2:Markdown . + +state:State + lv2:documentation """ + +This type should be used wherever instance state is described. The properties +of a resource with this type correspond directly to the properties of the state +dictionary (except the property that states it has this type). + +"""^^lv2:Markdown . + +state:loadDefaultState + lv2:documentation """ + +This feature indicates that the plugin has default state listed with the +state:state property which should be loaded by the host before running the +plugin. Requiring this feature allows plugins to implement a single state +loading mechanism which works for initialisation as well as restoration, +without having to hard-code default state. + +To support this feature, the host MUST restore the default state after +instantiating the plugin but before calling run(). + +"""^^lv2:Markdown . + +state:state + lv2:documentation """ + +This property may be used anywhere a state needs to be described, for example: + + :::turtle + @prefix eg: . + + + state:state [ + eg:somekey "some value" ; + eg:someotherkey "some other value" ; + eg:favourite-number 2 + ] . + +"""^^lv2:Markdown . + +state:mapPath + lv2:documentation """ + +This feature maps absolute paths to/from abstract paths which are stored +in state. To support this feature a host must pass an LV2_Feature with URI +LV2_STATE__mapPath and data pointed to an LV2_State_Map_Path to the plugin's +LV2_State_Interface methods. + +The plugin MUST map _all_ paths stored in its state (including those inside any +files). This is necessary so that hosts can handle file system references +correctly, for example to share common files, or bundle state for distribution +or archival. + +For example, a plugin may write a path to a state file like so: + + :::c + void write_path(LV2_State_Map_Path* map_path, FILE* myfile, const char* path) + { + char* abstract_path = map_path->abstract_path(map_path->handle, path); + fprintf(myfile, "%s", abstract_path); + free(abstract_path); + } + +Then, later reload the path like so: + + :::c + char* read_path(LV2_State_Map_Path* map_path, FILE* myfile) + { + /* Obviously this is not production quality code! */ + char abstract_path[1024]; + fscanf(myfile, "%s", abstract_path); + return map_path->absolute_path(map_path->handle, abstract_path); + } + +"""^^lv2:Markdown . + +state:makePath + lv2:documentation """ + +This feature allows plugins to create new files and/or directories. To support +this feature the host passes an LV2_Feature with URI LV2_STATE__makePath and +data pointed to an LV2_State_Make_Path to the plugin. The host may make this +feature available only during save by passing it to +LV2_State_Interface::save(), or available any time by passing it to +LV2_Descriptor::instantiate(). If passed to LV2_State_Interface::save(), the +feature MUST NOT be used beyond the scope of that call. + +The plugin is guaranteed a hierarchical namespace unique to that plugin +instance, and may expect the returned path to have the requested path as a +suffix. There is one such namespace, even if the feature is passed to both +LV2_Descriptor::instantiate() and LV2_State_Interface::save(). Beyond this, +the plugin MUST NOT make any assumptions about the returned paths. + +Like any other paths, the plugin MUST map these paths using state:mapPath +before storing them in state. The plugin MUST NOT assume these paths will be +available across a save/restore otherwise, that is, only mapped paths saved to +state are persistent, any other created paths are temporary. + +For example, a plugin may create a file in a subdirectory like so: + + :::c + char* save_myfile(LV2_State_Make_Path* make_path) + { + char* path = make_path->path(make_path->handle, "foo/bar/myfile.txt"); + FILE* myfile = fopen(path, 'w'); + fprintf(myfile, "I am some data"); + fclose(myfile); + return path; + } + +"""^^lv2:Markdown . + +state:threadSafeRestore + lv2:documentation """ + +If a plugin supports this feature, its LV2_State_Interface::restore method is +thread-safe and may be called concurrently with audio class functions. + +To support this feature, the host MUST pass a +[work:schedule](worker.html#schedule) feature to the restore method, which will +be used to complete the state restoration. The usual mechanics of the worker +apply: the host will call the plugin's work method, which emits a response +which is later applied in the audio thread. + +The host is not required to block audio processing while restore() and work() +load the state, so this feature allows state to be restored without dropouts. + +"""^^lv2:Markdown . + +state:freePath + lv2:documentation """ + +This feature provides a function that can be used by plugins to free paths that +were allocated by the host via other state features (state:mapPath and +state:makePath). + +"""^^lv2:Markdown . + +state:StateChanged + lv2:documentation """ + +A notification that the internal state of the plugin has been changed in a way +that the host can not otherwise know about. + +This is a one-way notification, intended to be used as the type of an +[Object](atom.html#Object) sent from plugins when necessary. + +Plugins SHOULD emit such an event whenever a change has occurred that would +result in a different state being saved, but not when the host explicity makes +a change which it knows is likely to have that effect, such as changing a +parameter. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,60 @@ +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix state: . + + + a owl:Ontology ; + rdfs:label "LV2 State" ; + rdfs:comment "An interface for LV2 plugins to save and restore state." ; + rdfs:seeAlso , + . + +state:interface + a lv2:ExtensionData ; + rdfs:label "interface" ; + rdfs:comment "A plugin interface for saving and restoring state." . + +state:State + a rdfs:Class ; + rdfs:label "State" ; + rdfs:comment "LV2 plugin state." . + +state:loadDefaultState + a lv2:Feature ; + rdfs:label "load default state" ; + rdfs:comment "A feature indicating that the plugin has default state." . + +state:state + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "state" ; + rdfs:range state:State ; + rdfs:comment "The state of an LV2 plugin instance." . + +state:mapPath + a lv2:Feature ; + rdfs:label "map path" ; + rdfs:comment "A feature for mapping between absolute and abstract file paths." . + +state:makePath + a lv2:Feature ; + rdfs:label "make path" ; + rdfs:comment "A feature for creating new files and directories." . + +state:threadSafeRestore + a lv2:Feature ; + rdfs:label "thread-safe restore" ; + rdfs:comment "A feature indicating support for thread-safe state restoration." . + +state:freePath + a lv2:Feature ; + rdfs:label "free path" ; + rdfs:comment "A feature for freeing paths allocated by the host." . + +state:StateChanged + a rdfs:Class ; + rdfs:label "State Changed" ; + rdfs:comment "A notification that the internal state of the plugin has changed." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,59 @@ +/* + Copyright 2011-2016 David Robillard + + 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. +*/ + +#ifndef LV2_TIME_H +#define LV2_TIME_H + +/** + @defgroup time Time + @ingroup lv2 + + Properties for describing time. + + Note the time extension is purely data, this header merely defines URIs for + convenience. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_TIME_URI "http://lv2plug.in/ns/ext/time" ///< http://lv2plug.in/ns/ext/time +#define LV2_TIME_PREFIX LV2_TIME_URI "#" ///< http://lv2plug.in/ns/ext/time# + +#define LV2_TIME__Time LV2_TIME_PREFIX "Time" ///< http://lv2plug.in/ns/ext/time#Time +#define LV2_TIME__Position LV2_TIME_PREFIX "Position" ///< http://lv2plug.in/ns/ext/time#Position +#define LV2_TIME__Rate LV2_TIME_PREFIX "Rate" ///< http://lv2plug.in/ns/ext/time#Rate +#define LV2_TIME__position LV2_TIME_PREFIX "position" ///< http://lv2plug.in/ns/ext/time#position +#define LV2_TIME__barBeat LV2_TIME_PREFIX "barBeat" ///< http://lv2plug.in/ns/ext/time#barBeat +#define LV2_TIME__bar LV2_TIME_PREFIX "bar" ///< http://lv2plug.in/ns/ext/time#bar +#define LV2_TIME__beat LV2_TIME_PREFIX "beat" ///< http://lv2plug.in/ns/ext/time#beat +#define LV2_TIME__beatUnit LV2_TIME_PREFIX "beatUnit" ///< http://lv2plug.in/ns/ext/time#beatUnit +#define LV2_TIME__beatsPerBar LV2_TIME_PREFIX "beatsPerBar" ///< http://lv2plug.in/ns/ext/time#beatsPerBar +#define LV2_TIME__beatsPerMinute LV2_TIME_PREFIX "beatsPerMinute" ///< http://lv2plug.in/ns/ext/time#beatsPerMinute +#define LV2_TIME__frame LV2_TIME_PREFIX "frame" ///< http://lv2plug.in/ns/ext/time#frame +#define LV2_TIME__framesPerSecond LV2_TIME_PREFIX "framesPerSecond" ///< http://lv2plug.in/ns/ext/time#framesPerSecond +#define LV2_TIME__speed LV2_TIME_PREFIX "speed" ///< http://lv2plug.in/ns/ext/time#speed + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_TIME_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,112 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix time: . + + + a doap:Project ; + doap:name "LV2 Time" ; + doap:shortdesc "A vocabulary for describing musical time." ; + doap:created "2011-10-05" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Clarify time:beat origin." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2016-07-31" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Define LV2_TIME_PREFIX." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This is a vocabulary for describing a position in time and the speed of time +passage, in both real and musical terms. + +In addition to real time (based on seconds), two units of time are used: +_frames_ and _beats_. A frame is a numbered quantum of time. Frame time is +related to real-time by the _frame rate_ or _sample rate_, +time:framesPerSecond. A beat is a single pulse of musical time. Beat time is +related to real-time by the _tempo_, time:beatsPerMinute. + +Musical time additionally has a _meter_ which describes passage of time in +terms of musical _bars_. A bar is a higher level grouping of beats. The meter +describes how many beats are in one bar. + +"""^^lv2:Markdown . + +time:Position + lv2:documentation """ + +A point in time and/or the speed at which time is passing. A position is both +a point and a speed, which precisely defines a time within a timeline. + +"""^^lv2:Markdown . + +time:Rate + lv2:documentation """ + +The rate of passage of time in terms of one unit with respect to another. + +"""^^lv2:Markdown . + +time:beat + lv2:documentation """ + +This is not the beat within a bar like time:barBeat, but relative to the same +origin as time:bar and monotonically increases unless the transport is +repositioned. + +"""^^lv2:Markdown . + +time:beatUnit + lv2:documentation """ + +Beat unit, the note value that counts as one beat. This is the bottom number +in a time signature: 2 for half note, 4 for quarter note, and so on. + +"""^^lv2:Markdown . + +time:speed + lv2:documentation """ + +The rate of the progress of time as a fraction of normal speed. For example, a +rate of 0.0 is stopped, 1.0 is rolling at normal speed, 0.5 is rolling at half +speed, -1.0 is reverse, and so on. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,122 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix time: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Time" ; + rdfs:comment "A vocabulary for describing musical time." ; + rdfs:seeAlso , + . + +time:Time + a rdfs:Class , + owl:Class ; + rdfs:subClassOf time:Position ; + rdfs:label "Time" ; + rdfs:comment "A point in time in some unit/dimension." . + +time:Position + a rdfs:Class , + owl:Class ; + rdfs:label "Position" ; + rdfs:comment "A point in time and/or the speed at which time is passing." . + +time:Rate + a rdfs:Class , + owl:Class ; + rdfs:subClassOf time:Position ; + rdfs:label "Rate" ; + rdfs:comment "The rate of passage of time." . + +time:position + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:range time:Position ; + rdfs:label "position" ; + rdfs:comment "A musical position." . + +time:barBeat + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:float ; + rdfs:label "beat within bar" ; + rdfs:comment "The beat number within the bar, from 0 to time:beatsPerBar." . + +time:bar + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:long ; + rdfs:label "bar" ; + rdfs:comment "A musical bar or measure." . + +time:beat + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:double ; + rdfs:label "beat" ; + rdfs:comment "The global running beat number." . + +time:beatUnit + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "beat unit" ; + rdfs:comment "The note value that counts as one beat." . + +time:beatsPerBar + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "beats per bar" ; + rdfs:comment "The number of beats in one bar." . + +time:beatsPerMinute + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "beats per minute" ; + rdfs:comment "Tempo in beats per minute." . + +time:frame + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:long ; + rdfs:label "frame" ; + rdfs:comment "A time stamp in audio frames." . + +time:framesPerSecond + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "frames per second" ; + rdfs:comment "Frame rate in frames per second." . + +time:speed + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "speed" ; + rdfs:comment "The rate of the progress of time as a fraction of normal speed." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 22 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,543 @@ +/* + LV2 UI Extension + Copyright 2009-2016 David Robillard + Copyright 2006-2011 Lars Luthman + + 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. +*/ + +#ifndef LV2_UI_H +#define LV2_UI_H + +/** + @defgroup ui User Interfaces + @ingroup lv2 + + User interfaces of any type for plugins. + + See for details. + + @{ +*/ + +#include "lv2/core/lv2.h" +#include "lv2/urid/urid.h" + +#include +#include + +// clang-format off + +#define LV2_UI_URI "http://lv2plug.in/ns/extensions/ui" ///< http://lv2plug.in/ns/extensions/ui +#define LV2_UI_PREFIX LV2_UI_URI "#" ///< http://lv2plug.in/ns/extensions/ui# + +#define LV2_UI__CocoaUI LV2_UI_PREFIX "CocoaUI" ///< http://lv2plug.in/ns/extensions/ui#CocoaUI +#define LV2_UI__Gtk3UI LV2_UI_PREFIX "Gtk3UI" ///< http://lv2plug.in/ns/extensions/ui#Gtk3UI +#define LV2_UI__GtkUI LV2_UI_PREFIX "GtkUI" ///< http://lv2plug.in/ns/extensions/ui#GtkUI +#define LV2_UI__PortNotification LV2_UI_PREFIX "PortNotification" ///< http://lv2plug.in/ns/extensions/ui#PortNotification +#define LV2_UI__PortProtocol LV2_UI_PREFIX "PortProtocol" ///< http://lv2plug.in/ns/extensions/ui#PortProtocol +#define LV2_UI__Qt4UI LV2_UI_PREFIX "Qt4UI" ///< http://lv2plug.in/ns/extensions/ui#Qt4UI +#define LV2_UI__Qt5UI LV2_UI_PREFIX "Qt5UI" ///< http://lv2plug.in/ns/extensions/ui#Qt5UI +#define LV2_UI__UI LV2_UI_PREFIX "UI" ///< http://lv2plug.in/ns/extensions/ui#UI +#define LV2_UI__WindowsUI LV2_UI_PREFIX "WindowsUI" ///< http://lv2plug.in/ns/extensions/ui#WindowsUI +#define LV2_UI__X11UI LV2_UI_PREFIX "X11UI" ///< http://lv2plug.in/ns/extensions/ui#X11UI +#define LV2_UI__binary LV2_UI_PREFIX "binary" ///< http://lv2plug.in/ns/extensions/ui#binary +#define LV2_UI__fixedSize LV2_UI_PREFIX "fixedSize" ///< http://lv2plug.in/ns/extensions/ui#fixedSize +#define LV2_UI__idleInterface LV2_UI_PREFIX "idleInterface" ///< http://lv2plug.in/ns/extensions/ui#idleInterface +#define LV2_UI__noUserResize LV2_UI_PREFIX "noUserResize" ///< http://lv2plug.in/ns/extensions/ui#noUserResize +#define LV2_UI__notifyType LV2_UI_PREFIX "notifyType" ///< http://lv2plug.in/ns/extensions/ui#notifyType +#define LV2_UI__parent LV2_UI_PREFIX "parent" ///< http://lv2plug.in/ns/extensions/ui#parent +#define LV2_UI__plugin LV2_UI_PREFIX "plugin" ///< http://lv2plug.in/ns/extensions/ui#plugin +#define LV2_UI__portIndex LV2_UI_PREFIX "portIndex" ///< http://lv2plug.in/ns/extensions/ui#portIndex +#define LV2_UI__portMap LV2_UI_PREFIX "portMap" ///< http://lv2plug.in/ns/extensions/ui#portMap +#define LV2_UI__portNotification LV2_UI_PREFIX "portNotification" ///< http://lv2plug.in/ns/extensions/ui#portNotification +#define LV2_UI__portSubscribe LV2_UI_PREFIX "portSubscribe" ///< http://lv2plug.in/ns/extensions/ui#portSubscribe +#define LV2_UI__protocol LV2_UI_PREFIX "protocol" ///< http://lv2plug.in/ns/extensions/ui#protocol +#define LV2_UI__requestValue LV2_UI_PREFIX "requestValue" ///< http://lv2plug.in/ns/extensions/ui#requestValue +#define LV2_UI__floatProtocol LV2_UI_PREFIX "floatProtocol" ///< http://lv2plug.in/ns/extensions/ui#floatProtocol +#define LV2_UI__peakProtocol LV2_UI_PREFIX "peakProtocol" ///< http://lv2plug.in/ns/extensions/ui#peakProtocol +#define LV2_UI__resize LV2_UI_PREFIX "resize" ///< http://lv2plug.in/ns/extensions/ui#resize +#define LV2_UI__showInterface LV2_UI_PREFIX "showInterface" ///< http://lv2plug.in/ns/extensions/ui#showInterface +#define LV2_UI__touch LV2_UI_PREFIX "touch" ///< http://lv2plug.in/ns/extensions/ui#touch +#define LV2_UI__ui LV2_UI_PREFIX "ui" ///< http://lv2plug.in/ns/extensions/ui#ui +#define LV2_UI__updateRate LV2_UI_PREFIX "updateRate" ///< http://lv2plug.in/ns/extensions/ui#updateRate +#define LV2_UI__windowTitle LV2_UI_PREFIX "windowTitle" ///< http://lv2plug.in/ns/extensions/ui#windowTitle +#define LV2_UI__scaleFactor LV2_UI_PREFIX "scaleFactor" ///< http://lv2plug.in/ns/extensions/ui#scaleFactor +#define LV2_UI__foregroundColor LV2_UI_PREFIX "foregroundColor" ///< http://lv2plug.in/ns/extensions/ui#foregroundColor +#define LV2_UI__backgroundColor LV2_UI_PREFIX "backgroundColor" ///< http://lv2plug.in/ns/extensions/ui#backgroundColor + +// clang-format on + +/** + The index returned by LV2UI_Port_Map::port_index() for unknown ports. +*/ +#define LV2UI_INVALID_PORT_INDEX ((uint32_t)-1) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + A pointer to some widget or other type of UI handle. + + The actual type is defined by the type of the UI. +*/ +typedef void* LV2UI_Widget; + +/** + A pointer to UI instance internals. + + The host may compare this to NULL, but otherwise MUST NOT interpret it. +*/ +typedef void* LV2UI_Handle; + +/** + A pointer to a controller provided by the host. + + The UI may compare this to NULL, but otherwise MUST NOT interpret it. +*/ +typedef void* LV2UI_Controller; + +/** + A pointer to opaque data for a feature. +*/ +typedef void* LV2UI_Feature_Handle; + +/** + A host-provided function that sends data to a plugin's input ports. + + @param controller The opaque controller pointer passed to + LV2UI_Descriptor::instantiate(). + + @param port_index Index of the port to update. + + @param buffer Buffer containing `buffer_size` bytes of data. + + @param buffer_size Size of `buffer` in bytes. + + @param port_protocol Either 0 or the URID for a ui:PortProtocol. If 0, the + protocol is implicitly ui:floatProtocol, the port MUST be an lv2:ControlPort + input, `buffer` MUST point to a single float value, and `buffer_size` MUST + be sizeof(float). The UI SHOULD NOT use a protocol not supported by the + host, but the host MUST gracefully ignore any protocol it does not + understand. +*/ +typedef void (*LV2UI_Write_Function)(LV2UI_Controller controller, + uint32_t port_index, + uint32_t buffer_size, + uint32_t port_protocol, + const void* buffer); + +/** + A plugin UI. + + A pointer to an object of this type is returned by the lv2ui_descriptor() + function. +*/ +typedef struct LV2UI_Descriptor { + /** + The URI for this UI (not for the plugin it controls). + */ + const char* URI; + + /** + Create a new UI and return a handle to it. This function works + similarly to LV2_Descriptor::instantiate(). + + @param descriptor The descriptor for the UI to instantiate. + + @param plugin_uri The URI of the plugin that this UI will control. + + @param bundle_path The path to the bundle containing this UI, including + the trailing directory separator. + + @param write_function A function that the UI can use to send data to the + plugin's input ports. + + @param controller A handle for the UI instance to be passed as the + first parameter of UI methods. + + @param widget (output) widget pointer. The UI points this at its main + widget, which has the type defined by the UI type in the data file. + + @param features An array of LV2_Feature pointers. The host must pass + all feature URIs that it and the UI supports and any additional data, as + in LV2_Descriptor::instantiate(). Note that UI features and plugin + features are not necessarily the same. + + */ + LV2UI_Handle (*instantiate)(const struct LV2UI_Descriptor* descriptor, + const char* plugin_uri, + const char* bundle_path, + LV2UI_Write_Function write_function, + LV2UI_Controller controller, + LV2UI_Widget* widget, + const LV2_Feature* const* features); + + /** + Destroy the UI. The host must not try to access the widget after + calling this function. + */ + void (*cleanup)(LV2UI_Handle ui); + + /** + Tell the UI that something interesting has happened at a plugin port. + + What is "interesting" and how it is written to `buffer` is defined by + `format`, which has the same meaning as in LV2UI_Write_Function(). + Format 0 is a special case for lv2:ControlPort, where this function + should be called when the port value changes (but not necessarily for + every change), `buffer_size` must be sizeof(float), and `buffer` + points to a single IEEE-754 float. + + By default, the host should only call this function for lv2:ControlPort + inputs. However, the UI can request updates for other ports statically + with ui:portNotification or dynamicaly with ui:portSubscribe. + + The UI MUST NOT retain any reference to `buffer` after this function + returns, it is only valid for the duration of the call. + + This member may be NULL if the UI is not interested in any port events. + */ + void (*port_event)(LV2UI_Handle ui, + uint32_t port_index, + uint32_t buffer_size, + uint32_t format, + const void* buffer); + + /** + Return a data structure associated with an extension URI, typically an + interface struct with additional function pointers + + This member may be set to NULL if the UI is not interested in supporting + any extensions. This is similar to LV2_Descriptor::extension_data(). + + */ + const void* (*extension_data)(const char* uri); +} LV2UI_Descriptor; + +/** + Feature/interface for resizable UIs (LV2_UI__resize). + + This structure is used in two ways: as a feature passed by the host via + LV2UI_Descriptor::instantiate(), or as an interface provided by a UI via + LV2UI_Descriptor::extension_data()). +*/ +typedef struct { + /** + Pointer to opaque data which must be passed to ui_resize(). + */ + LV2UI_Feature_Handle handle; + + /** + Request/advertise a size change. + + When provided by the host, the UI may call this function to inform the + host about the size of the UI. + + When provided by the UI, the host may call this function to notify the + UI that it should change its size accordingly. In this case, the host + must pass the LV2UI_Handle to provide access to the UI instance. + + @return 0 on success. + */ + int (*ui_resize)(LV2UI_Feature_Handle handle, int width, int height); +} LV2UI_Resize; + +/** + Feature to map port symbols to UIs. + + This can be used by the UI to get the index for a port with the given + symbol. This makes it possible to implement and distribute a UI separately + from the plugin (since symbol, unlike index, is a stable port identifier). +*/ +typedef struct { + /** + Pointer to opaque data which must be passed to port_index(). + */ + LV2UI_Feature_Handle handle; + + /** + Get the index for the port with the given `symbol`. + + @return The index of the port, or LV2UI_INVALID_PORT_INDEX if no such + port is found. + */ + uint32_t (*port_index)(LV2UI_Feature_Handle handle, const char* symbol); +} LV2UI_Port_Map; + +/** + Feature to subscribe to port updates (LV2_UI__portSubscribe). +*/ +typedef struct { + /** + Pointer to opaque data which must be passed to subscribe() and + unsubscribe(). + */ + LV2UI_Feature_Handle handle; + + /** + Subscribe to updates for a port. + + This means that the host will call the UI's port_event() function when + the port value changes (as defined by protocol). + + Calling this function with the same `port_index` and `port_protocol` + as an already active subscription has no effect. + + @param handle The handle field of this struct. + @param port_index The index of the port. + @param port_protocol The URID of the ui:PortProtocol. + @param features Features for this subscription. + @return 0 on success. + */ + uint32_t (*subscribe)(LV2UI_Feature_Handle handle, + uint32_t port_index, + uint32_t port_protocol, + const LV2_Feature* const* features); + + /** + Unsubscribe from updates for a port. + + This means that the host will cease calling calling port_event() when + the port value changes. + + Calling this function with a `port_index` and `port_protocol` that + does not refer to an active port subscription has no effect. + + @param handle The handle field of this struct. + @param port_index The index of the port. + @param port_protocol The URID of the ui:PortProtocol. + @param features Features for this subscription. + @return 0 on success. + */ + uint32_t (*unsubscribe)(LV2UI_Feature_Handle handle, + uint32_t port_index, + uint32_t port_protocol, + const LV2_Feature* const* features); +} LV2UI_Port_Subscribe; + +/** + A feature to notify the host that the user has grabbed a UI control. +*/ +typedef struct { + /** + Pointer to opaque data which must be passed to touch(). + */ + LV2UI_Feature_Handle handle; + + /** + Notify the host that a control has been grabbed or released. + + The host should cease automating the port or otherwise manipulating the + port value until the control has been ungrabbed. + + @param handle The handle field of this struct. + @param port_index The index of the port associated with the control. + @param grabbed If true, the control has been grabbed, otherwise the + control has been released. + */ + void (*touch)(LV2UI_Feature_Handle handle, uint32_t port_index, bool grabbed); +} LV2UI_Touch; + +/** + A status code for LV2UI_Request_Value::request(). +*/ +typedef enum { + /** + Completed successfully. + + The host will set the parameter later if the user choses a new value. + */ + LV2UI_REQUEST_VALUE_SUCCESS, + + /** + Parameter already being requested. + + The host is already requesting a parameter from the user (for example, a + dialog is visible), or the UI is otherwise busy and can not make this + request. + */ + LV2UI_REQUEST_VALUE_BUSY, + + /** + Unknown parameter. + + The host is not aware of this parameter, and is not able to set a new + value for it. + */ + LV2UI_REQUEST_VALUE_ERR_UNKNOWN, + + /** + Unsupported parameter. + + The host knows about this parameter, but does not support requesting a + new value for it from the user. This is likely because the host does + not have UI support for choosing a value with the appropriate type. + */ + LV2UI_REQUEST_VALUE_ERR_UNSUPPORTED +} LV2UI_Request_Value_Status; + +/** + A feature to request a new parameter value from the host. +*/ +typedef struct { + /** + Pointer to opaque data which must be passed to request(). + */ + LV2UI_Feature_Handle handle; + + /** + Request a value for a parameter from the host. + + This is mainly used by UIs to request values for complex parameters that + don't change often, such as file paths, but it may be used to request + any parameter value. + + This function returns immediately, and the return value indicates + whether the host can fulfill the request. The host may notify the + plugin about the new parameter value, for example when a file is + selected by the user, via the usual mechanism. Typically, the host will + send a message to the plugin that sets the new parameter value, and the + plugin will notify the UI via a message as usual for any other parameter + change. + + To provide an appropriate UI, the host can determine details about the + parameter from the plugin data as usual. The additional parameters of + this function provide support for more advanced use cases, but in the + simple common case, the plugin will simply pass the key of the desired + parameter and zero for everything else. + + @param handle The handle field of this struct. + + @param key The URID of the parameter. + + @param type The optional type of the value to request. This can be used + to request a specific value type for parameters that support several. + If non-zero, it must be the URID of an instance of rdfs:Class or + rdfs:Datatype. + + @param features Additional features for this request, or NULL. + + @return A status code which is 0 on success. + */ + LV2UI_Request_Value_Status (*request)(LV2UI_Feature_Handle handle, + LV2_URID key, + LV2_URID type, + const LV2_Feature* const* features); + +} LV2UI_Request_Value; + +/** + UI Idle Interface (LV2_UI__idleInterface) + + UIs can provide this interface to have an idle() callback called by the host + rapidly to update the UI. +*/ +typedef struct { + /** + Run a single iteration of the UI's idle loop. + + This will be called rapidly in the UI thread at a rate appropriate + for a toolkit main loop. There are no precise timing guarantees, but + the host should attempt to call idle() at a high enough rate for smooth + animation, at least 30Hz. + + @return non-zero if the UI has been closed, in which case the host + should stop calling idle(), and can either completely destroy the UI, or + re-show it and resume calling idle(). + */ + int (*idle)(LV2UI_Handle ui); +} LV2UI_Idle_Interface; + +/** + UI Show Interface (LV2_UI__showInterface) + + UIs can provide this interface to show and hide a window, which allows them + to function in hosts unable to embed their widget. This allows any UI to + provide a fallback for embedding that works in any host. + + If used: + - The host MUST use LV2UI_Idle_Interface to drive the UI. + - The UI MUST return non-zero from LV2UI_Idle_Interface::idle() when it has + been closed. + - If idle() returns non-zero, the host MUST call hide() and stop calling + idle(). It MAY later call show() then resume calling idle(). +*/ +typedef struct { + /** + Show a window for this UI. + + The window title MAY have been passed by the host to + LV2UI_Descriptor::instantiate() as an LV2_Options_Option with key + LV2_UI__windowTitle. + + @return 0 on success, or anything else to stop being called. + */ + int (*show)(LV2UI_Handle ui); + + /** + Hide the window for this UI. + + @return 0 on success, or anything else to stop being called. + */ + int (*hide)(LV2UI_Handle ui); +} LV2UI_Show_Interface; + +/** + Peak data for a slice of time, the update format for ui:peakProtocol. +*/ +typedef struct { + /** + The start of the measurement period. This is just a running counter + that is only meaningful in comparison to previous values and must not be + interpreted as an absolute time. + */ + uint32_t period_start; + + /** + The size of the measurement period, in the same units as period_start. + */ + uint32_t period_size; + + /** + The peak value for the measurement period. This should be the maximal + value for abs(sample) over all the samples in the period. + */ + float peak; +} LV2UI_Peak_Data; + +/** + Prototype for UI accessor function. + + This is the entry point to a UI library, which works in the same way as + lv2_descriptor() but for UIs rather than plugins. +*/ +LV2_SYMBOL_EXPORT +const LV2UI_Descriptor* +lv2ui_descriptor(uint32_t index); + +/** + The type of the lv2ui_descriptor() function. +*/ +typedef const LV2UI_Descriptor* (*LV2UI_DescriptorFunction)(uint32_t index); + +#ifdef __cplusplus +} +#endif + +/** + @} +*/ + +#endif /* LV2_UI_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,627 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 UI" ; + doap:shortdesc "User interfaces for LV2 plugins." ; + doap:created "2006-00-00" ; + doap:developer ; + doap:maintainer ; + doap:release [ + doap:revision "2.22" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add ui:requestValue feature." + ] , [ + rdfs:label "Add ui:scaleFactor, ui:foregroundColor, and ui:backgroundColor properties." + ] , [ + rdfs:label "Deprecate ui:binary." + ] + ] + ] , [ + doap:revision "2.20" ; + doap:created "2015-07-25" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] , [ + rdfs:label "Add missing property labels." + ] + ] + ] , [ + doap:revision "2.18" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add show interface so UIs can gracefully degrade to separate windows if hosts can not use their widget directly." + ] , [ + rdfs:label "Fix identifier typos in documentation." + ] + ] + ] , [ + doap:revision "2.16" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix LV2_UI_INVALID_PORT_INDEX identifier in documentation." + ] + ] + ] , [ + doap:revision "2.14" ; + doap:created "2013-03-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add idle interface so native UIs and foreign toolkits can drive their event loops." + ] , [ + rdfs:label "Add ui:updateRate property." + ] + ] + ] , [ + doap:revision "2.12" ; + doap:created "2012-12-01" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect linker flag in ui:makeSONameResident documentation." + ] + ] + ] , [ + doap:revision "2.10" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add types for WindowsUI, CocoaUI, and Gtk3UI." + ] , [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add missing LV2_SYMBOL_EXPORT declaration for lv2ui_descriptor prototype." + ] + ] + ] , [ + doap:revision "2.8" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add ui:parent and ui:resize." + ] , [ + rdfs:label "Add support for referring to ports by symbol." + ] , [ + rdfs:label "Add ui:portMap for accessing ports by symbol, allowing for UIs to be distributed separately from plugins." + ] , [ + rdfs:label "Add port protocols and a dynamic notification subscription mechanism, for more flexible communication, and audio port metering without control port kludges." + ] , [ + rdfs:label "Add touch feature to notify the host that the user has grabbed a control." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Deprecate ui:makeSONameResident." + ] , [ + rdfs:label "Add Qt4 and X11 widget types." + ] , [ + rdfs:label "Install header to URI-based system path." + ] , [ + rdfs:label "Add pkg-config file." + ] , [ + rdfs:label "Make ui.ttl a valid OWL 2 DL ontology." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] , [ + rdfs:label "Use lv2:Specification to be discovered as an extension." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2010-10-06" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension makes it possible to create user interfaces for LV2 plugins. + +UIs are implemented as an LV2UI_Descriptor loaded via lv2ui_descriptor() in a +shared library, and are distributed in bundles just like plugins. + +UIs are associated with plugins in data: + + :::turtle + @prefix ui: . + + ui:ui . + a ui:X11UI ; + lv2:binary . + +where `http://my.plugin` is the URI of the plugin, `http://my.pluginui` is the +URI of the plugin UI and `myui.so` is the relative URI to the shared object +file. + +While it is possible to have the plugin UI and the plugin in the same shared +object file, it is a good idea to keep them separate so that hosts can avoid +loading the UI code if they do not need it. A UI MUST specify its class in the +RDF data (`ui:X11UI` in the above example). The class defines what type the UI +is, for example what graphics toolkit it uses. Any type of UI class can be +defined separately from this extension. + +It is possible to have multiple UIs for the same plugin, or to have the UI for +a plugin in a different bundle from the actual plugin. This allows plugin UIs +to be written independently. + +Note that the process that loads the shared object file containing the UI code +and the process that loads the shared object file containing the actual plugin +implementation are not necessarily the same process (and not even necessarily +on the same machine). This means that plugin and UI code MUST NOT use +singletons and global variables and expect them to refer to the same objects in +the UI and the actual plugin. The function callback interface defined in this +header is the only method of communication between UIs and plugin instances +(extensions may define more, though this is discouraged unless absolutely +necessary since the significant benefits of network transparency and +serialisability are lost). + +UI functionality may be extended via features, much like plugins: + + :::turtle + lv2:requiredFeature . + lv2:optionalFeature . + +The rules for a UI with a required or optional feature are identical to those +of lv2:Plugin instances: if a UI declares a feature as required, the host is +NOT allowed to load it unless it supports that feature; and if it does support +a feature, it MUST pass an appropriate LV2_Feature struct to the UI's +instantiate() method. This extension defines several standard features for +common functionality. + +UIs written to this specification do not need to be thread-safe. All functions +may only be called in the UI thread. There is only one UI thread (for +toolkits, the one the UI main loop runs in). There is no requirement that a +UI actually be a graphical widget. + +Note that UIs are completely separate from plugins. From the plugin's +perspective, control from a UI is indistinguishable from any other control, as +it all occcurs via ports. + +"""^^lv2:Markdown . + +ui:GtkUI + lv2:documentation """ + +The host must guarantee that the Gtk+ 2 library has been initialised and the +Glib main loop is running before the UI is instantiated. Note that this UI +type is not suitable for binary distribution since multiple versions of Gtk can +not be used in the same process. + +"""^^lv2:Markdown . + +ui:Gtk3UI + lv2:documentation """ + +The host must guarantee that the Gtk+ 3 library has been initialised and the +Glib main loop is running before the UI is instantiated. Note that this UI +type is not suitable for binary distribution since multiple versions of Gtk can +not be used in the same process. + +"""^^lv2:Markdown . + +ui:Qt4UI + lv2:documentation """ + +The host must guarantee that the Qt4 library has been initialised and the Qt4 +main loop is running before the UI is instantiated. Note that this UI type is +not suitable for binary distribution since multiple versions of Qt can not be +used in the same process. + +"""^^lv2:Markdown . + +ui:Qt5UI + lv2:documentation """ + +The host must guarantee that the Qt5 library has been initialised and the Qt5 +main loop is running before the UI is instantiated. Note that this UI type is +not suitable for binary distribution since multiple versions of Qt can not be +used in the same process. + +"""^^lv2:Markdown . + +ui:X11UI + lv2:documentation """ + +Note that the LV2UI_Widget for this type of UI is not a pointer, but should be +interpreted directly as an X11 `Window` ID. This is the native UI type on most +POSIX systems. + +"""^^lv2:Markdown . + +ui:WindowsUI + lv2:documentation """ + +Note that the LV2UI_Widget for this type of UI is not a pointer, but should be +interpreted directly as a `HWND`. This is the native UI type on Microsoft +Windows. + +"""^^lv2:Markdown . + +ui:CocoaUI + lv2:documentation """ + +This is the native UI type on Mac OS X. + +"""^^lv2:Markdown . + +ui:binary + lv2:documentation """ + +This property is redundant and deprecated: new UIs should use lv2:binary +instead, however hosts must still support ui:binary. + +"""^^lv2:Markdown . + +ui:makeSONameResident + lv2:documentation """ + +This feature was intended to support UIs that link against toolkit libraries +which may not be unloaded during the lifetime of the host. This is better +achieved by using the appropriate flags when linking the UI, for example `gcc +-Wl,-z,nodelete`. + +"""^^lv2:Markdown . + +ui:noUserResize + lv2:documentation """ + +If a UI has this feature, it indicates that it does not make sense to let the +user resize the main widget, and the host should prevent that. This feature +may not make sense for all UI types. The data pointer for this feature should +always be set to NULL. + +"""^^lv2:Markdown . + +ui:fixedSize + lv2:documentation """ + +If a UI has this feature, it indicates the same thing as ui:noUserResize, and +additionally that the UI will not resize itself on its own. That is, the UI +will always remain the same size. This feature may not make sense for all UI +types. The data pointer for this feature should always be set to NULL. + +"""^^lv2:Markdown . + +ui:scaleFactor + lv2:documentation """ + +HiDPI (High Dots Per Inch) displays have a high resolution on a relatively +small form factor. Many systems use a scale factor to compensate for this, so +for example, a scale factor of 2 means things are drawn twice as large as +normal. + +Hosts can pass this as an option to UIs to communicate this information, so +that the UI can draw at an appropriate scale. + +"""^^lv2:Markdown . + +ui:backgroundColor + lv2:documentation """ + +The background color of the host's UI. The host can pass this as an option so +that UIs can integrate nicely with the host window around it. + +Hosts should pass this as an option to UIs with an integer RGBA32 color value. +If the value is a 32-bit integer, it is guaranteed to be in RGBA32 format, but +the UI must check the value type and not assume this, to allow for other types +of color in the future. + +"""^^lv2:Markdown . + +ui:foregroundColor + lv2:documentation """ + +The foreground color of the host's UI. The host can pass this as an option so +that UIs can integrate nicely with the host window around it. + +Hosts should pass this as an option to UIs with an integer RGBA32 color value. +If the value is a 32-bit integer, it is guaranteed to be in RGBA32 format, but +the UI must check the value type and not assume this, to allow for other types +of color in the future. + +"""^^lv2:Markdown . + +ui:parent + lv2:documentation """ + +This feature can be used to pass a parent that the UI should be a child of. +The format of data pointer of this feature is determined by the UI type, and is +generally the same type as the LV2UI_Widget that the UI would return. For +example, for a ui:X11UI, the parent should be a `Window`. This is particularly +useful for embedding, where the parent often must be known at construction time +for embedding to work correctly. + +UIs should not _require_ this feature unless it is necessary for them to work +at all, but hosts should provide it whenever possible. + +"""^^lv2:Markdown . + +ui:PortNotification + lv2:documentation """ + +This describes which ports the host must send notifications to the UI about. +The port must be specific either by index, using the ui:portIndex property, or +symbol, using the lv2:symbol property. Since port indices are not guaranteed +to be stable, using the symbol is recommended, and the inde MUST NOT be used +except by UIs that are shipped in the same bundle as the corresponding plugin. + +"""^^lv2:Markdown . + +ui:portNotification + lv2:documentation """ + +Specifies that a UI should receive notifications about changes to a particular +port's value via LV2UI_Descriptor::port_event(). + +For example: + + :::turtle + eg:ui + a ui:X11UI ; + ui:portNotification [ + ui:plugin eg:plugin ; + lv2:symbol "gain" ; + ui:protocol ui:floatProtocol + ] . + +"""^^lv2:Markdown . + +ui:notifyType + lv2:documentation """ + +Specifies a particular type that the UI should be notified of. + +This is useful for message-based ports where several types of data can be +present, but only some are interesting to the UI. For example, if UI control +is multiplexed in the same port as MIDI, this property can be used to ensure +that only the relevant events are forwarded to the UI, and not potentially high +frequency MIDI data. + +"""^^lv2:Markdown . + +ui:resize + lv2:documentation """ + +This feature corresponds to the LV2UI_Resize struct, which should be passed +with the URI LV2_UI__resize. This struct may also be provided by the UI as +extension data using the same URI, in which case it is used by the host to +request that the UI change its size. + +"""^^lv2:Markdown . + +ui:portMap + lv2:documentation """ + +This makes it possible to implement and distribute UIs separately from the +plugin binaries they control. + +This feature corresponds to the LV2UI_Port_Index struct, which should be passed +with the URI LV2_UI__portIndex. + +"""^^lv2:Markdown . + +ui:portSubscribe + lv2:documentation """ + +This makes it possible for a UI to explicitly request a particular style of +update from a port at run-time, in a more flexible and powerful way than +listing subscriptions statically allows. + +This feature corresponds to the LV2UI_Port_Subscribe struct, which should be +passed with the URI LV2_UI__portSubscribe. + +"""^^lv2:Markdown . + +ui:touch + lv2:documentation """ + +This is useful for automation, so the host can allow the user to take control +of a port, even if that port would otherwise be automated (much like grabbing a +physical motorised fader). + +It can also be used for MIDI learn or in any other situation where the host +needs to do something with a particular control and it would be convenient for +the user to select it directly from the plugin UI. + +This feature corresponds to the LV2UI_Touch struct, which should be passed with +the URI LV2_UI__touch. + +"""^^lv2:Markdown . + +ui:requestValue + lv2:documentation """ + +This allows a plugin UI to request a new parameter value using the host's UI, +for example by showing a dialog or integrating with the host's built-in content +browser. This should only be used for complex parameter types where the plugin +UI is not capable of showing the expected native platform or host interface to +choose a value, such as file path parameters. + +This feature corresponds to the LV2UI_Request_Value struct, which should be +passed with the URI LV2_UI__requestValue. + +"""^^lv2:Markdown . + +ui:idleInterface + lv2:documentation """ + +To support this feature, the UI should list it as a lv2:optionalFeature or +lv2:requiredFeature in its data, and also as lv2:extensionData. When the UI's +extension_data() is called with this URI (LV2_UI__idleInterface), it should +return a pointer to an LV2UI_Idle_Interface. + +To indicate support, the host should pass a feature to instantiate() with this +URI, with NULL for data. + +"""^^lv2:Markdown . + +ui:showInterface + lv2:documentation """ + +This allows UIs to gracefully degrade to separate windows when the host is +unable to embed the UI widget for whatever reason. When the UI's +extension_data() is called with this URI (LV2_UI__showInterface), it should +return a pointer to an LV2UI_Show_Interface. + +"""^^lv2:Markdown . + +ui:PortProtocol + lv2:documentation """ + +A PortProtocol MUST define: + +Port Type +: Which plugin port types the buffer type is valid for. + +Feature Data +: What data (if any) should be passed in the LV2_Feature. + +A PortProtocol for an output port MUST define: + +Update Frequency +: When the host should call port_event(). + +Update Format +: The format of the data in the buffer passed to port_event(). + +Options +: The format of the options passed to subscribe() and unsubscribe(). + +A PortProtocol for an input port MUST define: + +Write Format +: The format of the data in the buffer passed to write_port(). + +Write Effect +: What happens when the UI calls write_port(). + +For an example, see ui:floatProtocol or ui:peakProtocol. + +PortProtocol is a subclass of lv2:Feature, so UIs use lv2:optionalFeature and +lv2:requiredFeature to specify which PortProtocols they want to use. + +"""^^lv2:Markdown . + +ui:floatProtocol + lv2:documentation """ + +A protocol for transferring single floating point values. The rules for this +protocol are: + +Port Type +: lv2:ControlPort + +Feature Data +: None. + +Update Frequency +: The host SHOULD call port_event() as soon as possible when the port value has + changed, but there are no timing guarantees. + +Update Format +: A single float. + +Options +: None. + +Write Format +: A single float. + +Write Effect +: The host SHOULD set the port to the received value as soon as possible, but + there is no guarantee that run() actually sees this value. + +"""^^lv2:Markdown . + +ui:peakProtocol + lv2:documentation """ + +This port protocol defines a way for the host to send continuous peak +measurements of the audio signal at a certain port to the UI. The intended use +is visualisation, for example an animated meter widget that shows the level of +the audio input or output. + +A contiguous sequence of audio samples for which a peak value has been computed +is called a _measurement period_. + +The rules for this protocol are: + +Port Type +: lv2:AudioPort + +Feature Data +: None. + +Update Frequency +: The host SHOULD call port_event() at regular intervals. The measurement + periods used for calls to port_event() for the same port SHOULD be + contiguous (i.e. the measurement period for one call should begin right + after the end of the measurement period for the previous call ends) unless + the UI has removed and re-added the port subscription between those calls. + However, UIs MUST NOT depend on either the regularity of the calls or the + contiguity of the measurement periods; hosts may change the call rate or + skip calls for performance or other reasons. Measurement periods for + different calls to port_event() for the same port MUST NOT overlap. + +Update Format +: A single LV2UI_Peak_Data object. + +Options +: None. + +Write Format +: None. + +Write Effect +: None. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,248 @@ +@prefix lv2: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 UI" ; + rdfs:comment "User interfaces for LV2 plugins." ; + owl:imports ; + rdfs:seeAlso , + . + +ui:UI + a rdfs:Class , + owl:Class ; + rdfs:label "User Interface" ; + rdfs:comment "A UI for an LV2 plugin." . + +ui:GtkUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "GTK2 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Gtk+ 2.0 GtkWidget." . + +ui:Gtk3UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "GTK3 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Gtk+ 3.0 GtkWidget." . + +ui:Qt4UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Qt4 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Qt4 QWidget." . + +ui:Qt5UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Qt5 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Qt5 QWidget." . + +ui:X11UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "X11 UI" ; + rdfs:comment "A UI where the widget is an X11 Window window ID." . + +ui:WindowsUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Windows UI" ; + rdfs:comment "A UI where the widget is a Windows HWND window ID." . + +ui:CocoaUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Cocoa UI" ; + rdfs:comment "A UI where the widget is a pointer to a NSView." . + +ui:ui + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:Plugin ; + rdfs:range ui:UI ; + rdfs:label "user interface" ; + rdfs:comment "Relates a plugin to a UI that applies to it." . + +ui:binary + a rdf:Property , + owl:ObjectProperty ; + owl:sameAs lv2:binary ; + owl:deprecated "true"^^xsd:boolean ; + rdfs:label "binary" ; + rdfs:comment "The shared library that a UI resides in." . + +ui:makeSONameResident + a lv2:Feature ; + owl:deprecated "true"^^xsd:boolean ; + rdfs:label "make SO name resident" ; + rdfs:comment "UI binary must not be unloaded." . + +ui:noUserResize + a lv2:Feature ; + rdfs:label "no user resize" ; + rdfs:comment "Non-resizable UI." . + +ui:fixedSize + a lv2:Feature ; + rdfs:label "fixed size" ; + rdfs:comment "Non-resizable UI that will never resize itself." . + +ui:scaleFactor + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:range xsd:float ; + rdfs:label "scale factor" ; + rdfs:comment "Scale factor for high resolution screens." . + +ui:backgroundColor + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "background color" ; + rdfs:comment """The background color of the host's UI.""" . + +ui:foregroundColor + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "foreground color" ; + rdfs:comment """The foreground color of the host's UI.""" . + +ui:parent + a lv2:Feature ; + rdfs:label "parent" ; + rdfs:comment "The parent for a UI." . + +ui:PortNotification + a rdfs:Class , + owl:Class ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty ui:plugin ; + owl:cardinality 1 ; + rdfs:comment "A PortNotification MUST have exactly one ui:plugin." + ] ; + rdfs:label "Port Notification" ; + rdfs:comment "A description of port updates that a host must send a UI." . + +ui:portNotification + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:UI ; + rdfs:range ui:PortNotification ; + rdfs:label "port notification" ; + rdfs:comment "Specifies a port notification that is required by a UI." . + +ui:plugin + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range lv2:Plugin ; + rdfs:label "plugin" ; + rdfs:comment "The plugin a portNotification applies to." . + +ui:portIndex + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range xsd:decimal ; + rdfs:label "port index" ; + rdfs:comment "The index of the port a portNotification applies to." . + +ui:notifyType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:label "notify type" ; + rdfs:comment "A particular type that the UI should be notified of." . + +ui:resize + a lv2:Feature , + lv2:ExtensionData ; + rdfs:label "resize" ; + rdfs:comment """A feature that control of, and notifications about, a UI's size.""" . + +ui:portMap + a lv2:Feature ; + rdfs:label "port map" ; + rdfs:comment "A feature for accessing the index of a port by symbol." . + +ui:portSubscribe + a lv2:Feature ; + rdfs:label "port subscribe" ; + rdfs:comment "A feature for dynamically subscribing to updates from a port." . + +ui:touch + a lv2:Feature ; + rdfs:label "touch" ; + rdfs:comment "A feature to notify that the user has grabbed a port control." . + +ui:requestValue + a lv2:Feature ; + rdfs:label "request value" ; + rdfs:comment "A feature to request a parameter value from the user via the host." . + +ui:idleInterface + a lv2:Feature , + lv2:ExtensionData ; + rdfs:label "idle interface" ; + rdfs:comment "A feature that provides a callback for the host to drive the UI." . + +ui:showInterface + a lv2:ExtensionData ; + rdfs:label "show interface" ; + rdfs:comment "An interface for showing and hiding a window for a UI." . + +ui:windowTitle + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:string ; + rdfs:label "window title" ; + rdfs:comment "The title for the window shown by LV2UI_Show_Interface." . + +ui:updateRate + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:float ; + rdfs:label "update rate" ; + rdfs:comment "The target rate, in Hz, to send updates to the UI." . + +ui:protocol + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range ui:PortProtocol ; + rdfs:label "protocol" ; + rdfs:comment "The protocol to be used for this notification." . + +ui:PortProtocol + a rdfs:Class ; + rdfs:subClassOf lv2:Feature ; + rdfs:label "Port Protocol" ; + rdfs:comment "A method to communicate port data between a UI and plugin." . + +ui:floatProtocol + a ui:PortProtocol ; + rdfs:label "float protocol" ; + rdfs:comment "A protocol for transferring single floating point values." . + +ui:peakProtocol + a ui:PortProtocol ; + rdfs:label "peak protocol" ; + rdfs:comment "A protocol for sending continuous peak measurements of an audio signal." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 5 ; + lv2:microVersion 12 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,75 @@ +/* + Copyright 2012-2016 David Robillard + + 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. +*/ + +#ifndef LV2_UNITS_H +#define LV2_UNITS_H + +/** + @defgroup units Units + @ingroup lv2 + + Units for LV2 values. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_UNITS_URI "http://lv2plug.in/ns/extensions/units" ///< http://lv2plug.in/ns/extensions/units +#define LV2_UNITS_PREFIX LV2_UNITS_URI "#" ///< http://lv2plug.in/ns/extensions/units# + +#define LV2_UNITS__Conversion LV2_UNITS_PREFIX "Conversion" ///< http://lv2plug.in/ns/extensions/units#Conversion +#define LV2_UNITS__Unit LV2_UNITS_PREFIX "Unit" ///< http://lv2plug.in/ns/extensions/units#Unit +#define LV2_UNITS__bar LV2_UNITS_PREFIX "bar" ///< http://lv2plug.in/ns/extensions/units#bar +#define LV2_UNITS__beat LV2_UNITS_PREFIX "beat" ///< http://lv2plug.in/ns/extensions/units#beat +#define LV2_UNITS__bpm LV2_UNITS_PREFIX "bpm" ///< http://lv2plug.in/ns/extensions/units#bpm +#define LV2_UNITS__cent LV2_UNITS_PREFIX "cent" ///< http://lv2plug.in/ns/extensions/units#cent +#define LV2_UNITS__cm LV2_UNITS_PREFIX "cm" ///< http://lv2plug.in/ns/extensions/units#cm +#define LV2_UNITS__coef LV2_UNITS_PREFIX "coef" ///< http://lv2plug.in/ns/extensions/units#coef +#define LV2_UNITS__conversion LV2_UNITS_PREFIX "conversion" ///< http://lv2plug.in/ns/extensions/units#conversion +#define LV2_UNITS__db LV2_UNITS_PREFIX "db" ///< http://lv2plug.in/ns/extensions/units#db +#define LV2_UNITS__degree LV2_UNITS_PREFIX "degree" ///< http://lv2plug.in/ns/extensions/units#degree +#define LV2_UNITS__frame LV2_UNITS_PREFIX "frame" ///< http://lv2plug.in/ns/extensions/units#frame +#define LV2_UNITS__hz LV2_UNITS_PREFIX "hz" ///< http://lv2plug.in/ns/extensions/units#hz +#define LV2_UNITS__inch LV2_UNITS_PREFIX "inch" ///< http://lv2plug.in/ns/extensions/units#inch +#define LV2_UNITS__khz LV2_UNITS_PREFIX "khz" ///< http://lv2plug.in/ns/extensions/units#khz +#define LV2_UNITS__km LV2_UNITS_PREFIX "km" ///< http://lv2plug.in/ns/extensions/units#km +#define LV2_UNITS__m LV2_UNITS_PREFIX "m" ///< http://lv2plug.in/ns/extensions/units#m +#define LV2_UNITS__mhz LV2_UNITS_PREFIX "mhz" ///< http://lv2plug.in/ns/extensions/units#mhz +#define LV2_UNITS__midiNote LV2_UNITS_PREFIX "midiNote" ///< http://lv2plug.in/ns/extensions/units#midiNote +#define LV2_UNITS__mile LV2_UNITS_PREFIX "mile" ///< http://lv2plug.in/ns/extensions/units#mile +#define LV2_UNITS__min LV2_UNITS_PREFIX "min" ///< http://lv2plug.in/ns/extensions/units#min +#define LV2_UNITS__mm LV2_UNITS_PREFIX "mm" ///< http://lv2plug.in/ns/extensions/units#mm +#define LV2_UNITS__ms LV2_UNITS_PREFIX "ms" ///< http://lv2plug.in/ns/extensions/units#ms +#define LV2_UNITS__name LV2_UNITS_PREFIX "name" ///< http://lv2plug.in/ns/extensions/units#name +#define LV2_UNITS__oct LV2_UNITS_PREFIX "oct" ///< http://lv2plug.in/ns/extensions/units#oct +#define LV2_UNITS__pc LV2_UNITS_PREFIX "pc" ///< http://lv2plug.in/ns/extensions/units#pc +#define LV2_UNITS__prefixConversion LV2_UNITS_PREFIX "prefixConversion" ///< http://lv2plug.in/ns/extensions/units#prefixConversion +#define LV2_UNITS__render LV2_UNITS_PREFIX "render" ///< http://lv2plug.in/ns/extensions/units#render +#define LV2_UNITS__s LV2_UNITS_PREFIX "s" ///< http://lv2plug.in/ns/extensions/units#s +#define LV2_UNITS__semitone12TET LV2_UNITS_PREFIX "semitone12TET" ///< http://lv2plug.in/ns/extensions/units#semitone12TET +#define LV2_UNITS__symbol LV2_UNITS_PREFIX "symbol" ///< http://lv2plug.in/ns/extensions/units#symbol +#define LV2_UNITS__unit LV2_UNITS_PREFIX "unit" ///< http://lv2plug.in/ns/extensions/units#unit + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_UNITS_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,154 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix units: . + + + a doap:Project ; + doap:name "LV2 Units" ; + doap:shortdesc "Units for LV2 values." ; + doap:created "2007-02-06" ; + doap:homepage ; + doap:license ; + doap:release [ + doap:revision "5.12" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix outdated port description in documentation." + ] , [ + rdfs:label "Remove overly restrictive domain from units:unit." + ] + ] + ] , [ + doap:revision "5.10" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix non-existent port type in examples." + ] , [ + rdfs:label "Add lv2:Parameter to domain of units:unit." + ] + ] + ] , [ + doap:revision "5.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Remove units:name in favour of rdfs:label." + ] , [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "5.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add unit for audio frames." + ] , [ + rdfs:label "Add header of URI defines." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "5.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make units.ttl a valid OWL 2 DL ontology." + ] , [ + rdfs:label "Define used but undefined resources (units:name, units:render, units:symbol, units:Conversion, units:conversion, units:prefixConversion, units:to, and units:factor)." + ] , [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "5.2" ; + doap:created "2010-10-05" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] + ] + ] , [ + doap:revision "5.0" ; + doap:created "2010-10-05" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] , [ + rdfs:label "Define used but undefined resources (units:name, units:render, units:symbol, units:Conversion, units:conversion, units:prefixConversion, units:to, and units:factor)." + ] , [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] ; + doap:developer ; + doap:maintainer ; + lv2:documentation """ + +This is a vocabulary for units typically used for control values in audio +processing. + +For example, to say that a gain control is in decibels: + + :::turtle + @prefix units: . + @prefix eg: . + + eg:plugin lv2:port [ + a lv2:ControlPort , lv2:InputPort ; + lv2:index 0 ; + lv2:symbol "gain" ; + lv2:name "Gain" ; + units:unit units:db + ] . + +Using the same form, plugins may also specify one-off units inline, to give +better display hints to hosts: + + :::turtle + eg:plugin lv2:port [ + a lv2:ControlPort , lv2:InputPort ; + lv2:index 0 ; + lv2:symbol "frob" ; + lv2:name "frob level" ; + units:unit [ + a units:Unit ; + rdfs:label "frobnication" ; + units:symbol "fr" ; + units:render "%f f" + ] + ] . + +It is also possible to define conversions between various units, which makes it +possible for hosts to automatically convert between units where possible. The +units defined in this extension include conversion definitions where it makes +sense to do so. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,379 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix units: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Units" ; + rdfs:comment "Units for LV2 values." ; + rdfs:seeAlso , + . + +units:Unit + a rdfs:Class , + owl:Class ; + rdfs:label "Unit" ; + rdfs:comment "A unit for a control value." . + +units:unit + a rdf:Property , + owl:ObjectProperty ; + rdfs:range units:Unit ; + rdfs:label "unit" ; + rdfs:comment "The unit used by the value of a port or parameter." . + +units:render + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "unit format string" ; + rdfs:domain units:Unit ; + rdfs:range xsd:string ; + rdfs:comment """A printf format string for rendering a value (e.g., "%f dB").""" . + +units:symbol + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "unit symbol" ; + rdfs:domain units:Unit ; + rdfs:range xsd:string ; + rdfs:comment """The abbreviated symbol for this unit (e.g., "dB").""" . + +units:Conversion + a rdfs:Class , + owl:Class ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty units:to ; + owl:cardinality 1 ; + rdfs:comment "A conversion MUST have exactly 1 units:to property." + ] ; + rdfs:label "Conversion" ; + rdfs:comment "A conversion from one unit to another." . + +units:conversion + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain units:Unit ; + rdfs:range units:Conversion ; + rdfs:label "conversion" ; + rdfs:comment "A conversion from this unit to another." . + +units:prefixConversion + a rdf:Property , + owl:ObjectProperty ; + rdfs:subPropertyOf units:conversion ; + rdfs:domain units:Unit ; + rdfs:range units:Conversion ; + rdfs:label "prefix conversion" ; + rdfs:comment "A conversion from this unit to another with the same base but a different prefix." . + +units:to + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain units:Conversion ; + rdfs:range units:Unit ; + rdfs:label "conversion target" ; + rdfs:comment "The target unit this conversion converts to." . + +units:factor + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain units:Conversion ; + rdfs:label "conversion factor" ; + rdfs:comment "The factor to multiply the source value by in order to convert to the target unit." . + +units:s + a units:Unit ; + units:conversion [ + units:factor 0.0166666666 ; + units:to units:min + ] ; + rdfs:label "seconds" ; + rdfs:comment "Seconds, the SI base unit for time." ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:ms + ] ; + units:render "%f s" ; + units:symbol "s" . + +units:ms + a units:Unit ; + rdfs:label "milliseconds" ; + rdfs:comment "Milliseconds (thousandths of seconds)." ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:s + ] ; + units:render "%f ms" ; + units:symbol "ms" . + +units:min + a units:Unit ; + units:conversion [ + units:factor 60.0 ; + units:to units:s + ] ; + rdfs:label "minutes" ; + rdfs:comment "Minutes (60s of seconds and 60ths of an hour)." ; + units:render "%f mins" ; + units:symbol "min" . + +units:bar + a units:Unit ; + rdfs:label "bars" ; + rdfs:comment "Musical bars or measures." ; + units:render "%f bars" ; + units:symbol "bars" . + +units:beat + a units:Unit ; + rdfs:label "beats" ; + rdfs:comment "Musical beats." ; + units:render "%f beats" ; + units:symbol "beats" . + +units:frame + a units:Unit ; + rdfs:label "audio frames" ; + rdfs:comment "Audio frames or samples." ; + units:render "%f frames" ; + units:symbol "frames" . + +units:m + a units:Unit ; + units:conversion [ + units:factor 39.37 ; + units:to units:inch + ] ; + rdfs:label "metres" ; + rdfs:comment "Metres, the SI base unit for length." ; + units:prefixConversion [ + units:factor 100 ; + units:to units:cm + ] , [ + units:factor 1000 ; + units:to units:mm + ] , [ + units:factor 0.001 ; + units:to units:km + ] ; + units:render "%f m" ; + units:symbol "m" . + +units:cm + a units:Unit ; + units:conversion [ + units:factor 0.3937 ; + units:to units:inch + ] ; + rdfs:label "centimetres" ; + rdfs:comment "Centimetres (hundredths of metres)." ; + units:prefixConversion [ + units:factor 0.01 ; + units:to units:m + ] , [ + units:factor 10 ; + units:to units:mm + ] , [ + units:factor 0.00001 ; + units:to units:km + ] ; + units:render "%f cm" ; + units:symbol "cm" . + +units:mm + a units:Unit ; + units:conversion [ + units:factor 0.03937 ; + units:to units:inch + ] ; + rdfs:label "millimetres" ; + rdfs:comment "Millimetres (thousandths of metres)." ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:m + ] , [ + units:factor 0.1 ; + units:to units:cm + ] , [ + units:factor 0.000001 ; + units:to units:km + ] ; + units:render "%f mm" ; + units:symbol "mm" . + +units:km + a units:Unit ; + units:conversion [ + units:factor 0.62138818 ; + units:to units:mile + ] ; + rdfs:label "kilometres" ; + rdfs:comment "Kilometres (thousands of metres)." ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:m + ] , [ + units:factor 100000 ; + units:to units:cm + ] , [ + units:factor 1000000 ; + units:to units:mm + ] ; + units:render "%f km" ; + units:symbol "km" . + +units:inch + a units:Unit ; + units:conversion [ + units:factor 0.0254 ; + units:to units:m + ] ; + rdfs:label "inches" ; + rdfs:comment "An inch, defined as exactly 0.0254 metres." ; + units:render "%f\"" ; + units:symbol "in" . + +units:mile + a units:Unit ; + units:conversion [ + units:factor 1609.344 ; + units:to units:m + ] ; + rdfs:label "miles" ; + rdfs:comment "A mile, defined as exactly 1609.344 metres." ; + units:render "%f mi" ; + units:symbol "mi" . + +units:db + a units:Unit ; + rdfs:label "decibels" ; + rdfs:comment "Decibels, a logarithmic relative unit where 0 is unity." ; + units:render "%f dB" ; + units:symbol "dB" . + +units:pc + a units:Unit ; + units:conversion [ + units:factor 0.01 ; + units:to units:coef + ] ; + rdfs:label "percent" ; + rdfs:comment "Percentage, a ratio as a fraction of 100." ; + units:render "%f%%" ; + units:symbol "%" . + +units:coef + a units:Unit ; + units:conversion [ + units:factor 100 ; + units:to units:pc + ] ; + rdfs:label "coefficient" ; + rdfs:comment "A scale coefficient where 1 is unity, or 100 percent." ; + units:render "* %f" ; + units:symbol "" . + +units:hz + a units:Unit ; + rdfs:label "hertz" ; + rdfs:comment "Hertz, or inverse seconds, the SI derived unit for frequency." ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:khz + ] , [ + units:factor 0.000001 ; + units:to units:mhz + ] ; + units:render "%f Hz" ; + units:symbol "Hz" . + +units:khz + a units:Unit ; + rdfs:label "kilohertz" ; + rdfs:comment "Kilohertz (thousands of Hertz)." ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:hz + ] , [ + units:factor 0.001 ; + units:to units:mhz + ] ; + units:render "%f kHz" ; + units:symbol "kHz" . + +units:mhz + a units:Unit ; + rdfs:label "megahertz" ; + rdfs:comment "Megahertz (millions of Hertz)." ; + units:prefixConversion [ + units:factor 1000000 ; + units:to units:hz + ] , [ + units:factor 0.001 ; + units:to units:khz + ] ; + units:render "%f MHz" ; + units:symbol "MHz" . + +units:bpm + a units:Unit ; + rdfs:label "beats per minute" ; + rdfs:comment "Beats Per Minute (BPM), the standard unit for musical tempo." ; + units:prefixConversion [ + units:factor 0.0166666666 ; + units:to units:hz + ] ; + units:render "%f BPM" ; + units:symbol "BPM" . + +units:oct + a units:Unit ; + units:conversion [ + units:factor 12.0 ; + units:to units:semitone12TET + ] ; + rdfs:label "octaves" ; + rdfs:comment "Octaves, relative musical pitch where +1 octave doubles the frequency." ; + units:render "%f octaves" ; + units:symbol "oct" . + +units:cent + a units:Unit ; + units:conversion [ + units:factor 0.01 ; + units:to units:semitone12TET + ] ; + rdfs:label "cents" ; + rdfs:comment "Cents (hundredths of semitones)." ; + units:render "%f ct" ; + units:symbol "ct" . + +units:semitone12TET + a units:Unit ; + units:conversion [ + units:factor 0.083333333 ; + units:to units:oct + ] ; + rdfs:label "semitones" ; + rdfs:comment "A semitone in the 12-tone equal temperament scale." ; + units:render "%f semi" ; + units:symbol "semi" . + +units:degree + a units:Unit ; + rdfs:label "degrees" ; + rdfs:comment "An angle where 360 degrees is one full rotation." ; + units:render "%f deg" ; + units:symbol "deg" . + +units:midiNote + a units:Unit ; + rdfs:label "MIDI note" ; + rdfs:comment "A MIDI note number." ; + units:render "MIDI note %d" ; + units:symbol "note" . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,140 @@ +/* + Copyright 2008-2016 David Robillard + Copyright 2011 Gabriel M. Beddingfield + + 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. +*/ + +#ifndef LV2_URID_H +#define LV2_URID_H + +/** + @defgroup urid URID + @ingroup lv2 + + Features for mapping URIs to and from integers. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_URID_URI "http://lv2plug.in/ns/ext/urid" ///< http://lv2plug.in/ns/ext/urid +#define LV2_URID_PREFIX LV2_URID_URI "#" ///< http://lv2plug.in/ns/ext/urid# + +#define LV2_URID__map LV2_URID_PREFIX "map" ///< http://lv2plug.in/ns/ext/urid#map +#define LV2_URID__unmap LV2_URID_PREFIX "unmap" ///< http://lv2plug.in/ns/ext/urid#unmap + +#define LV2_URID_MAP_URI LV2_URID__map ///< Legacy +#define LV2_URID_UNMAP_URI LV2_URID__unmap ///< Legacy + +// clang-format on + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Opaque pointer to host data for LV2_URID_Map. +*/ +typedef void* LV2_URID_Map_Handle; + +/** + Opaque pointer to host data for LV2_URID_Unmap. +*/ +typedef void* LV2_URID_Unmap_Handle; + +/** + URI mapped to an integer. +*/ +typedef uint32_t LV2_URID; + +/** + URID Map Feature (LV2_URID__map) +*/ +typedef struct { + /** + Opaque pointer to host data. + + This MUST be passed to map_uri() whenever it is called. + Otherwise, it must not be interpreted in any way. + */ + LV2_URID_Map_Handle handle; + + /** + Get the numeric ID of a URI. + + If the ID does not already exist, it will be created. + + This function is referentially transparent; any number of calls with the + same arguments is guaranteed to return the same value over the life of a + plugin instance. Note, however, that several URIs MAY resolve to the + same ID if the host considers those URIs equivalent. + + This function is not necessarily very fast or RT-safe: plugins SHOULD + cache any IDs they might need in performance critical situations. + + The return value 0 is reserved and indicates that an ID for that URI + could not be created for whatever reason. However, hosts SHOULD NOT + return 0 from this function in non-exceptional circumstances (i.e. the + URI map SHOULD be dynamic). + + @param handle Must be the callback_data member of this struct. + @param uri The URI to be mapped to an integer ID. + */ + LV2_URID (*map)(LV2_URID_Map_Handle handle, const char* uri); +} LV2_URID_Map; + +/** + URI Unmap Feature (LV2_URID__unmap) +*/ +typedef struct { + /** + Opaque pointer to host data. + + This MUST be passed to unmap() whenever it is called. + Otherwise, it must not be interpreted in any way. + */ + LV2_URID_Unmap_Handle handle; + + /** + Get the URI for a previously mapped numeric ID. + + Returns NULL if `urid` is not yet mapped. Otherwise, the corresponding + URI is returned in a canonical form. This MAY not be the exact same + string that was originally passed to LV2_URID_Map::map(), but it MUST be + an identical URI according to the URI syntax specification (RFC3986). A + non-NULL return for a given `urid` will always be the same for the life + of the plugin. Plugins that intend to perform string comparison on + unmapped URIs SHOULD first canonicalise URI strings with a call to + map_uri() followed by a call to unmap_uri(). + + @param handle Must be the callback_data member of this struct. + @param urid The ID to be mapped back to the URI string. + */ + const char* (*unmap)(LV2_URID_Unmap_Handle handle, LV2_URID urid); +} LV2_URID_Unmap; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_URID_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,84 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix urid: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 URID" ; + doap:shortdesc "Features for mapping URIs to and from integers." ; + doap:created "2011-07-22" ; + doap:developer ; + doap:maintainer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix typo in urid:unmap documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add feature struct names." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a simple mechanism for plugins to map URIs to and from +integers. This is usually used for performance reasons, for example for +processing events with URI types in real-time audio code). Typically, plugins +map URIs to integers for things they "understand" at instantiation time, and +store those values for use in the audio thread without doing any string +comparison. This allows for the extensibility of RDF but with the performance +of integers. + +This extension is intended as an improved and simplified replacement for the +[uri-map](uri-map.html) extension, since the `map` context parameter there has +proven problematic. This extension is functionally equivalent to the uri-map +extension with a NULL context. New implementations are encouraged to use this +extension for URI mapping. + +"""^^lv2:Markdown . + +urid:map + lv2:documentation """ + +To support this feature, the host must pass an LV2_Feature to +LV2_Descriptor::instantiate() with URI LV2_URID__map and data pointed to an +instance of LV2_URID_Map. + +"""^^lv2:Markdown . + +urid:unmap + lv2:documentation """ + +To support this feature, the host must pass an LV2_Feature to +LV2_Descriptor::instantiate() with URI LV2_URID__unmap and data pointed to an +instance of LV2_URID_Unmap. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,22 @@ +@prefix lv2: . +@prefix owl: . +@prefix rdfs: . +@prefix urid: . + + + a owl:Ontology ; + rdfs:label "LV2 URID" ; + rdfs:comment "Features for mapping URIs to and from integers." ; + rdfs:seeAlso , + . + +urid:map + a lv2:Feature ; + rdfs:label "map" ; + rdfs:comment "A feature to map URI strings to integer URIDs." . + +urid:unmap + a lv2:Feature ; + rdfs:label "unmap" ; + rdfs:comment "A feature to unmap URIDs back to strings." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,121 @@ +/* + Copyright 2008-2016 David Robillard + + 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. +*/ + +#ifndef LV2_URI_MAP_H +#define LV2_URI_MAP_H + +/** + @defgroup uri-map URI Map + @ingroup lv2 + + A feature for mapping URIs to integers. + + This extension defines a simple mechanism for plugins to map URIs to + integers, usually for performance reasons (e.g. processing events typed by + URIs in real time). The expected use case is for plugins to map URIs to + integers for things they 'understand' at instantiation time, and store those + values for use in the audio thread without doing any string comparison. + This allows the extensibility of RDF with the performance of integers (or + centrally defined enumerations). + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_URI_MAP_URI "http://lv2plug.in/ns/ext/uri-map" ///< http://lv2plug.in/ns/ext/uri-map +#define LV2_URI_MAP_PREFIX LV2_URI_MAP_URI "#" ///< http://lv2plug.in/ns/ext/uri-map# + +// clang-format on + +#include "lv2/core/attributes.h" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +LV2_DISABLE_DEPRECATION_WARNINGS + +/** + Opaque pointer to host data. +*/ +LV2_DEPRECATED +typedef void* LV2_URI_Map_Callback_Data; + +/** + URI Map Feature. + + To support this feature the host must pass an LV2_Feature struct to the + plugin's instantiate method with URI "http://lv2plug.in/ns/ext/uri-map" + and data pointed to an instance of this struct. +*/ +LV2_DEPRECATED +typedef struct { + /** + Opaque pointer to host data. + + The plugin MUST pass this to any call to functions in this struct. + Otherwise, it must not be interpreted in any way. + */ + LV2_URI_Map_Callback_Data callback_data; + + /** + Get the numeric ID of a URI from the host. + + @param callback_data Must be the callback_data member of this struct. + @param map The 'context' of this URI. Certain extensions may define a + URI that must be passed here with certain restrictions on the return + value (e.g. limited range). This value may be NULL if the plugin needs + an ID for a URI in general. Extensions SHOULD NOT define a context + unless there is a specific need to do so, e.g. to restrict the range of + the returned value. + @param uri The URI to be mapped to an integer ID. + + This function is referentially transparent; any number of calls with the + same arguments is guaranteed to return the same value over the life of a + plugin instance (though the same URI may return different values with a + different map parameter). However, this function is not necessarily very + fast: plugins SHOULD cache any IDs they might need in performance + critical situations. + + The return value 0 is reserved and indicates that an ID for that URI + could not be created for whatever reason. Extensions MAY define more + precisely what this means in a certain context, but in general plugins + SHOULD handle this situation as gracefully as possible. However, hosts + SHOULD NOT return 0 from this function in non-exceptional circumstances + (e.g. the URI map SHOULD be dynamic). Hosts that statically support only + a fixed set of URIs should not expect plugins to function correctly. + */ + uint32_t (*uri_to_id)(LV2_URI_Map_Callback_Data callback_data, + const char* map, + const char* uri); +} LV2_URI_Map_Feature; + +LV2_RESTORE_WARNINGS + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_URI_MAP_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,72 @@ +@prefix lv2: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix rdfs: . + + + a doap:Project ; + doap:maintainer ; + doap:created "2008-00-00" ; + doap:developer , + ; + doap:license ; + doap:name "LV2 URI Map" ; + doap:shortdesc "A feature for mapping URIs to integers." ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Deprecate uri-map in favour of urid." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Mark up documentation in HTML using lv2:documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-18" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension is deprecated. New implementations +should use [LV2 URID](urid.html) instead. + +This extension defines a simple mechanism for plugins to map URIs to integers, +usually for performance reasons (e.g. processing events typed by URIs in real +time). The expected use case is for plugins to map URIs to integers for things +they 'understand' at instantiation time, and store those values for use in the +audio thread without doing any string comparison. This allows the +extensibility of RDF with the performance of integers (or centrally defined +enumerations). + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,14 @@ +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix umap: . + + + a lv2:Feature ; + owl:deprecated true ; + rdfs:label "LV2 URI Map" ; + rdfs:comment "A feature for mapping URIs to integers." ; + rdfs:seeAlso , + . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/manifest.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/manifest.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/manifest.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/manifest.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,183 @@ +/* + Copyright 2012-2016 David Robillard + + 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. +*/ + +#ifndef LV2_WORKER_H +#define LV2_WORKER_H + +/** + @defgroup worker Worker + @ingroup lv2 + + Support for non-realtime plugin operations. + + See for details. + + @{ +*/ + +#include "lv2/core/lv2.h" + +#include + +// clang-format off + +#define LV2_WORKER_URI "http://lv2plug.in/ns/ext/worker" ///< http://lv2plug.in/ns/ext/worker +#define LV2_WORKER_PREFIX LV2_WORKER_URI "#" ///< http://lv2plug.in/ns/ext/worker# + +#define LV2_WORKER__interface LV2_WORKER_PREFIX "interface" ///< http://lv2plug.in/ns/ext/worker#interface +#define LV2_WORKER__schedule LV2_WORKER_PREFIX "schedule" ///< http://lv2plug.in/ns/ext/worker#schedule + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Status code for worker functions. +*/ +typedef enum { + LV2_WORKER_SUCCESS = 0, /**< Completed successfully. */ + LV2_WORKER_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_WORKER_ERR_NO_SPACE = 2 /**< Failed due to lack of space. */ +} LV2_Worker_Status; + +/** Opaque handle for LV2_Worker_Interface::work(). */ +typedef void* LV2_Worker_Respond_Handle; + +/** + A function to respond to run() from the worker method. + + The `data` MUST be safe for the host to copy and later pass to + work_response(), and the host MUST guarantee that it will be eventually + passed to work_response() if this function returns LV2_WORKER_SUCCESS. +*/ +typedef LV2_Worker_Status (*LV2_Worker_Respond_Function)( + LV2_Worker_Respond_Handle handle, + uint32_t size, + const void* data); + +/** + Plugin Worker Interface. + + This is the interface provided by the plugin to implement a worker method. + The plugin's extension_data() method should return an LV2_Worker_Interface + when called with LV2_WORKER__interface as its argument. +*/ +typedef struct { + /** + The worker method. This is called by the host in a non-realtime context + as requested, possibly with an arbitrary message to handle. + + A response can be sent to run() using `respond`. The plugin MUST NOT + make any assumptions about which thread calls this method, except that + there are no real-time requirements and only one call may be executed at + a time. That is, the host MAY call this method from any non-real-time + thread, but MUST NOT make concurrent calls to this method from several + threads. + + @param instance The LV2 instance this is a method on. + @param respond A function for sending a response to run(). + @param handle Must be passed to `respond` if it is called. + @param size The size of `data`. + @param data Data from run(), or NULL. + */ + LV2_Worker_Status (*work)(LV2_Handle instance, + LV2_Worker_Respond_Function respond, + LV2_Worker_Respond_Handle handle, + uint32_t size, + const void* data); + + /** + Handle a response from the worker. This is called by the host in the + run() context when a response from the worker is ready. + + @param instance The LV2 instance this is a method on. + @param size The size of `body`. + @param body Message body, or NULL. + */ + LV2_Worker_Status (*work_response)(LV2_Handle instance, + uint32_t size, + const void* body); + + /** + Called when all responses for this cycle have been delivered. + + Since work_response() may be called after run() finished, this provides + a hook for code that must run after the cycle is completed. + + This field may be NULL if the plugin has no use for it. Otherwise, the + host MUST call it after every run(), regardless of whether or not any + responses were sent that cycle. + */ + LV2_Worker_Status (*end_run)(LV2_Handle instance); +} LV2_Worker_Interface; + +/** Opaque handle for LV2_Worker_Schedule. */ +typedef void* LV2_Worker_Schedule_Handle; + +/** + Schedule Worker Host Feature. + + The host passes this feature to provide a schedule_work() function, which + the plugin can use to schedule a worker call from run(). +*/ +typedef struct { + /** + Opaque host data. + */ + LV2_Worker_Schedule_Handle handle; + + /** + Request from run() that the host call the worker. + + This function is in the audio threading class. It should be called from + run() to request that the host call the work() method in a non-realtime + context with the given arguments. + + This function is always safe to call from run(), but it is not + guaranteed that the worker is actually called from a different thread. + In particular, when free-wheeling (for example, during offline + rendering), the worker may be executed immediately. This allows + single-threaded processing with sample accuracy and avoids timing + problems when run() is executing much faster or slower than real-time. + + Plugins SHOULD be written in such a way that if the worker runs + immediately, and responses from the worker are delivered immediately, + the effect of the work takes place immediately with sample accuracy. + + The `data` MUST be safe for the host to copy and later pass to work(), + and the host MUST guarantee that it will be eventually passed to work() + if this function returns LV2_WORKER_SUCCESS. + + @param handle The handle field of this struct. + @param size The size of `data`. + @param data Message to pass to work(), or NULL. + */ + LV2_Worker_Status (*schedule_work)(LV2_Worker_Schedule_Handle handle, + uint32_t size, + const void* data); +} LV2_Worker_Schedule; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_WORKER_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.meta.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.meta.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.meta.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.meta.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,82 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix work: . + + + a doap:Project ; + doap:name "LV2 Worker" ; + doap:shortdesc "Support for doing non-realtime work in plugins." ; + doap:created "2012-03-22" ; + doap:developer ; + doap:release [ + doap:revision "1.2" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension allows plugins to schedule work that must be performed in +another thread. Plugins can use this interface to safely perform work that is +not real-time safe, and receive the result in the run context. The details of +threading are managed by the host, allowing plugins to be simple and portable +while using resources more efficiently. + +This interface is designed to gracefully support single-threaded synchronous +execution, which allows the same code to work with sample accuracy for offline +rendering. For example, a sampler plugin may schedule a sample to be loaded +from disk in another thread. During live execution, the host will call the +plugin's work method from another thread, and deliver the result to the audio +thread when it is finished. However, during offline export, the +scheduled load would be executed immediately in the same thread. This +enables reproducible offline rendering, where any changes affect the output +immediately regardless of how long the work takes to execute. + +"""^^lv2:Markdown . + +work:interface + lv2:documentation """ + +The work interface provided by a plugin, LV2_Worker_Interface. + + :::turtle + + @prefix work: . + + + a lv2:Plugin ; + lv2:extensionData work:interface . + +"""^^lv2:Markdown . + +work:schedule + lv2:documentation """ + +The work scheduling feature provided by a host, LV2_Worker_Schedule. + +If the host passes this feature to LV2_Descriptor::instantiate, the plugin MAY +use it to schedule work in the audio thread, and MUST NOT call it in any other +context. Hosts MAY pass this feature to other functions as well, in which case +the plugin MAY use it to schedule work in the calling context. The plugin MUST +NOT assume any relationship between different schedule features. + +"""^^lv2:Markdown . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.ttl juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.ttl --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.ttl 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.ttl 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,25 @@ +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix work: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Worker" ; + rdfs:comment "Support for doing non-realtime work in plugins." ; + owl:imports ; + rdfs:seeAlso , + . + +work:interface + a lv2:ExtensionData ; + rdfs:label "work interface" ; + rdfs:comment "The work interface provided by a plugin." . + +work:schedule + a lv2:Feature ; + rdfs:label "work schedule" ; + rdfs:comment "The work scheduling feature provided by a host." . + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/README.md juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/README.md --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/README.md 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/README.md 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,11 @@ +The source code for lilv and its dependent libraries have been copied into this +directory. The following modifications were made: + +- Removed files not strictly required to build the lilv library, + including generated config headers +- Added handwritten config headers +- Removed the include of dlfcn.h in world.c + +Remember to update the versions in the config headers if you ever update +the library versions! + diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/COPYING juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/COPYING --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/COPYING 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,13 @@ +Copyright 2011-2021 David Robillard + +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. \ No newline at end of file diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1059 @@ +/* + Copyright 2011-2020 David Robillard + + 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 serd.h API for Serd, a lightweight RDF syntax library + +#ifndef SERD_SERD_H +#define SERD_SERD_H + +#include +#include +#include +#include +#include + +#if defined(_WIN32) && !defined(SERD_STATIC) && defined(SERD_INTERNAL) +# define SERD_API __declspec(dllexport) +#elif defined(_WIN32) && !defined(SERD_STATIC) +# define SERD_API __declspec(dllimport) +#elif defined(__GNUC__) +# define SERD_API __attribute__((visibility("default"))) +#else +# define SERD_API +#endif + +#ifdef __GNUC__ +# define SERD_PURE_FUNC __attribute__((pure)) +# define SERD_CONST_FUNC __attribute__((const)) +#else +# define SERD_PURE_FUNC +# define SERD_CONST_FUNC +#endif + +#if defined(__clang__) && __clang_major__ >= 7 +# define SERD_NONNULL _Nonnull +# define SERD_NULLABLE _Nullable +# define SERD_ALLOCATED _Null_unspecified +#else +# define SERD_NONNULL +# define SERD_NULLABLE +# define SERD_ALLOCATED +#endif + +#define SERD_PURE_API \ + SERD_API \ + SERD_PURE_FUNC + +#define SERD_CONST_API \ + SERD_API \ + SERD_CONST_FUNC + +#ifndef SERD_DISABLE_DEPRECATED +# if defined(__clang__) && __clang_major__ >= 7 +# define SERD_DEPRECATED_BY(rep) __attribute__((deprecated("", rep))) +# elif defined(__GNUC__) && __GNUC__ > 4 +# define SERD_DEPRECATED_BY(rep) __attribute__((deprecated("Use " rep))) +# elif defined(__GNUC__) +# define SERD_DEPRECATED_BY(rep) __attribute__((deprecated)) +# else +# define SERD_DEPRECATED_BY(rep) +# endif +#endif + +#ifdef __cplusplus +extern "C" { +# if defined(__GNUC__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" +# endif +#endif + +/** + @defgroup serd Serd C API + This is the complete public C API of serd. + @{ +*/ + +/// Lexical environment for relative URIs or CURIEs (base URI and namespaces) +typedef struct SerdEnvImpl SerdEnv; + +/// Streaming parser that reads a text stream and writes to a statement sink +typedef struct SerdReaderImpl SerdReader; + +/// Streaming serialiser that writes a text stream as statements are pushed +typedef struct SerdWriterImpl SerdWriter; + +/// Return status code +typedef enum { + SERD_SUCCESS, ///< No error + SERD_FAILURE, ///< Non-fatal failure + SERD_ERR_UNKNOWN, ///< Unknown error + SERD_ERR_BAD_SYNTAX, ///< Invalid syntax + SERD_ERR_BAD_ARG, ///< Invalid argument + SERD_ERR_NOT_FOUND, ///< Not found + SERD_ERR_ID_CLASH, ///< Encountered clashing blank node IDs + SERD_ERR_BAD_CURIE, ///< Invalid CURIE (e.g. prefix does not exist) + SERD_ERR_INTERNAL ///< Unexpected internal error (should not happen) +} SerdStatus; + +/// RDF syntax type +typedef enum { + SERD_TURTLE = 1, ///< Terse triples http://www.w3.org/TR/turtle + SERD_NTRIPLES = 2, ///< Line-based triples http://www.w3.org/TR/n-triples/ + SERD_NQUADS = 3, ///< Line-based quads http://www.w3.org/TR/n-quads/ + SERD_TRIG = 4 ///< Terse quads http://www.w3.org/TR/trig/ +} SerdSyntax; + +/// Flags indicating inline abbreviation information for a statement +typedef enum { + SERD_EMPTY_S = 1u << 1u, ///< Empty blank node subject + SERD_EMPTY_O = 1u << 2u, ///< Empty blank node object + SERD_ANON_S_BEGIN = 1u << 3u, ///< Start of anonymous subject + SERD_ANON_O_BEGIN = 1u << 4u, ///< Start of anonymous object + SERD_ANON_CONT = 1u << 5u, ///< Continuation of anonymous node + SERD_LIST_S_BEGIN = 1u << 6u, ///< Start of list subject + SERD_LIST_O_BEGIN = 1u << 7u, ///< Start of list object + SERD_LIST_CONT = 1u << 8u ///< Continuation of list +} SerdStatementFlag; + +/// Bitwise OR of SerdStatementFlag values +typedef uint32_t SerdStatementFlags; + +/** + Type of a node. + + An RDF node, in the abstract sense, can be either a resource, literal, or a + blank. This type is more precise, because syntactically there are two ways + to refer to a resource (by URI or CURIE). + + There are also two ways to refer to a blank node in syntax (by ID or + anonymously), but this is handled by statement flags rather than distinct + node types. +*/ +typedef enum { + /** + The type of a nonexistent node. + + This type is useful as a sentinel, but is never emitted by the reader. + */ + SERD_NOTHING = 0, + + /** + Literal value. + + A literal optionally has either a language, or a datatype (not both). + */ + SERD_LITERAL = 1, + + /** + URI (absolute or relative). + + Value is an unquoted URI string, which is either a relative reference + with respect to the current base URI (e.g. "foo/bar"), or an absolute + URI (e.g. "http://example.org/foo"). + @see [RFC3986](http://tools.ietf.org/html/rfc3986) + */ + SERD_URI = 2, + + /** + CURIE, a shortened URI. + + Value is an unquoted CURIE string relative to the current environment, + e.g. "rdf:type". @see [CURIE Syntax 1.0](http://www.w3.org/TR/curie) + */ + SERD_CURIE = 3, + + /** + A blank node. + + Value is a blank node ID without any syntactic prefix, like "id3", which + is meaningful only within this serialisation. @see [RDF 1.1 + Turtle](http://www.w3.org/TR/turtle/#grammar-production-BLANK_NODE_LABEL) + */ + SERD_BLANK = 4 +} SerdType; + +/// Flags indicating certain string properties relevant to serialisation +typedef enum { + SERD_HAS_NEWLINE = 1u << 0u, ///< Contains line breaks ('\\n' or '\\r') + SERD_HAS_QUOTE = 1u << 1u ///< Contains quotes ('"') +} SerdNodeFlag; + +/// Bitwise OR of SerdNodeFlag values +typedef uint32_t SerdNodeFlags; + +/// A syntactic RDF node +typedef struct { + const uint8_t* SERD_NULLABLE buf; ///< Value string + size_t n_bytes; ///< Size in bytes (excluding null) + size_t n_chars; ///< String length (excluding null) + SerdNodeFlags flags; ///< Node flags (string properties) + SerdType type; ///< Node type +} SerdNode; + +/// An unterminated string fragment +typedef struct { + const uint8_t* SERD_NULLABLE buf; ///< Start of chunk + size_t len; ///< Length of chunk in bytes +} SerdChunk; + +/// An error description +typedef struct { + SerdStatus status; ///< Error code + const uint8_t* SERD_NULLABLE filename; ///< File with error + unsigned line; ///< Line in file with error or 0 + unsigned col; ///< Column in file with error + const char* SERD_NONNULL fmt; ///< Printf-style format string + va_list* SERD_NONNULL args; ///< Arguments for fmt +} SerdError; + +/** + A parsed URI + + This struct directly refers to chunks in other strings, it does not own any + memory itself. Thus, URIs can be parsed and/or resolved against a base URI + in-place without allocating memory. +*/ +typedef struct { + SerdChunk scheme; ///< Scheme + SerdChunk authority; ///< Authority + SerdChunk path_base; ///< Path prefix if relative + SerdChunk path; ///< Path suffix + SerdChunk query; ///< Query + SerdChunk fragment; ///< Fragment +} SerdURI; + +/** + Syntax style options. + + These flags allow more precise control of writer output style. Note that + some options are only supported for some syntaxes, for example, NTriples + does not support abbreviation and is always ASCII. +*/ +typedef enum { + SERD_STYLE_ABBREVIATED = 1u << 0u, ///< Abbreviate triples when possible. + SERD_STYLE_ASCII = 1u << 1u, ///< Escape all non-ASCII characters. + SERD_STYLE_RESOLVED = 1u << 2u, ///< Resolve URIs against base URI. + SERD_STYLE_CURIED = 1u << 3u, ///< Shorten URIs into CURIEs. + SERD_STYLE_BULK = 1u << 4u, ///< Write output in pages. +} SerdStyle; + +/** + Free memory allocated by Serd + + This function exists because some systems require memory allocated by a + library to be freed by code in the same library. It is otherwise equivalent + to the standard C free() function. +*/ +SERD_API +void +serd_free(void* SERD_NULLABLE ptr); + +/** + @defgroup serd_string String Utilities + @{ +*/ + +/// Return a string describing a status code +SERD_CONST_API +const uint8_t* SERD_NONNULL +serd_strerror(SerdStatus status); + +/** + Measure a UTF-8 string. + + @return Length of `str` in characters (except NULL). + @param str A null-terminated UTF-8 string. + @param n_bytes (Output) Set to the size of `str` in bytes (except NULL). + @param flags (Output) Set to the applicable flags. +*/ +SERD_API +size_t +serd_strlen(const uint8_t* SERD_NONNULL str, + size_t* SERD_NULLABLE n_bytes, + SerdNodeFlags* SERD_NULLABLE flags); + +/** + Parse a string to a double. + + The API of this function is identical to the standard C strtod function, + except this function is locale-independent and always matches the lexical + format used in the Turtle grammar (the decimal point is always "."). +*/ +SERD_API +double +serd_strtod(const char* SERD_NONNULL str, + char* SERD_NONNULL* SERD_NULLABLE endptr); + +/** + Decode a base64 string. + + This function can be used to deserialise a blob node created with + serd_node_new_blob(). + + @param str Base64 string to decode. + @param len The length of `str`. + @param size Set to the size of the returned blob in bytes. + @return A newly allocated blob which must be freed with serd_free(). +*/ +SERD_API +void* SERD_ALLOCATED +serd_base64_decode(const uint8_t* SERD_NONNULL str, + size_t len, + size_t* SERD_NONNULL size); + +/** + @} + @defgroup serd_streams Byte Streams + @{ +*/ + +/** + Function to detect I/O stream errors. + + Identical semantics to `ferror`. + + @return Non-zero if `stream` has encountered an error. +*/ +typedef int (*SerdStreamErrorFunc)(void* SERD_NONNULL stream); + +/** + Source function for raw string input. + + Identical semantics to `fread`, but may set errno for more informative error + reporting than supported by SerdStreamErrorFunc. + + @param buf Output buffer. + @param size Size of a single element of data in bytes (always 1). + @param nmemb Number of elements to read. + @param stream Stream to read from (FILE* for fread). + @return Number of elements (bytes) read. +*/ +typedef size_t (*SerdSource)(void* SERD_NONNULL buf, + size_t size, + size_t nmemb, + void* SERD_NONNULL stream); + +/// Sink function for raw string output +typedef size_t (*SerdSink)(const void* SERD_NONNULL buf, + size_t len, + void* SERD_NONNULL stream); + +/** + @} + @defgroup serd_uri URI + @{ +*/ + +static const SerdURI SERD_URI_NULL = + {{NULL, 0}, {NULL, 0}, {NULL, 0}, {NULL, 0}, {NULL, 0}, {NULL, 0}}; + +#ifndef SERD_DISABLE_DEPRECATED + +/** + Return the local path for `uri`, or NULL if `uri` is not a file URI. + Note this (inappropriately named) function only removes the file scheme if + necessary, and returns `uri` unmodified if it is an absolute path. Percent + encoding and other issues are not handled, to properly convert a file URI to + a path, use serd_file_uri_parse(). +*/ +SERD_API +SERD_DEPRECATED_BY("serd_file_uri_parse") +const uint8_t* SERD_NULLABLE +serd_uri_to_path(const uint8_t* SERD_NONNULL uri); + +#endif + +/** + Get the unescaped path and hostname from a file URI. + + The returned path and `*hostname` must be freed with serd_free(). + + @param uri A file URI. + @param hostname If non-NULL, set to the hostname, if present. + @return The path component of the URI. +*/ +SERD_API +uint8_t* SERD_NULLABLE +serd_file_uri_parse(const uint8_t* SERD_NONNULL uri, + uint8_t* SERD_NONNULL* SERD_NULLABLE hostname); + +/// Return true iff `utf8` starts with a valid URI scheme +SERD_PURE_API +bool +serd_uri_string_has_scheme(const uint8_t* SERD_NULLABLE utf8); + +/// Parse `utf8`, writing result to `out` +SERD_API +SerdStatus +serd_uri_parse(const uint8_t* SERD_NONNULL utf8, SerdURI* SERD_NONNULL out); + +/** + Set target `t` to reference `r` resolved against `base`. + + @see [RFC3986 5.2.2](http://tools.ietf.org/html/rfc3986#section-5.2.2) +*/ +SERD_API +void +serd_uri_resolve(const SerdURI* SERD_NONNULL r, + const SerdURI* SERD_NONNULL base, + SerdURI* SERD_NONNULL t); + +/// Serialise `uri` with a series of calls to `sink` +SERD_API +size_t +serd_uri_serialise(const SerdURI* SERD_NONNULL uri, + SerdSink SERD_NONNULL sink, + void* SERD_NONNULL stream); + +/** + Serialise `uri` relative to `base` with a series of calls to `sink` + + The `uri` is written as a relative URI iff if it a child of `base` and + `root`. The optional `root` parameter must be a prefix of `base` and can be + used keep up-references ("../") within a certain namespace. +*/ +SERD_API +size_t +serd_uri_serialise_relative(const SerdURI* SERD_NONNULL uri, + const SerdURI* SERD_NULLABLE base, + const SerdURI* SERD_NULLABLE root, + SerdSink SERD_NONNULL sink, + void* SERD_NONNULL stream); + +/** + @} + @defgroup serd_node Node + @{ +*/ + +static const SerdNode SERD_NODE_NULL = {NULL, 0, 0, 0, SERD_NOTHING}; + +/** + Make a (shallow) node from `str`. + + This measures, but does not copy, `str`. No memory is allocated. +*/ +SERD_API +SerdNode +serd_node_from_string(SerdType type, const uint8_t* SERD_NULLABLE str); + +/** + Make a (shallow) node from a prefix of `str`. + + This measures, but does not copy, `str`. No memory is allocated. + Note that the returned node may not be null terminated. +*/ +SERD_API +SerdNode +serd_node_from_substring(SerdType type, + const uint8_t* SERD_NULLABLE str, + size_t len); + +/// Simple wrapper for serd_node_new_uri() to resolve a URI node +SERD_API +SerdNode +serd_node_new_uri_from_node(const SerdNode* SERD_NONNULL uri_node, + const SerdURI* SERD_NULLABLE base, + SerdURI* SERD_NULLABLE out); + +/// Simple wrapper for serd_node_new_uri() to resolve a URI string +SERD_API +SerdNode +serd_node_new_uri_from_string(const uint8_t* SERD_NULLABLE str, + const SerdURI* SERD_NULLABLE base, + SerdURI* SERD_NULLABLE out); + +/** + Create a new file URI node from a file system path and optional hostname. + + Backslashes in Windows paths will be converted and '%' will always be + percent encoded. If `escape` is true, all other invalid characters will be + percent encoded as well. + + If `path` is relative, `hostname` is ignored. + If `out` is not NULL, it will be set to the parsed URI. +*/ +SERD_API +SerdNode +serd_node_new_file_uri(const uint8_t* SERD_NONNULL path, + const uint8_t* SERD_NULLABLE hostname, + SerdURI* SERD_NULLABLE out, + bool escape); + +/** + Create a new node by serialising `uri` into a new string. + + @param uri The URI to serialise. + + @param base Base URI to resolve `uri` against (or NULL for no resolution). + + @param out Set to the parsing of the new URI (i.e. points only to + memory owned by the new returned node). +*/ +SERD_API +SerdNode +serd_node_new_uri(const SerdURI* SERD_NONNULL uri, + const SerdURI* SERD_NULLABLE base, + SerdURI* SERD_NULLABLE out); + +/** + Create a new node by serialising `uri` into a new relative URI. + + @param uri The URI to serialise. + + @param base Base URI to make `uri` relative to, if possible. + + @param root Root URI for resolution (see serd_uri_serialise_relative()). + + @param out Set to the parsing of the new URI (i.e. points only to + memory owned by the new returned node). +*/ +SERD_API +SerdNode +serd_node_new_relative_uri(const SerdURI* SERD_NONNULL uri, + const SerdURI* SERD_NULLABLE base, + const SerdURI* SERD_NULLABLE root, + SerdURI* SERD_NULLABLE out); + +/** + Create a new node by serialising `d` into an xsd:decimal string + + The resulting node will always contain a `.', start with a digit, and end + with a digit (i.e. will have a leading and/or trailing `0' if necessary). + It will never be in scientific notation. A maximum of `frac_digits` digits + will be written after the decimal point, but trailing zeros will + automatically be omitted (except one if `d` is a round integer). + + Note that about 16 and 8 fractional digits are required to precisely + represent a double and float, respectively. + + @param d The value for the new node. + @param frac_digits The maximum number of digits after the decimal place. +*/ +SERD_API +SerdNode +serd_node_new_decimal(double d, unsigned frac_digits); + +/// Create a new node by serialising `i` into an xsd:integer string +SERD_API +SerdNode +serd_node_new_integer(int64_t i); + +/** + Create a node by serialising `buf` into an xsd:base64Binary string + + This function can be used to make a serialisable node out of arbitrary + binary data, which can be decoded using serd_base64_decode(). + + @param buf Raw binary input data. + @param size Size of `buf`. + @param wrap_lines Wrap lines at 76 characters to conform to RFC 2045. +*/ +SERD_API +SerdNode +serd_node_new_blob(const void* SERD_NONNULL buf, size_t size, bool wrap_lines); + +/** + Make a deep copy of `node`. + + @return a node that the caller must free with serd_node_free(). +*/ +SERD_API +SerdNode +serd_node_copy(const SerdNode* SERD_NULLABLE node); + +/// Return true iff `a` is equal to `b` +SERD_PURE_API +bool +serd_node_equals(const SerdNode* SERD_NONNULL a, + const SerdNode* SERD_NONNULL b); + +/** + Free any data owned by `node`. + + Note that if `node` is itself dynamically allocated (which is not the case + for nodes created internally by serd), it will not be freed. +*/ +SERD_API +void +serd_node_free(SerdNode* SERD_NULLABLE node); + +/** + @} + @defgroup serd_event Event Handlers + @{ +*/ + +/** + Sink (callback) for errors. + + @param handle Handle for user data. + @param error Error description. +*/ +typedef SerdStatus (*SerdErrorSink)(void* SERD_NULLABLE handle, + const SerdError* SERD_NONNULL error); + +/** + Sink (callback) for base URI changes + + Called whenever the base URI of the serialisation changes. +*/ +typedef SerdStatus (*SerdBaseSink)(void* SERD_NULLABLE handle, + const SerdNode* SERD_NONNULL uri); + +/** + Sink (callback) for namespace definitions + + Called whenever a prefix is defined in the serialisation. +*/ +typedef SerdStatus (*SerdPrefixSink)(void* SERD_NULLABLE handle, + const SerdNode* SERD_NONNULL name, + const SerdNode* SERD_NONNULL uri); + +/** + Sink (callback) for statements + + Called for every RDF statement in the serialisation. +*/ +typedef SerdStatus (*SerdStatementSink)( + void* SERD_NULLABLE handle, + SerdStatementFlags flags, + const SerdNode* SERD_NULLABLE graph, + const SerdNode* SERD_NONNULL subject, + const SerdNode* SERD_NONNULL predicate, + const SerdNode* SERD_NONNULL object, + const SerdNode* SERD_NULLABLE object_datatype, + const SerdNode* SERD_NULLABLE object_lang); + +/** + Sink (callback) for anonymous node end markers + + This is called to indicate that the anonymous node with the given + `value` will no longer be referred to by any future statements + (i.e. the anonymous serialisation of the node is finished). +*/ +typedef SerdStatus (*SerdEndSink)(void* SERD_NULLABLE handle, + const SerdNode* SERD_NONNULL node); + +/** + @} + @defgroup serd_env Environment + @{ +*/ + +/// Create a new environment +SERD_API +SerdEnv* SERD_ALLOCATED +serd_env_new(const SerdNode* SERD_NULLABLE base_uri); + +/// Free `env` +SERD_API +void +serd_env_free(SerdEnv* SERD_NULLABLE env); + +/// Get the current base URI +SERD_API +const SerdNode* SERD_NONNULL +serd_env_get_base_uri(const SerdEnv* SERD_NONNULL env, + SerdURI* SERD_NULLABLE out); + +/// Set the current base URI +SERD_API +SerdStatus +serd_env_set_base_uri(SerdEnv* SERD_NONNULL env, + const SerdNode* SERD_NULLABLE uri); + +/** + Set a namespace prefix + + A namespace prefix is used to expand CURIE nodes, for example, with the + prefix "xsd" set to "http://www.w3.org/2001/XMLSchema#", "xsd:decimal" will + expand to "http://www.w3.org/2001/XMLSchema#decimal". +*/ +SERD_API +SerdStatus +serd_env_set_prefix(SerdEnv* SERD_NONNULL env, + const SerdNode* SERD_NONNULL name, + const SerdNode* SERD_NONNULL uri); + +/// Set a namespace prefix +SERD_API +SerdStatus +serd_env_set_prefix_from_strings(SerdEnv* SERD_NONNULL env, + const uint8_t* SERD_NONNULL name, + const uint8_t* SERD_NONNULL uri); + +/// Qualify `uri` into a CURIE if possible +SERD_API +bool +serd_env_qualify(const SerdEnv* SERD_NONNULL env, + const SerdNode* SERD_NONNULL uri, + SerdNode* SERD_NONNULL prefix, + SerdChunk* SERD_NONNULL suffix); + +/** + Expand `curie`. + + Errors: SERD_ERR_BAD_ARG if `curie` is not valid, or SERD_ERR_BAD_CURIE if + prefix is not defined in `env`. +*/ +SERD_API +SerdStatus +serd_env_expand(const SerdEnv* SERD_NONNULL env, + const SerdNode* SERD_NONNULL curie, + SerdChunk* SERD_NONNULL uri_prefix, + SerdChunk* SERD_NONNULL uri_suffix); + +/** + Expand `node`, which must be a CURIE or URI, to a full URI. + + Returns null if `node` can not be expanded. +*/ +SERD_API +SerdNode +serd_env_expand_node(const SerdEnv* SERD_NONNULL env, + const SerdNode* SERD_NONNULL node); + +/// Call `func` for each prefix defined in `env` +SERD_API +void +serd_env_foreach(const SerdEnv* SERD_NONNULL env, + SerdPrefixSink SERD_NONNULL func, + void* SERD_NULLABLE handle); + +/** + @} + @defgroup serd_reader Reader + @{ +*/ + +/// Create a new RDF reader +SERD_API +SerdReader* SERD_ALLOCATED +serd_reader_new(SerdSyntax syntax, + void* SERD_NULLABLE handle, + void (*SERD_NULLABLE free_handle)(void* SERD_NULLABLE), + SerdBaseSink SERD_NULLABLE base_sink, + SerdPrefixSink SERD_NULLABLE prefix_sink, + SerdStatementSink SERD_NULLABLE statement_sink, + SerdEndSink SERD_NULLABLE end_sink); + +/** + Enable or disable strict parsing + + The reader is non-strict (lax) by default, which will tolerate URIs with + invalid characters. Setting strict will fail when parsing such files. An + error is printed for invalid input in either case. +*/ +SERD_API +void +serd_reader_set_strict(SerdReader* SERD_NONNULL reader, bool strict); + +/** + Set a function to be called when errors occur during reading. + + The `error_sink` will be called with `handle` as its first argument. If + no error function is set, errors are printed to stderr in GCC style. +*/ +SERD_API +void +serd_reader_set_error_sink(SerdReader* SERD_NONNULL reader, + SerdErrorSink SERD_NULLABLE error_sink, + void* SERD_NULLABLE error_handle); + +/// Return the `handle` passed to serd_reader_new() +SERD_PURE_API +void* SERD_NULLABLE +serd_reader_get_handle(const SerdReader* SERD_NONNULL reader); + +/** + Set a prefix to be added to all blank node identifiers. + + This is useful when multiple files are to be parsed into the same output (a + model or a file). Since Serd preserves blank node IDs, this could cause + conflicts where two non-equivalent blank nodes are merged, resulting in + corrupt data. By setting a unique blank node prefix for each parsed file, + this can be avoided, while preserving blank node names. +*/ +SERD_API +void +serd_reader_add_blank_prefix(SerdReader* SERD_NONNULL reader, + const uint8_t* SERD_NULLABLE prefix); + +/** + Set the URI of the default graph. + + If this is set, the reader will emit quads with the graph set to the given + node for any statements that are not in a named graph (which is currently + all of them since Serd currently does not support any graph syntaxes). +*/ +SERD_API +void +serd_reader_set_default_graph(SerdReader* SERD_NONNULL reader, + const SerdNode* SERD_NULLABLE graph); + +/// Read a file at a given `uri` +SERD_API +SerdStatus +serd_reader_read_file(SerdReader* SERD_NONNULL reader, + const uint8_t* SERD_NONNULL uri); + +/** + Start an incremental read from a file handle. + + Iff `bulk` is true, `file` will be read a page at a time. This is more + efficient, but uses a page of memory and means that an entire page of input + must be ready before any callbacks will fire. To react as soon as input + arrives, set `bulk` to false. +*/ +SERD_API +SerdStatus +serd_reader_start_stream(SerdReader* SERD_NONNULL reader, + FILE* SERD_NONNULL file, + const uint8_t* SERD_NULLABLE name, + bool bulk); + +/** + Start an incremental read from a user-specified source. + + The `read_func` is guaranteed to only be called for `page_size` elements + with size 1 (i.e. `page_size` bytes). +*/ +SERD_API +SerdStatus +serd_reader_start_source_stream(SerdReader* SERD_NONNULL reader, + SerdSource SERD_NONNULL read_func, + SerdStreamErrorFunc SERD_NONNULL error_func, + void* SERD_NONNULL stream, + const uint8_t* SERD_NULLABLE name, + size_t page_size); + +/** + Read a single "chunk" of data during an incremental read + + This function will read a single top level description, and return. This + may be a directive, statement, or several statements; essentially it reads + until a '.' is encountered. This is particularly useful for reading + directly from a pipe or socket. +*/ +SERD_API +SerdStatus +serd_reader_read_chunk(SerdReader* SERD_NONNULL reader); + +/// Finish an incremental read from a file handle +SERD_API +SerdStatus +serd_reader_end_stream(SerdReader* SERD_NONNULL reader); + +/// Read `file` +SERD_API +SerdStatus +serd_reader_read_file_handle(SerdReader* SERD_NONNULL reader, + FILE* SERD_NONNULL file, + const uint8_t* SERD_NULLABLE name); + +/// Read a user-specified byte source +SERD_API +SerdStatus +serd_reader_read_source(SerdReader* SERD_NONNULL reader, + SerdSource SERD_NONNULL source, + SerdStreamErrorFunc SERD_NONNULL error, + void* SERD_NONNULL stream, + const uint8_t* SERD_NULLABLE name, + size_t page_size); + +/// Read `utf8` +SERD_API +SerdStatus +serd_reader_read_string(SerdReader* SERD_NONNULL reader, + const uint8_t* SERD_NONNULL utf8); + +/// Free `reader` +SERD_API +void +serd_reader_free(SerdReader* SERD_NULLABLE reader); + +/** + @} + @defgroup serd_writer Writer + @{ +*/ + +/// Create a new RDF writer +SERD_API +SerdWriter* SERD_ALLOCATED +serd_writer_new(SerdSyntax syntax, + SerdStyle style, + SerdEnv* SERD_NONNULL env, + const SerdURI* SERD_NULLABLE base_uri, + SerdSink SERD_NONNULL ssink, + void* SERD_NULLABLE stream); + +/// Free `writer` +SERD_API +void +serd_writer_free(SerdWriter* SERD_NULLABLE writer); + +/// Return the env used by `writer` +SERD_PURE_API +SerdEnv* SERD_NONNULL +serd_writer_get_env(SerdWriter* SERD_NONNULL writer); + +/** + A convenience sink function for writing to a FILE*. + + This function can be used as a SerdSink when writing to a FILE*. The + `stream` parameter must be a FILE* opened for writing. +*/ +SERD_API +size_t +serd_file_sink(const void* SERD_NONNULL buf, + size_t len, + void* SERD_NONNULL stream); + +/** + A convenience sink function for writing to a string + + This function can be used as a SerdSink to write to a SerdChunk which is + resized as necessary with realloc(). The `stream` parameter must point to + an initialized SerdChunk. When the write is finished, the string should be + retrieved with serd_chunk_sink_finish(). +*/ +SERD_API +size_t +serd_chunk_sink(const void* SERD_NONNULL buf, + size_t len, + void* SERD_NONNULL stream); + +/** + Finish a serialisation to a chunk with serd_chunk_sink(). + + The returned string is the result of the serialisation, which is null + terminated (by this function) and owned by the caller. +*/ +SERD_API +uint8_t* SERD_NULLABLE +serd_chunk_sink_finish(SerdChunk* SERD_NONNULL stream); + +/** + Set a function to be called when errors occur during writing. + + The `error_sink` will be called with `handle` as its first argument. If + no error function is set, errors are printed to stderr. +*/ +SERD_API +void +serd_writer_set_error_sink(SerdWriter* SERD_NONNULL writer, + SerdErrorSink SERD_NONNULL error_sink, + void* SERD_NULLABLE error_handle); + +/** + Set a prefix to be removed from matching blank node identifiers + + This is the counterpart to serd_reader_add_blank_prefix() which can be used + to "undo" added prefixes. +*/ +SERD_API +void +serd_writer_chop_blank_prefix(SerdWriter* SERD_NONNULL writer, + const uint8_t* SERD_NULLABLE prefix); + +/** + Set the current output base URI, and emit a directive if applicable. + + Note this function can be safely casted to SerdBaseSink. +*/ +SERD_API +SerdStatus +serd_writer_set_base_uri(SerdWriter* SERD_NONNULL writer, + const SerdNode* SERD_NULLABLE uri); + +/** + Set the current root URI. + + The root URI should be a prefix of the base URI. The path of the root URI + is the highest path any relative up-reference can refer to. For example, + with root and base , + will be written as <../>, but will be + written non-relatively as . If the root is not explicitly set, + it defaults to the base URI, so no up-references will be created at all. +*/ +SERD_API +SerdStatus +serd_writer_set_root_uri(SerdWriter* SERD_NONNULL writer, + const SerdNode* SERD_NULLABLE uri); + +/** + Set a namespace prefix (and emit directive if applicable). + + Note this function can be safely casted to SerdPrefixSink. +*/ +SERD_API +SerdStatus +serd_writer_set_prefix(SerdWriter* SERD_NONNULL writer, + const SerdNode* SERD_NONNULL name, + const SerdNode* SERD_NONNULL uri); + +/** + Write a statement. + + Note this function can be safely casted to SerdStatementSink. +*/ +SERD_API +SerdStatus +serd_writer_write_statement(SerdWriter* SERD_NONNULL writer, + SerdStatementFlags flags, + const SerdNode* SERD_NULLABLE graph, + const SerdNode* SERD_NONNULL subject, + const SerdNode* SERD_NONNULL predicate, + const SerdNode* SERD_NONNULL object, + const SerdNode* SERD_NULLABLE datatype, + const SerdNode* SERD_NULLABLE lang); + +/** + Mark the end of an anonymous node's description. + + Note this function can be safely casted to SerdEndSink. +*/ +SERD_API +SerdStatus +serd_writer_end_anon(SerdWriter* SERD_NONNULL writer, + const SerdNode* SERD_NULLABLE node); + +/** + Finish a write + + This flushes any pending output, for example terminating punctuation, so + that the output is a complete document. +*/ +SERD_API +SerdStatus +serd_writer_finish(SerdWriter* SERD_NONNULL writer); + +/** + @} + @} +*/ + +#ifdef __cplusplus +# if defined(__GNUC__) +# pragma GCC diagnostic pop +# endif +} /* extern "C" */ +#endif + +#endif /* SERD_SERD_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,26 @@ +/* + Copyright 2019-2020 David Robillard + + 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. +*/ + +#ifndef SERD_ATTRIBUTES_H +#define SERD_ATTRIBUTES_H + +#ifdef __GNUC__ +# define SERD_MALLOC_FUNC __attribute__((malloc)) +#else +# define SERD_MALLOC_FUNC +#endif + +#endif // SERD_ATTRIBUTES_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,132 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#include "base64.h" + +#include "serd_internal.h" +#include "string_utils.h" + +#include "serd/serd.h" + +#include +#include +#include +#include + +/** + Base64 encoding table. + + @see RFC3548 S3. +*/ +static const uint8_t b64_map[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +/** + Base64 decoding table. + + This is indexed by encoded characters and returns the numeric value used + for decoding, shifted up by 47 to be in the range of printable ASCII. + A '$' is a placeholder for characters not in the base64 alphabet. +*/ +static const char b64_unmap[] = + "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$m$$$ncdefghijkl$$$$$$" + "$/0123456789:;<=>?@ABCDEFGH$$$$$$IJKLMNOPQRSTUVWXYZ[\\]^_`ab$$$$" + "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" + "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"; + +/** Encode 3 raw bytes to 4 base64 characters. */ +static inline void +encode_chunk(uint8_t out[4], const uint8_t in[3], size_t n_in) +{ + out[0] = b64_map[in[0] >> 2]; + out[1] = b64_map[((in[0] & 0x03) << 4) | ((in[1] & 0xF0) >> 4)]; + + out[2] = (n_in > 1) ? (b64_map[((in[1] & 0x0F) << 2) | ((in[2] & 0xC0) >> 6)]) + : (uint8_t)'='; + + out[3] = ((n_in > 2) ? b64_map[in[2] & 0x3F] : (uint8_t)'='); +} + +size_t +serd_base64_get_length(const size_t size, const bool wrap_lines) +{ + return (size + 2) / 3 * 4 + (wrap_lines * ((size - 1) / 57)); +} + +bool +serd_base64_encode(uint8_t* const str, + const void* const buf, + const size_t size, + const bool wrap_lines) +{ + bool has_newline = false; + + for (size_t i = 0, j = 0; i < size; i += 3, j += 4) { + uint8_t in[4] = {0, 0, 0, 0}; + size_t n_in = MIN(3, size - i); + memcpy(in, (const uint8_t*)buf + i, n_in); + + if (wrap_lines && i > 0 && (i % 57) == 0) { + str[j++] = '\n'; + has_newline = true; + } + + encode_chunk(str + j, in, n_in); + } + + return has_newline; +} + +static inline uint8_t +unmap(const uint8_t in) +{ + return (uint8_t)(b64_unmap[in] - 47); +} + +/** Decode 4 base64 characters to 3 raw bytes. */ +static inline size_t +decode_chunk(const uint8_t in[4], uint8_t out[3]) +{ + out[0] = (uint8_t)(((unmap(in[0]) << 2)) | unmap(in[1]) >> 4); + out[1] = (uint8_t)(((unmap(in[1]) << 4) & 0xF0) | unmap(in[2]) >> 2); + out[2] = (uint8_t)(((unmap(in[2]) << 6) & 0xC0) | unmap(in[3])); + return 1 + (in[2] != '=') + ((in[2] != '=') && (in[3] != '=')); +} + +void* +serd_base64_decode(const uint8_t* str, size_t len, size_t* size) +{ + void* buf = malloc((len * 3) / 4 + 2); + + *size = 0; + for (size_t i = 0, j = 0; i < len; j += 3) { + uint8_t in[] = "===="; + size_t n_in = 0; + for (; i < len && n_in < 4; ++n_in) { + for (; i < len && !is_base64(str[i]); ++i) { + // Skip junk + } + + in[n_in] = str[i++]; + } + + if (n_in > 1) { + *size += decode_chunk(in, (uint8_t*)buf + j); + } + } + + return buf; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,48 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef SERD_BASE64_H +#define SERD_BASE64_H + +#include "serd/serd.h" + +#include +#include +#include + +/** + Return the number of bytes required to encode `size` bytes in base64. + + @param size The number of input (binary) bytes to encode. + @param wrap_lines Wrap lines at 76 characters to conform to RFC 2045. + @return The length of the base64 encoding, excluding null terminator. +*/ +SERD_CONST_FUNC size_t +serd_base64_get_length(size_t size, bool wrap_lines); + +/** + Encode `size` bytes of `buf` into `str`, which must be large enough. + + @param str Output string buffer. + @param buf Input binary data. + @param size Number of bytes to encode from `buf`. + @param wrap_lines Wrap lines at 76 characters to conform to RFC 2045. + @return True iff `str` contains newlines. +*/ +bool +serd_base64_encode(uint8_t* str, const void* buf, size_t size, bool wrap_lines); + +#endif // SERD_BASE64_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,98 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef SERD_BYTE_SINK_H +#define SERD_BYTE_SINK_H + +#include "serd_internal.h" +#include "system.h" + +#include "serd/serd.h" + +#include +#include +#include + +typedef struct SerdByteSinkImpl { + SerdSink sink; + void* stream; + uint8_t* buf; + size_t size; + size_t block_size; +} SerdByteSink; + +static inline SerdByteSink +serd_byte_sink_new(SerdSink sink, void* stream, size_t block_size) +{ + SerdByteSink bsink = {sink, stream, NULL, 0, block_size}; + + if (block_size > 1) { + bsink.buf = (uint8_t*)serd_allocate_buffer(block_size); + } + + return bsink; +} + +static inline void +serd_byte_sink_flush(SerdByteSink* bsink) +{ + if (bsink->block_size > 1 && bsink->size > 0) { + bsink->sink(bsink->buf, bsink->size, bsink->stream); + bsink->size = 0; + } +} + +static inline void +serd_byte_sink_free(SerdByteSink* bsink) +{ + serd_byte_sink_flush(bsink); + serd_free_aligned(bsink->buf); + bsink->buf = NULL; +} + +static inline size_t +serd_byte_sink_write(const void* buf, size_t len, SerdByteSink* bsink) +{ + if (len == 0) { + return 0; + } + + if (bsink->block_size == 1) { + return bsink->sink(buf, len, bsink->stream); + } + + const size_t orig_len = len; + while (len) { + const size_t space = bsink->block_size - bsink->size; + const size_t n = MIN(space, len); + + // Write as much as possible into the remaining buffer space + memcpy(bsink->buf + bsink->size, buf, n); + bsink->size += n; + buf = (const uint8_t*)buf + n; + len -= n; + + // Flush page if buffer is full + if (bsink->size == bsink->block_size) { + bsink->sink(bsink->buf, bsink->block_size, bsink->stream); + bsink->size = 0; + } + } + + return orig_len; +} + +#endif // SERD_BYTE_SINK_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,112 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#include "byte_source.h" + +#include "system.h" + +#include "serd/serd.h" + +#include +#include +#include + +SerdStatus +serd_byte_source_page(SerdByteSource* source) +{ + source->read_head = 0; + const size_t n_read = + source->read_func(source->file_buf, 1, source->page_size, source->stream); + + if (n_read == 0) { + source->file_buf[0] = '\0'; + source->eof = true; + return (source->error_func(source->stream) ? SERD_ERR_UNKNOWN + : SERD_FAILURE); + } + + if (n_read < source->page_size) { + source->file_buf[n_read] = '\0'; + source->buf_size = n_read; + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_byte_source_open_source(SerdByteSource* source, + SerdSource read_func, + SerdStreamErrorFunc error_func, + void* stream, + const uint8_t* name, + size_t page_size) +{ + const Cursor cur = {name, 1, 1}; + + memset(source, '\0', sizeof(*source)); + source->stream = stream; + source->from_stream = true; + source->page_size = page_size; + source->buf_size = page_size; + source->cur = cur; + source->error_func = error_func; + source->read_func = read_func; + + if (page_size > 1) { + source->file_buf = (uint8_t*)serd_allocate_buffer(page_size); + source->read_buf = source->file_buf; + memset(source->file_buf, '\0', page_size); + } else { + source->read_buf = &source->read_byte; + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_byte_source_prepare(SerdByteSource* source) +{ + source->prepared = true; + + if (source->from_stream) { + return (source->page_size > 1 ? serd_byte_source_page(source) + : serd_byte_source_advance(source)); + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_byte_source_open_string(SerdByteSource* source, const uint8_t* utf8) +{ + const Cursor cur = {(const uint8_t*)"(string)", 1, 1}; + + memset(source, '\0', sizeof(*source)); + source->cur = cur; + source->read_buf = utf8; + return SERD_SUCCESS; +} + +SerdStatus +serd_byte_source_close(SerdByteSource* source) +{ + if (source->page_size > 1) { + serd_free_aligned(source->file_buf); + } + + memset(source, '\0', sizeof(*source)); + return SERD_SUCCESS; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,120 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef SERD_BYTE_SOURCE_H +#define SERD_BYTE_SOURCE_H + +#include "serd/serd.h" + +#include +#include +#include +#include +#include + +typedef struct { + const uint8_t* filename; + unsigned line; + unsigned col; +} Cursor; + +typedef struct { + SerdSource read_func; ///< Read function (e.g. fread) + SerdStreamErrorFunc error_func; ///< Error function (e.g. ferror) + void* stream; ///< Stream (e.g. FILE) + size_t page_size; ///< Number of bytes to read at a time + size_t buf_size; ///< Number of bytes in file_buf + Cursor cur; ///< Cursor for error reporting + uint8_t* file_buf; ///< Buffer iff reading pages from a file + const uint8_t* read_buf; ///< Pointer to file_buf or read_byte + size_t read_head; ///< Offset into read_buf + uint8_t read_byte; ///< 1-byte 'buffer' used when not paging + bool from_stream; ///< True iff reading from `stream` + bool prepared; ///< True iff prepared for reading + bool eof; ///< True iff end of file reached +} SerdByteSource; + +SerdStatus +serd_byte_source_open_file(SerdByteSource* source, FILE* file, bool bulk); + +SerdStatus +serd_byte_source_open_string(SerdByteSource* source, const uint8_t* utf8); + +SerdStatus +serd_byte_source_open_source(SerdByteSource* source, + SerdSource read_func, + SerdStreamErrorFunc error_func, + void* stream, + const uint8_t* name, + size_t page_size); + +SerdStatus +serd_byte_source_close(SerdByteSource* source); + +SerdStatus +serd_byte_source_prepare(SerdByteSource* source); + +SerdStatus +serd_byte_source_page(SerdByteSource* source); + +static inline SERD_PURE_FUNC uint8_t +serd_byte_source_peek(SerdByteSource* source) +{ + assert(source->prepared); + return source->read_buf[source->read_head]; +} + +static inline SerdStatus +serd_byte_source_advance(SerdByteSource* source) +{ + SerdStatus st = SERD_SUCCESS; + + switch (serd_byte_source_peek(source)) { + case '\n': + ++source->cur.line; + source->cur.col = 0; + break; + default: + ++source->cur.col; + } + + const bool was_eof = source->eof; + if (source->from_stream) { + source->eof = false; + if (source->page_size > 1) { + if (++source->read_head == source->page_size) { + st = serd_byte_source_page(source); + } else if (source->read_head == source->buf_size) { + source->eof = true; + } + } else { + if (!source->read_func(&source->read_byte, 1, 1, source->stream)) { + source->eof = true; + st = + source->error_func(source->stream) ? SERD_ERR_UNKNOWN : SERD_FAILURE; + } + } + } else if (!source->eof) { + ++source->read_head; // Move to next character in string + if (source->read_buf[source->read_head] == '\0') { + source->eof = true; + } + } + + return (was_eof && source->eof) ? SERD_FAILURE : st; +} + +#endif // SERD_BYTE_SOURCE_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/.clang-tidy juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/.clang-tidy --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/.clang-tidy 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/.clang-tidy 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,18 @@ +Checks: > + *, + -*-magic-numbers, + -*-uppercase-literal-suffix, + -bugprone-branch-clone, + -bugprone-reserved-identifier, + -bugprone-suspicious-string-compare, + -cert-dcl37-c, + -cert-dcl51-cpp, + -clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling, + -google-readability-todo, + -hicpp-signed-bitwise, + -llvm-header-guard, + -llvmlibc-*, + -misc-no-recursion, +WarningsAsErrors: '*' +HeaderFilterRegex: '.*' +FormatStyle: file diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,256 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#include "serd/serd.h" + +#include +#include +#include +#include +#include + +typedef struct { + SerdNode name; + SerdNode uri; +} SerdPrefix; + +struct SerdEnvImpl { + SerdPrefix* prefixes; + size_t n_prefixes; + SerdNode base_uri_node; + SerdURI base_uri; +}; + +SerdEnv* +serd_env_new(const SerdNode* base_uri) +{ + SerdEnv* env = (SerdEnv*)calloc(1, sizeof(struct SerdEnvImpl)); + if (env && base_uri) { + serd_env_set_base_uri(env, base_uri); + } + + return env; +} + +void +serd_env_free(SerdEnv* env) +{ + if (!env) { + return; + } + + for (size_t i = 0; i < env->n_prefixes; ++i) { + serd_node_free(&env->prefixes[i].name); + serd_node_free(&env->prefixes[i].uri); + } + + free(env->prefixes); + serd_node_free(&env->base_uri_node); + free(env); +} + +const SerdNode* +serd_env_get_base_uri(const SerdEnv* env, SerdURI* out) +{ + if (out) { + *out = env->base_uri; + } + + return &env->base_uri_node; +} + +SerdStatus +serd_env_set_base_uri(SerdEnv* env, const SerdNode* uri) +{ + if (!env || (uri && uri->type != SERD_URI)) { + return SERD_ERR_BAD_ARG; + } + + if (!uri || !uri->buf) { + serd_node_free(&env->base_uri_node); + env->base_uri_node = SERD_NODE_NULL; + env->base_uri = SERD_URI_NULL; + return SERD_SUCCESS; + } + + // Resolve base URI and create a new node and URI for it + SerdURI base_uri; + SerdNode base_uri_node = + serd_node_new_uri_from_node(uri, &env->base_uri, &base_uri); + + // Replace the current base URI + serd_node_free(&env->base_uri_node); + env->base_uri_node = base_uri_node; + env->base_uri = base_uri; + + return SERD_SUCCESS; +} + +static inline SERD_PURE_FUNC SerdPrefix* +serd_env_find(const SerdEnv* env, const uint8_t* name, size_t name_len) +{ + for (size_t i = 0; i < env->n_prefixes; ++i) { + const SerdNode* const prefix_name = &env->prefixes[i].name; + if (prefix_name->n_bytes == name_len) { + if (!memcmp(prefix_name->buf, name, name_len)) { + return &env->prefixes[i]; + } + } + } + + return NULL; +} + +static void +serd_env_add(SerdEnv* env, const SerdNode* name, const SerdNode* uri) +{ + SerdPrefix* const prefix = serd_env_find(env, name->buf, name->n_bytes); + if (prefix) { + if (!serd_node_equals(&prefix->uri, uri)) { + SerdNode old_prefix_uri = prefix->uri; + prefix->uri = serd_node_copy(uri); + serd_node_free(&old_prefix_uri); + } + } else { + env->prefixes = (SerdPrefix*)realloc( + env->prefixes, (++env->n_prefixes) * sizeof(SerdPrefix)); + env->prefixes[env->n_prefixes - 1].name = serd_node_copy(name); + env->prefixes[env->n_prefixes - 1].uri = serd_node_copy(uri); + } +} + +SerdStatus +serd_env_set_prefix(SerdEnv* env, const SerdNode* name, const SerdNode* uri) +{ + if (!name->buf || uri->type != SERD_URI) { + return SERD_ERR_BAD_ARG; + } + + if (serd_uri_string_has_scheme(uri->buf)) { + // Set prefix to absolute URI + serd_env_add(env, name, uri); + } else { + // Resolve relative URI and create a new node and URI for it + SerdURI abs_uri; + SerdNode abs_uri_node = + serd_node_new_uri_from_node(uri, &env->base_uri, &abs_uri); + + // Set prefix to resolved (absolute) URI + serd_env_add(env, name, &abs_uri_node); + serd_node_free(&abs_uri_node); + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_env_set_prefix_from_strings(SerdEnv* env, + const uint8_t* name, + const uint8_t* uri) +{ + const SerdNode name_node = serd_node_from_string(SERD_LITERAL, name); + const SerdNode uri_node = serd_node_from_string(SERD_URI, uri); + + return serd_env_set_prefix(env, &name_node, &uri_node); +} + +bool +serd_env_qualify(const SerdEnv* env, + const SerdNode* uri, + SerdNode* prefix, + SerdChunk* suffix) +{ + for (size_t i = 0; i < env->n_prefixes; ++i) { + const SerdNode* const prefix_uri = &env->prefixes[i].uri; + if (uri->n_bytes >= prefix_uri->n_bytes) { + if (!strncmp((const char*)uri->buf, + (const char*)prefix_uri->buf, + prefix_uri->n_bytes)) { + *prefix = env->prefixes[i].name; + suffix->buf = uri->buf + prefix_uri->n_bytes; + suffix->len = uri->n_bytes - prefix_uri->n_bytes; + return true; + } + } + } + return false; +} + +SerdStatus +serd_env_expand(const SerdEnv* env, + const SerdNode* curie, + SerdChunk* uri_prefix, + SerdChunk* uri_suffix) +{ + const uint8_t* const colon = + (const uint8_t*)memchr(curie->buf, ':', curie->n_bytes + 1); + if (curie->type != SERD_CURIE || !colon) { + return SERD_ERR_BAD_ARG; + } + + const size_t name_len = (size_t)(colon - curie->buf); + const SerdPrefix* const prefix = serd_env_find(env, curie->buf, name_len); + if (prefix) { + uri_prefix->buf = prefix->uri.buf; + uri_prefix->len = prefix->uri.n_bytes; + uri_suffix->buf = colon + 1; + uri_suffix->len = curie->n_bytes - name_len - 1; + return SERD_SUCCESS; + } + return SERD_ERR_BAD_CURIE; +} + +SerdNode +serd_env_expand_node(const SerdEnv* env, const SerdNode* node) +{ + switch (node->type) { + case SERD_NOTHING: + case SERD_LITERAL: + break; + + case SERD_URI: { + SerdURI ignored; + return serd_node_new_uri_from_node(node, &env->base_uri, &ignored); + } + + case SERD_CURIE: { + SerdChunk prefix; + SerdChunk suffix; + if (serd_env_expand(env, node, &prefix, &suffix)) { + return SERD_NODE_NULL; + } + const size_t len = prefix.len + suffix.len; + uint8_t* buf = (uint8_t*)malloc(len + 1); + SerdNode ret = {buf, len, 0, 0, SERD_URI}; + snprintf((char*)buf, len + 1, "%s%s", prefix.buf, suffix.buf); + ret.n_chars = serd_strlen(buf, NULL, NULL); + return ret; + } + + case SERD_BLANK: + break; + } + + return SERD_NODE_NULL; +} + +void +serd_env_foreach(const SerdEnv* env, SerdPrefixSink func, void* handle) +{ + for (size_t i = 0; i < env->n_prefixes; ++i) { + func(handle, &env->prefixes[i].name, &env->prefixes[i].uri); + } +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1720 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#include "byte_source.h" +#include "reader.h" +#include "serd_internal.h" +#include "stack.h" +#include "string_utils.h" +#include "uri_utils.h" + +#include "serd/serd.h" + +#include +#include +#include +#include +#include +#include + +#define TRY(st, exp) \ + do { \ + if (((st) = (exp))) { \ + return (st); \ + } \ + } while (0) + +static inline bool +fancy_syntax(const SerdReader* reader) +{ + return reader->syntax == SERD_TURTLE || reader->syntax == SERD_TRIG; +} + +static SerdStatus +read_collection(SerdReader* reader, ReadContext ctx, Ref* dest); + +static SerdStatus +read_predicateObjectList(SerdReader* reader, ReadContext ctx, bool* ate_dot); + +static inline uint8_t +read_HEX(SerdReader* reader) +{ + const int c = peek_byte(reader); + if (is_xdigit(c)) { + return (uint8_t)eat_byte_safe(reader, c); + } + + r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid hexadecimal digit `%c'\n", c); + return 0; +} + +// Read UCHAR escape, initial \ is already eaten by caller +static inline SerdStatus +read_UCHAR(SerdReader* reader, Ref dest, uint32_t* char_code) +{ + const int b = peek_byte(reader); + unsigned length = 0; + switch (b) { + case 'U': + length = 8; + break; + case 'u': + length = 4; + break; + default: + return SERD_ERR_BAD_SYNTAX; + } + + eat_byte_safe(reader, b); + + uint8_t buf[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + for (unsigned i = 0; i < length; ++i) { + if (!(buf[i] = read_HEX(reader))) { + return SERD_ERR_BAD_SYNTAX; + } + } + + char* endptr = NULL; + const uint32_t code = (uint32_t)strtoul((const char*)buf, &endptr, 16); + assert(endptr == (char*)buf + length); + + unsigned size = 0; + if (code < 0x00000080) { + size = 1; + } else if (code < 0x00000800) { + size = 2; + } else if (code < 0x00010000) { + size = 3; + } else if (code < 0x00110000) { + size = 4; + } else { + r_err(reader, + SERD_ERR_BAD_SYNTAX, + "unicode character 0x%X out of range\n", + code); + push_bytes(reader, dest, replacement_char, 3); + *char_code = 0xFFFD; + return SERD_SUCCESS; + } + + // Build output in buf + // (Note # of bytes = # of leading 1 bits in first byte) + uint32_t c = code; + switch (size) { + case 4: + buf[3] = (uint8_t)(0x80u | (c & 0x3Fu)); + c >>= 6; + c |= (16 << 12); // set bit 4 + /* fallthru */ + case 3: + buf[2] = (uint8_t)(0x80u | (c & 0x3Fu)); + c >>= 6; + c |= (32 << 6); // set bit 5 + /* fallthru */ + case 2: + buf[1] = (uint8_t)(0x80u | (c & 0x3Fu)); + c >>= 6; + c |= 0xC0; // set bits 6 and 7 + /* fallthru */ + case 1: + buf[0] = (uint8_t)c; + /* fallthru */ + default: + break; + } + + push_bytes(reader, dest, buf, size); + *char_code = code; + return SERD_SUCCESS; +} + +// Read ECHAR escape, initial \ is already eaten by caller +static inline SerdStatus +read_ECHAR(SerdReader* reader, Ref dest, SerdNodeFlags* flags) +{ + const int c = peek_byte(reader); + switch (c) { + case 't': + eat_byte_safe(reader, 't'); + push_byte(reader, dest, '\t'); + return SERD_SUCCESS; + case 'b': + eat_byte_safe(reader, 'b'); + push_byte(reader, dest, '\b'); + return SERD_SUCCESS; + case 'n': + *flags |= SERD_HAS_NEWLINE; + eat_byte_safe(reader, 'n'); + push_byte(reader, dest, '\n'); + return SERD_SUCCESS; + case 'r': + *flags |= SERD_HAS_NEWLINE; + eat_byte_safe(reader, 'r'); + push_byte(reader, dest, '\r'); + return SERD_SUCCESS; + case 'f': + eat_byte_safe(reader, 'f'); + push_byte(reader, dest, '\f'); + return SERD_SUCCESS; + case '\\': + case '"': + case '\'': + push_byte(reader, dest, eat_byte_safe(reader, c)); + return SERD_SUCCESS; + default: + return SERD_ERR_BAD_SYNTAX; + } +} + +static inline SerdStatus +bad_char(SerdReader* reader, const char* fmt, uint8_t c) +{ + // Skip bytes until the next start byte + for (int b = peek_byte(reader); b != EOF && ((uint8_t)b & 0x80);) { + eat_byte_safe(reader, b); + b = peek_byte(reader); + } + + r_err(reader, SERD_ERR_BAD_SYNTAX, fmt, c); + return reader->strict ? SERD_ERR_BAD_SYNTAX : SERD_FAILURE; +} + +static SerdStatus +read_utf8_bytes(SerdReader* reader, uint8_t bytes[4], uint32_t* size, uint8_t c) +{ + *size = utf8_num_bytes(c); + if (*size <= 1 || *size > 4) { + return bad_char(reader, "invalid UTF-8 start 0x%X\n", c); + } + + bytes[0] = c; + for (unsigned i = 1; i < *size; ++i) { + const int b = peek_byte(reader); + if (b == EOF || ((uint8_t)b & 0x80) == 0) { + return bad_char(reader, "invalid UTF-8 continuation 0x%X\n", (uint8_t)b); + } + + eat_byte_safe(reader, b); + bytes[i] = (uint8_t)b; + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_utf8_character(SerdReader* reader, Ref dest, uint8_t c) +{ + uint32_t size = 0; + uint8_t bytes[4] = {0, 0, 0, 0}; + SerdStatus st = read_utf8_bytes(reader, bytes, &size, c); + if (st) { + push_bytes(reader, dest, replacement_char, 3); + } else { + push_bytes(reader, dest, bytes, size); + } + + return st; +} + +static SerdStatus +read_utf8_code(SerdReader* reader, Ref dest, uint32_t* code, uint8_t c) +{ + uint32_t size = 0; + uint8_t bytes[4] = {0, 0, 0, 0}; + SerdStatus st = read_utf8_bytes(reader, bytes, &size, c); + if (st) { + push_bytes(reader, dest, replacement_char, 3); + return st; + } + + push_bytes(reader, dest, bytes, size); + *code = parse_counted_utf8_char(bytes, size); + return st; +} + +// Read one character (possibly multi-byte) +// The first byte, c, has already been eaten by caller +static inline SerdStatus +read_character(SerdReader* reader, Ref dest, SerdNodeFlags* flags, uint8_t c) +{ + if (!(c & 0x80)) { + switch (c) { + case 0xA: + case 0xD: + *flags |= SERD_HAS_NEWLINE; + break; + case '"': + case '\'': + *flags |= SERD_HAS_QUOTE; + break; + default: + break; + } + return push_byte(reader, dest, c); + } + + return read_utf8_character(reader, dest, c); +} + +// [10] comment ::= '#' ( [^#xA #xD] )* +static void +read_comment(SerdReader* reader) +{ + eat_byte_safe(reader, '#'); + int c = 0; + while (((c = peek_byte(reader)) != 0xA) && c != 0xD && c != EOF && c) { + eat_byte_safe(reader, c); + } +} + +// [24] ws ::= #x9 | #xA | #xD | #x20 | comment +static inline bool +read_ws(SerdReader* reader) +{ + const int c = peek_byte(reader); + switch (c) { + case 0x9: + case 0xA: + case 0xD: + case 0x20: + eat_byte_safe(reader, c); + return true; + case '#': + read_comment(reader); + return true; + default: + return false; + } +} + +static inline bool +read_ws_star(SerdReader* reader) +{ + while (read_ws(reader)) { + } + + return true; +} + +static inline bool +peek_delim(SerdReader* reader, const char delim) +{ + read_ws_star(reader); + return peek_byte(reader) == delim; +} + +static inline bool +eat_delim(SerdReader* reader, const char delim) +{ + if (peek_delim(reader, delim)) { + eat_byte_safe(reader, delim); + return read_ws_star(reader); + } + + return false; +} + +// STRING_LITERAL_LONG_QUOTE and STRING_LITERAL_LONG_SINGLE_QUOTE +// Initial triple quotes are already eaten by caller +static SerdStatus +read_STRING_LITERAL_LONG(SerdReader* reader, + Ref ref, + SerdNodeFlags* flags, + uint8_t q) +{ + SerdStatus st = SERD_SUCCESS; + + while (!(st && reader->strict)) { + const int c = peek_byte(reader); + if (c == '\\') { + eat_byte_safe(reader, c); + uint32_t code = 0; + if ((st = read_ECHAR(reader, ref, flags)) && + (st = read_UCHAR(reader, ref, &code))) { + return r_err(reader, st, "invalid escape `\\%c'\n", peek_byte(reader)); + } + } else if (c == q) { + eat_byte_safe(reader, q); + const int q2 = eat_byte_safe(reader, peek_byte(reader)); + const int q3 = peek_byte(reader); + if (q2 == q && q3 == q) { // End of string + eat_byte_safe(reader, q3); + break; + } + *flags |= SERD_HAS_QUOTE; + push_byte(reader, ref, c); + st = read_character(reader, ref, flags, (uint8_t)q2); + } else if (c == EOF) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "end of file in long string\n"); + } else { + st = + read_character(reader, ref, flags, (uint8_t)eat_byte_safe(reader, c)); + } + } + + return (st && reader->strict) ? st : SERD_SUCCESS; +} + +// STRING_LITERAL_QUOTE and STRING_LITERAL_SINGLE_QUOTE +// Initial quote is already eaten by caller +static SerdStatus +read_STRING_LITERAL(SerdReader* reader, + Ref ref, + SerdNodeFlags* flags, + uint8_t q) +{ + SerdStatus st = SERD_SUCCESS; + + while (!(st && reader->strict)) { + const int c = peek_byte(reader); + uint32_t code = 0; + switch (c) { + case EOF: + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "end of file in short string\n"); + case '\n': + case '\r': + return r_err(reader, SERD_ERR_BAD_SYNTAX, "line end in short string\n"); + case '\\': + eat_byte_safe(reader, c); + if ((st = read_ECHAR(reader, ref, flags)) && + (st = read_UCHAR(reader, ref, &code))) { + return r_err(reader, st, "invalid escape `\\%c'\n", peek_byte(reader)); + } + break; + default: + if (c == q) { + eat_byte_check(reader, q); + return SERD_SUCCESS; + } else { + st = + read_character(reader, ref, flags, (uint8_t)eat_byte_safe(reader, c)); + } + } + } + + return st ? st + : (eat_byte_check(reader, q) ? SERD_SUCCESS : SERD_ERR_BAD_SYNTAX); +} + +static SerdStatus +read_String(SerdReader* reader, Ref node, SerdNodeFlags* flags) +{ + const int q1 = peek_byte(reader); + eat_byte_safe(reader, q1); + + const int q2 = peek_byte(reader); + if (q2 == EOF) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "unexpected end of file\n"); + } + + if (q2 != q1) { // Short string (not triple quoted) + return read_STRING_LITERAL(reader, node, flags, (uint8_t)q1); + } + + eat_byte_safe(reader, q2); + const int q3 = peek_byte(reader); + if (q3 == EOF) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "unexpected end of file\n"); + } + + if (q3 != q1) { // Empty short string ("" or '') + return SERD_SUCCESS; + } + + if (!fancy_syntax(reader)) { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "syntax does not support long literals\n"); + } + + eat_byte_safe(reader, q3); + return read_STRING_LITERAL_LONG(reader, node, flags, (uint8_t)q1); +} + +static inline bool +is_PN_CHARS_BASE(const uint32_t c) +{ + return ((c >= 0x00C0 && c <= 0x00D6) || (c >= 0x00D8 && c <= 0x00F6) || + (c >= 0x00F8 && c <= 0x02FF) || (c >= 0x0370 && c <= 0x037D) || + (c >= 0x037F && c <= 0x1FFF) || (c >= 0x200C && c <= 0x200D) || + (c >= 0x2070 && c <= 0x218F) || (c >= 0x2C00 && c <= 0x2FEF) || + (c >= 0x3001 && c <= 0xD7FF) || (c >= 0xF900 && c <= 0xFDCF) || + (c >= 0xFDF0 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0xEFFFF)); +} + +static SerdStatus +read_PN_CHARS_BASE(SerdReader* reader, Ref dest) +{ + uint32_t code = 0; + const int c = peek_byte(reader); + SerdStatus st = SERD_SUCCESS; + if (is_alpha(c)) { + push_byte(reader, dest, eat_byte_safe(reader, c)); + } else if (c == EOF || !(c & 0x80)) { + return SERD_FAILURE; + } else if ((st = read_utf8_code( + reader, dest, &code, (uint8_t)eat_byte_safe(reader, c)))) { + return st; + } else if (!is_PN_CHARS_BASE(code)) { + r_err( + reader, SERD_ERR_BAD_SYNTAX, "invalid character U+%04X in name\n", code); + if (reader->strict) { + return SERD_ERR_BAD_SYNTAX; + } + } + return st; +} + +static inline bool +is_PN_CHARS(const uint32_t c) +{ + return (is_PN_CHARS_BASE(c) || c == 0xB7 || (c >= 0x0300 && c <= 0x036F) || + (c >= 0x203F && c <= 0x2040)); +} + +static SerdStatus +read_PN_CHARS(SerdReader* reader, Ref dest) +{ + uint32_t code = 0; + const int c = peek_byte(reader); + SerdStatus st = SERD_SUCCESS; + if (is_alpha(c) || is_digit(c) || c == '_' || c == '-') { + push_byte(reader, dest, eat_byte_safe(reader, c)); + } else if (c == EOF || !(c & 0x80)) { + return SERD_FAILURE; + } else if ((st = read_utf8_code( + reader, dest, &code, (uint8_t)eat_byte_safe(reader, c)))) { + return st; + } else if (!is_PN_CHARS(code)) { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "invalid character U+%04X in name\n", code); + } + return st; +} + +static SerdStatus +read_PERCENT(SerdReader* reader, Ref dest) +{ + push_byte(reader, dest, eat_byte_safe(reader, '%')); + const uint8_t h1 = read_HEX(reader); + const uint8_t h2 = read_HEX(reader); + if (h1 && h2) { + push_byte(reader, dest, h1); + return push_byte(reader, dest, h2); + } + + return SERD_ERR_BAD_SYNTAX; +} + +static SerdStatus +read_PN_LOCAL_ESC(SerdReader* reader, Ref dest) +{ + eat_byte_safe(reader, '\\'); + + const int c = peek_byte(reader); + switch (c) { + case '!': + case '#': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case ';': + case '=': + case '?': + case '@': + case '_': + case '~': + push_byte(reader, dest, eat_byte_safe(reader, c)); + break; + default: + return r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid escape\n"); + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_PLX(SerdReader* reader, Ref dest) +{ + const int c = peek_byte(reader); + switch (c) { + case '%': + return read_PERCENT(reader, dest); + case '\\': + return read_PN_LOCAL_ESC(reader, dest); + default: + return SERD_FAILURE; + } +} + +static SerdStatus +read_PN_LOCAL(SerdReader* reader, Ref dest, bool* ate_dot) +{ + int c = peek_byte(reader); + SerdStatus st = SERD_SUCCESS; + bool trailing_unescaped_dot = false; + switch (c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case '_': + push_byte(reader, dest, eat_byte_safe(reader, c)); + break; + default: + if ((st = read_PLX(reader, dest)) > SERD_FAILURE) { + return r_err(reader, st, "bad escape\n"); + } else if (st != SERD_SUCCESS && read_PN_CHARS_BASE(reader, dest)) { + return SERD_FAILURE; + } + } + + while ((c = peek_byte(reader))) { // Middle: (PN_CHARS | '.' | ':')* + if (c == '.' || c == ':') { + push_byte(reader, dest, eat_byte_safe(reader, c)); + } else if ((st = read_PLX(reader, dest)) > SERD_FAILURE) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "bad escape\n"); + } else if (st != SERD_SUCCESS && (st = read_PN_CHARS(reader, dest))) { + break; + } + trailing_unescaped_dot = (c == '.'); + } + + SerdNode* const n = deref(reader, dest); + if (trailing_unescaped_dot) { + // Ate trailing dot, pop it from stack/node and inform caller + --n->n_bytes; + serd_stack_pop(&reader->stack, 1); + *ate_dot = true; + } + + return (st > SERD_FAILURE) ? st : SERD_SUCCESS; +} + +// Read the remainder of a PN_PREFIX after some initial characters +static SerdStatus +read_PN_PREFIX_tail(SerdReader* reader, Ref dest) +{ + int c = 0; + while ((c = peek_byte(reader))) { // Middle: (PN_CHARS | '.')* + if (c == '.') { + push_byte(reader, dest, eat_byte_safe(reader, c)); + } else if (read_PN_CHARS(reader, dest)) { + break; + } + } + + const SerdNode* const n = deref(reader, dest); + if (n->buf[n->n_bytes - 1] == '.' && read_PN_CHARS(reader, dest)) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "prefix ends with `.'\n"); + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_PN_PREFIX(SerdReader* reader, Ref dest) +{ + if (!read_PN_CHARS_BASE(reader, dest)) { + return read_PN_PREFIX_tail(reader, dest); + } + + return SERD_FAILURE; +} + +static SerdStatus +read_LANGTAG(SerdReader* reader, Ref* dest) +{ + int c = peek_byte(reader); + if (!is_alpha(c)) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "unexpected `%c'\n", c); + } + + *dest = push_node(reader, SERD_LITERAL, "", 0); + + SerdStatus st = SERD_SUCCESS; + TRY(st, push_byte(reader, *dest, eat_byte_safe(reader, c))); + while ((c = peek_byte(reader)) && is_alpha(c)) { + TRY(st, push_byte(reader, *dest, eat_byte_safe(reader, c))); + } + + while (peek_byte(reader) == '-') { + TRY(st, push_byte(reader, *dest, eat_byte_safe(reader, '-'))); + while ((c = peek_byte(reader)) && (is_alpha(c) || is_digit(c))) { + TRY(st, push_byte(reader, *dest, eat_byte_safe(reader, c))); + } + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_IRIREF_scheme(SerdReader* reader, Ref dest) +{ + int c = peek_byte(reader); + if (!is_alpha(c)) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "bad IRI scheme start `%c'\n", c); + } + + while ((c = peek_byte(reader)) != EOF) { + if (c == '>') { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "missing IRI scheme\n"); + } + + if (!is_uri_scheme_char(c)) { + return r_err(reader, + SERD_ERR_BAD_SYNTAX, + "bad IRI scheme char U+%04X (%c)\n", + (unsigned)c, + (char)c); + } + + push_byte(reader, dest, eat_byte_safe(reader, c)); + if (c == ':') { + return SERD_SUCCESS; // End of scheme + } + } + + return r_err(reader, SERD_ERR_BAD_SYNTAX, "unexpected end of file\n"); +} + +static SerdStatus +read_IRIREF(SerdReader* reader, Ref* dest) +{ + if (!eat_byte_check(reader, '<')) { + return SERD_ERR_BAD_SYNTAX; + } + + *dest = push_node(reader, SERD_URI, "", 0); + + if (!fancy_syntax(reader) && read_IRIREF_scheme(reader, *dest)) { + *dest = pop_node(reader, *dest); + return r_err(reader, SERD_ERR_BAD_SYNTAX, "expected IRI scheme\n"); + } + + SerdStatus st = SERD_SUCCESS; + uint32_t code = 0; + while (!st) { + const int c = eat_byte_safe(reader, peek_byte(reader)); + switch (c) { + case '"': + case '<': + *dest = pop_node(reader, *dest); + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "invalid IRI character `%c'\n", c); + + case '>': + return SERD_SUCCESS; + + case '\\': + if (read_UCHAR(reader, *dest, &code)) { + *dest = pop_node(reader, *dest); + return r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid IRI escape\n"); + } + + switch (code) { + case 0: + case ' ': + case '<': + case '>': + *dest = pop_node(reader, *dest); + return r_err(reader, + SERD_ERR_BAD_SYNTAX, + "invalid escaped IRI character U+%04X\n", + code); + default: + break; + } + break; + + case '^': + case '`': + case '{': + case '|': + case '}': + *dest = pop_node(reader, *dest); + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "invalid IRI character `%c'\n", c); + + default: + if (c <= 0x20) { + r_err(reader, + SERD_ERR_BAD_SYNTAX, + "invalid IRI character (escape %%%02X)\n", + (unsigned)c); + if (reader->strict) { + *dest = pop_node(reader, *dest); + return SERD_ERR_BAD_SYNTAX; + } + st = SERD_FAILURE; + push_byte(reader, *dest, c); + } else if (!(c & 0x80)) { + push_byte(reader, *dest, c); + } else if (read_utf8_character(reader, *dest, (uint8_t)c)) { + if (reader->strict) { + *dest = pop_node(reader, *dest); + return SERD_ERR_BAD_SYNTAX; + } + } + } + } + + *dest = pop_node(reader, *dest); + return st; +} + +static SerdStatus +read_PrefixedName(SerdReader* reader, Ref dest, bool read_prefix, bool* ate_dot) +{ + SerdStatus st = SERD_SUCCESS; + if (read_prefix && ((st = read_PN_PREFIX(reader, dest)) > SERD_FAILURE)) { + return st; + } + + if (peek_byte(reader) != ':') { + return SERD_FAILURE; + } + + push_byte(reader, dest, eat_byte_safe(reader, ':')); + + st = read_PN_LOCAL(reader, dest, ate_dot); + + return (st > SERD_FAILURE) ? st : SERD_SUCCESS; +} + +static SerdStatus +read_0_9(SerdReader* reader, Ref str, bool at_least_one) +{ + unsigned count = 0; + SerdStatus st = SERD_SUCCESS; + for (int c = 0; is_digit((c = peek_byte(reader))); ++count) { + TRY(st, push_byte(reader, str, eat_byte_safe(reader, c))); + } + + if (at_least_one && count == 0) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "expected digit\n"); + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_number(SerdReader* reader, Ref* dest, Ref* datatype, bool* ate_dot) +{ +#define XSD_DECIMAL NS_XSD "decimal" +#define XSD_DOUBLE NS_XSD "double" +#define XSD_INTEGER NS_XSD "integer" + + *dest = push_node(reader, SERD_LITERAL, "", 0); + + SerdStatus st = SERD_SUCCESS; + int c = peek_byte(reader); + bool has_decimal = false; + if (c == '-' || c == '+') { + push_byte(reader, *dest, eat_byte_safe(reader, c)); + } + if ((c = peek_byte(reader)) == '.') { + has_decimal = true; + // decimal case 2 (e.g. '.0' or `-.0' or `+.0') + push_byte(reader, *dest, eat_byte_safe(reader, c)); + TRY(st, read_0_9(reader, *dest, true)); + } else { + // all other cases ::= ( '-' | '+' ) [0-9]+ ( . )? ( [0-9]+ )? ... + TRY(st, read_0_9(reader, *dest, true)); + if ((c = peek_byte(reader)) == '.') { + has_decimal = true; + + // Annoyingly, dot can be end of statement, so tentatively eat + eat_byte_safe(reader, c); + c = peek_byte(reader); + if (!is_digit(c) && c != 'e' && c != 'E') { + *ate_dot = true; // Force caller to deal with stupid grammar + return SERD_SUCCESS; // Next byte is not a number character + } + + push_byte(reader, *dest, '.'); + read_0_9(reader, *dest, false); + } + } + c = peek_byte(reader); + if (c == 'e' || c == 'E') { + // double + push_byte(reader, *dest, eat_byte_safe(reader, c)); + switch ((c = peek_byte(reader))) { + case '+': + case '-': + push_byte(reader, *dest, eat_byte_safe(reader, c)); + default: + break; + } + TRY(st, read_0_9(reader, *dest, true)); + *datatype = push_node(reader, SERD_URI, XSD_DOUBLE, sizeof(XSD_DOUBLE) - 1); + } else if (has_decimal) { + *datatype = + push_node(reader, SERD_URI, XSD_DECIMAL, sizeof(XSD_DECIMAL) - 1); + } else { + *datatype = + push_node(reader, SERD_URI, XSD_INTEGER, sizeof(XSD_INTEGER) - 1); + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_iri(SerdReader* reader, Ref* dest, bool* ate_dot) +{ + switch (peek_byte(reader)) { + case '<': + return read_IRIREF(reader, dest); + default: + *dest = push_node(reader, SERD_CURIE, "", 0); + return read_PrefixedName(reader, *dest, true, ate_dot); + } +} + +static SerdStatus +read_literal(SerdReader* reader, + Ref* dest, + Ref* datatype, + Ref* lang, + SerdNodeFlags* flags, + bool* ate_dot) +{ + *dest = push_node(reader, SERD_LITERAL, "", 0); + + SerdStatus st = read_String(reader, *dest, flags); + if (st) { + *dest = pop_node(reader, *dest); + return st; + } + + switch (peek_byte(reader)) { + case '@': + eat_byte_safe(reader, '@'); + if ((st = read_LANGTAG(reader, lang))) { + *datatype = pop_node(reader, *datatype); + *lang = pop_node(reader, *lang); + *dest = pop_node(reader, *dest); + return r_err(reader, st, "bad literal\n"); + } + break; + case '^': + eat_byte_safe(reader, '^'); + eat_byte_check(reader, '^'); + if ((st = read_iri(reader, datatype, ate_dot))) { + *datatype = pop_node(reader, *datatype); + *lang = pop_node(reader, *lang); + *dest = pop_node(reader, *dest); + return r_err(reader, st, "bad literal\n"); + } + break; + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_verb(SerdReader* reader, Ref* dest) +{ + if (peek_byte(reader) == '<') { + return read_IRIREF(reader, dest); + } + + /* Either a qname, or "a". Read the prefix first, and if it is in fact + "a", produce that instead. + */ + *dest = push_node(reader, SERD_CURIE, "", 0); + + SerdStatus st = read_PN_PREFIX(reader, *dest); + bool ate_dot = false; + SerdNode* node = deref(reader, *dest); + const int next = peek_byte(reader); + if (!st && node->n_bytes == 1 && node->buf[0] == 'a' && next != ':' && + !is_PN_CHARS_BASE((uint32_t)next)) { + pop_node(reader, *dest); + *dest = push_node(reader, SERD_URI, NS_RDF "type", 47); + return SERD_SUCCESS; + } + + if (st > SERD_FAILURE || read_PrefixedName(reader, *dest, false, &ate_dot) || + ate_dot) { + *dest = pop_node(reader, *dest); + return r_err(reader, SERD_ERR_BAD_SYNTAX, "bad verb\n"); + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_BLANK_NODE_LABEL(SerdReader* reader, Ref* dest, bool* ate_dot) +{ + eat_byte_safe(reader, '_'); + eat_byte_check(reader, ':'); + + const Ref ref = *dest = + push_node(reader, + SERD_BLANK, + reader->bprefix ? (char*)reader->bprefix : "", + reader->bprefix_len); + + int c = peek_byte(reader); // First: (PN_CHARS | '_' | [0-9]) + if (is_digit(c) || c == '_') { + push_byte(reader, ref, eat_byte_safe(reader, c)); + } else if (read_PN_CHARS(reader, ref)) { + *dest = pop_node(reader, *dest); + return r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid name start\n"); + } + + while ((c = peek_byte(reader))) { // Middle: (PN_CHARS | '.')* + if (c == '.') { + push_byte(reader, ref, eat_byte_safe(reader, c)); + } else if (read_PN_CHARS(reader, ref)) { + break; + } + } + + SerdNode* n = deref(reader, ref); + if (n->buf[n->n_bytes - 1] == '.' && read_PN_CHARS(reader, ref)) { + // Ate trailing dot, pop it from stack/node and inform caller + --n->n_bytes; + serd_stack_pop(&reader->stack, 1); + *ate_dot = true; + } + + if (fancy_syntax(reader)) { + if (is_digit(n->buf[reader->bprefix_len + 1])) { + if ((n->buf[reader->bprefix_len]) == 'b') { + ((char*)n->buf)[reader->bprefix_len] = 'B'; // Prevent clash + reader->seen_genid = true; + } else if (reader->seen_genid && n->buf[reader->bprefix_len] == 'B') { + *dest = pop_node(reader, *dest); + return r_err(reader, + SERD_ERR_ID_CLASH, + "found both `b' and `B' blank IDs, prefix required\n"); + } + } + } + + return SERD_SUCCESS; +} + +static Ref +read_blankName(SerdReader* reader) +{ + eat_byte_safe(reader, '='); + if (eat_byte_check(reader, '=') != '=') { + r_err(reader, SERD_ERR_BAD_SYNTAX, "expected `='\n"); + return 0; + } + + Ref subject = 0; + bool ate_dot = false; + read_ws_star(reader); + read_iri(reader, &subject, &ate_dot); + return subject; +} + +static SerdStatus +read_anon(SerdReader* reader, ReadContext ctx, bool subject, Ref* dest) +{ + const SerdStatementFlags old_flags = *ctx.flags; + bool empty = false; + eat_byte_safe(reader, '['); + if ((empty = peek_delim(reader, ']'))) { + *ctx.flags |= (subject) ? SERD_EMPTY_S : SERD_EMPTY_O; + } else { + *ctx.flags |= (subject) ? SERD_ANON_S_BEGIN : SERD_ANON_O_BEGIN; + if (peek_delim(reader, '=')) { + if (!(*dest = read_blankName(reader)) || !eat_delim(reader, ';')) { + return SERD_ERR_BAD_SYNTAX; + } + } + } + + if (!*dest) { + *dest = blank_id(reader); + } + + SerdStatus st = SERD_SUCCESS; + if (ctx.subject) { + TRY(st, emit_statement(reader, ctx, *dest, 0, 0)); + } + + ctx.subject = *dest; + if (!empty) { + *ctx.flags &= ~(unsigned)SERD_LIST_CONT; + if (!subject) { + *ctx.flags |= SERD_ANON_CONT; + } + + bool ate_dot_in_list = false; + read_predicateObjectList(reader, ctx, &ate_dot_in_list); + if (ate_dot_in_list) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "`.' inside blank\n"); + } + + read_ws_star(reader); + if (reader->end_sink) { + reader->end_sink(reader->handle, deref(reader, *dest)); + } + + *ctx.flags = old_flags; + } + + return (eat_byte_check(reader, ']') == ']') ? SERD_SUCCESS + : SERD_ERR_BAD_SYNTAX; +} + +/* If emit is true: recurses, calling statement_sink for every statement + encountered, and leaves stack in original calling state (i.e. pops + everything it pushes). */ +static SerdStatus +read_object(SerdReader* reader, ReadContext* ctx, bool emit, bool* ate_dot) +{ + static const char* const XSD_BOOLEAN = NS_XSD "boolean"; + static const size_t XSD_BOOLEAN_LEN = 40; + +#ifndef NDEBUG + const size_t orig_stack_size = reader->stack.size; +#endif + + SerdStatus ret = SERD_FAILURE; + + bool simple = (ctx->subject != 0); + SerdNode* node = NULL; + Ref o = 0; + Ref datatype = 0; + Ref lang = 0; + uint32_t flags = 0; + const int c = peek_byte(reader); + if (!fancy_syntax(reader)) { + switch (c) { + case '"': + case ':': + case '<': + case '_': + break; + default: + return r_err(reader, SERD_ERR_BAD_SYNTAX, "expected: ':', '<', or '_'\n"); + } + } + switch (c) { + case EOF: + case ')': + return r_err(reader, SERD_ERR_BAD_SYNTAX, "expected object\n"); + case '[': + simple = false; + ret = read_anon(reader, *ctx, false, &o); + break; + case '(': + simple = false; + ret = read_collection(reader, *ctx, &o); + break; + case '_': + ret = read_BLANK_NODE_LABEL(reader, &o, ate_dot); + break; + case '<': + case ':': + ret = read_iri(reader, &o, ate_dot); + break; + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + ret = read_number(reader, &o, &datatype, ate_dot); + break; + case '\"': + case '\'': + ret = read_literal(reader, &o, &datatype, &lang, &flags, ate_dot); + break; + default: + /* Either a boolean literal, or a qname. Read the prefix first, and if + it is in fact a "true" or "false" literal, produce that instead. + */ + o = push_node(reader, SERD_CURIE, "", 0); + while (!read_PN_CHARS_BASE(reader, o)) { + } + node = deref(reader, o); + if ((node->n_bytes == 4 && !memcmp(node->buf, "true", 4)) || + (node->n_bytes == 5 && !memcmp(node->buf, "false", 5))) { + node->type = SERD_LITERAL; + datatype = push_node(reader, SERD_URI, XSD_BOOLEAN, XSD_BOOLEAN_LEN); + ret = SERD_SUCCESS; + } else if (read_PN_PREFIX_tail(reader, o) > SERD_FAILURE) { + ret = SERD_ERR_BAD_SYNTAX; + } else { + if ((ret = read_PrefixedName(reader, o, false, ate_dot))) { + ret = ret > SERD_FAILURE ? ret : SERD_ERR_BAD_SYNTAX; + pop_node(reader, o); + return r_err(reader, ret, "expected prefixed name\n"); + } + } + } + + if (!ret && simple && o) { + deref(reader, o)->flags = flags; + } + + if (!ret && emit && simple) { + ret = emit_statement(reader, *ctx, o, datatype, lang); + } else if (!ret && !emit) { + ctx->object = o; + ctx->datatype = datatype; + ctx->lang = lang; + return SERD_SUCCESS; + } + + pop_node(reader, lang); + pop_node(reader, datatype); + pop_node(reader, o); +#ifndef NDEBUG + assert(reader->stack.size == orig_stack_size); +#endif + return ret; +} + +static SerdStatus +read_objectList(SerdReader* reader, ReadContext ctx, bool* ate_dot) +{ + SerdStatus st = SERD_SUCCESS; + TRY(st, read_object(reader, &ctx, true, ate_dot)); + if (!fancy_syntax(reader) && peek_delim(reader, ',')) { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "syntax does not support abbreviation\n"); + } + + while (!*ate_dot && eat_delim(reader, ',')) { + st = read_object(reader, &ctx, true, ate_dot); + } + + return st; +} + +static SerdStatus +read_predicateObjectList(SerdReader* reader, ReadContext ctx, bool* ate_dot) +{ + SerdStatus st = SERD_SUCCESS; + while (!(st = read_verb(reader, &ctx.predicate)) && read_ws_star(reader) && + !(st = read_objectList(reader, ctx, ate_dot))) { + ctx.predicate = pop_node(reader, ctx.predicate); + if (*ate_dot) { + return SERD_SUCCESS; + } + + bool ate_semi = false; + int c = 0; + do { + read_ws_star(reader); + switch (c = peek_byte(reader)) { + case EOF: + return r_err(reader, SERD_ERR_BAD_SYNTAX, "unexpected end of file\n"); + case '.': + case ']': + case '}': + return SERD_SUCCESS; + case ';': + eat_byte_safe(reader, c); + ate_semi = true; + } + } while (c == ';'); + + if (!ate_semi) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "missing ';' or '.'\n"); + } + } + + ctx.predicate = pop_node(reader, ctx.predicate); + return st; +} + +static SerdStatus +end_collection(SerdReader* reader, + ReadContext ctx, + Ref n1, + Ref n2, + SerdStatus st) +{ + pop_node(reader, n2); + pop_node(reader, n1); + *ctx.flags &= ~(unsigned)SERD_LIST_CONT; + if (!st) { + return (eat_byte_check(reader, ')') == ')') ? SERD_SUCCESS + : SERD_ERR_BAD_SYNTAX; + } + + return st; +} + +static SerdStatus +read_collection(SerdReader* reader, ReadContext ctx, Ref* dest) +{ + SerdStatus st = SERD_SUCCESS; + eat_byte_safe(reader, '('); + + bool end = peek_delim(reader, ')'); + + *dest = end ? reader->rdf_nil : blank_id(reader); + if (ctx.subject) { + // subject predicate _:head + *ctx.flags |= (end ? 0 : SERD_LIST_O_BEGIN); + TRY(st, emit_statement(reader, ctx, *dest, 0, 0)); + *ctx.flags |= SERD_LIST_CONT; + } else { + *ctx.flags |= (end ? 0 : SERD_LIST_S_BEGIN); + } + + if (end) { + return end_collection(reader, ctx, 0, 0, st); + } + + /* The order of node allocation here is necessarily not in stack order, + so we create two nodes and recycle them throughout. */ + Ref n1 = push_node_padded(reader, genid_size(reader), SERD_BLANK, "", 0); + Ref n2 = 0; + Ref node = n1; + Ref rest = 0; + + ctx.subject = *dest; + while (!peek_delim(reader, ')')) { + // _:node rdf:first object + ctx.predicate = reader->rdf_first; + bool ate_dot = false; + if ((st = read_object(reader, &ctx, true, &ate_dot)) || ate_dot) { + return end_collection(reader, ctx, n1, n2, st); + } + + if (!(end = peek_delim(reader, ')'))) { + /* Give rest a new ID. Done as late as possible to ensure it is + used and > IDs generated by read_object above. */ + if (!rest) { + rest = n2 = blank_id(reader); // First pass, push + } else { + set_blank_id(reader, rest, genid_size(reader)); + } + } + + // _:node rdf:rest _:rest + *ctx.flags |= SERD_LIST_CONT; + ctx.predicate = reader->rdf_rest; + TRY(st, emit_statement(reader, ctx, (end ? reader->rdf_nil : rest), 0, 0)); + + ctx.subject = rest; // _:node = _:rest + rest = node; // _:rest = (old)_:node + node = ctx.subject; // invariant + } + + return end_collection(reader, ctx, n1, n2, st); +} + +static SerdStatus +read_subject(SerdReader* reader, ReadContext ctx, Ref* dest, int* s_type) +{ + SerdStatus st = SERD_SUCCESS; + bool ate_dot = false; + switch ((*s_type = peek_byte(reader))) { + case '[': + read_anon(reader, ctx, true, dest); + break; + case '(': + st = read_collection(reader, ctx, dest); + break; + case '_': + st = read_BLANK_NODE_LABEL(reader, dest, &ate_dot); + break; + default: + st = read_iri(reader, dest, &ate_dot); + } + + if (ate_dot) { + pop_node(reader, *dest); + return r_err(reader, SERD_ERR_BAD_SYNTAX, "subject ends with `.'\n"); + } + + return st; +} + +static SerdStatus +read_labelOrSubject(SerdReader* reader, Ref* dest) +{ + bool ate_dot = false; + switch (peek_byte(reader)) { + case '[': + eat_byte_safe(reader, '['); + read_ws_star(reader); + if (!eat_byte_check(reader, ']')) { + return SERD_ERR_BAD_SYNTAX; + } + *dest = blank_id(reader); + return SERD_SUCCESS; + case '_': + return read_BLANK_NODE_LABEL(reader, dest, &ate_dot); + default: + if (!read_iri(reader, dest, &ate_dot)) { + return SERD_SUCCESS; + } else { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "expected label or subject\n"); + } + } +} + +static SerdStatus +read_triples(SerdReader* reader, ReadContext ctx, bool* ate_dot) +{ + SerdStatus st = SERD_FAILURE; + if (ctx.subject) { + read_ws_star(reader); + switch (peek_byte(reader)) { + case '.': + *ate_dot = eat_byte_safe(reader, '.'); + return SERD_FAILURE; + case '}': + return SERD_FAILURE; + } + st = read_predicateObjectList(reader, ctx, ate_dot); + } + + ctx.subject = ctx.predicate = 0; + return st > SERD_FAILURE ? st : SERD_SUCCESS; +} + +static SerdStatus +read_base(SerdReader* reader, bool sparql, bool token) +{ + SerdStatus st = SERD_SUCCESS; + if (token) { + TRY(st, eat_string(reader, "base", 4)); + } + + read_ws_star(reader); + + Ref uri = 0; + TRY(st, read_IRIREF(reader, &uri)); + if (reader->base_sink) { + TRY(st, reader->base_sink(reader->handle, deref(reader, uri))); + } + pop_node(reader, uri); + + read_ws_star(reader); + if (!sparql) { + return eat_byte_check(reader, '.') ? SERD_SUCCESS : SERD_ERR_BAD_SYNTAX; + } + + if (peek_byte(reader) == '.') { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "full stop after SPARQL BASE\n"); + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_prefixID(SerdReader* reader, bool sparql, bool token) +{ + SerdStatus st = SERD_SUCCESS; + if (token) { + TRY(st, eat_string(reader, "prefix", 6)); + } + + read_ws_star(reader); + Ref name = push_node(reader, SERD_LITERAL, "", 0); + if ((st = read_PN_PREFIX(reader, name)) > SERD_FAILURE) { + return st; + } + + if (eat_byte_check(reader, ':') != ':') { + pop_node(reader, name); + return SERD_ERR_BAD_SYNTAX; + } + + read_ws_star(reader); + Ref uri = 0; + TRY(st, read_IRIREF(reader, &uri)); + + if (reader->prefix_sink) { + st = reader->prefix_sink( + reader->handle, deref(reader, name), deref(reader, uri)); + } + + pop_node(reader, uri); + pop_node(reader, name); + if (!sparql) { + read_ws_star(reader); + st = eat_byte_check(reader, '.') ? SERD_SUCCESS : SERD_ERR_BAD_SYNTAX; + } + + return st; +} + +static SerdStatus +read_directive(SerdReader* reader) +{ + const bool sparql = peek_byte(reader) != '@'; + if (!sparql) { + eat_byte_safe(reader, '@'); + switch (peek_byte(reader)) { + case 'B': + case 'P': + return r_err(reader, SERD_ERR_BAD_SYNTAX, "uppercase directive\n"); + } + } + + switch (peek_byte(reader)) { + case 'B': + case 'b': + return read_base(reader, sparql, true); + case 'P': + case 'p': + return read_prefixID(reader, sparql, true); + default: + break; + } + + return r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid directive\n"); +} + +static SerdStatus +read_wrappedGraph(SerdReader* reader, ReadContext* ctx) +{ + if (!eat_byte_check(reader, '{')) { + return SERD_ERR_BAD_SYNTAX; + } + + read_ws_star(reader); + while (peek_byte(reader) != '}') { + bool ate_dot = false; + int s_type = 0; + ctx->subject = 0; + SerdStatus st = read_subject(reader, *ctx, &ctx->subject, &s_type); + if (st) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "bad subject\n"); + } + + if (read_triples(reader, *ctx, &ate_dot) && s_type != '[') { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "missing predicate object list\n"); + } + + pop_node(reader, ctx->subject); + read_ws_star(reader); + if (peek_byte(reader) == '.') { + eat_byte_safe(reader, '.'); + } + read_ws_star(reader); + } + + eat_byte_safe(reader, '}'); + read_ws_star(reader); + if (peek_byte(reader) == '.') { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "graph followed by `.'\n"); + } + + return SERD_SUCCESS; +} + +static int +tokcmp(SerdReader* reader, Ref ref, const char* tok, size_t n) +{ + SerdNode* node = deref(reader, ref); + if (!node || node->n_bytes != n) { + return -1; + } + + return serd_strncasecmp((const char*)node->buf, tok, n); +} + +SerdStatus +read_n3_statement(SerdReader* reader) +{ + SerdStatementFlags flags = 0; + ReadContext ctx = {0, 0, 0, 0, 0, 0, &flags}; + bool ate_dot = false; + int s_type = 0; + SerdStatus st = SERD_SUCCESS; + read_ws_star(reader); + switch (peek_byte(reader)) { + case '\0': + eat_byte_safe(reader, '\0'); + return SERD_FAILURE; + case EOF: + return SERD_FAILURE; + case '@': + if (!fancy_syntax(reader)) { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "syntax does not support directives\n"); + } + TRY(st, read_directive(reader)); + read_ws_star(reader); + break; + case '{': + if (reader->syntax == SERD_TRIG) { + TRY(st, read_wrappedGraph(reader, &ctx)); + read_ws_star(reader); + } else { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "syntax does not support graphs\n"); + } + break; + default: + if ((st = read_subject(reader, ctx, &ctx.subject, &s_type)) > + SERD_FAILURE) { + return st; + } + + if (!tokcmp(reader, ctx.subject, "base", 4)) { + st = read_base(reader, true, false); + } else if (!tokcmp(reader, ctx.subject, "prefix", 6)) { + st = read_prefixID(reader, true, false); + } else if (!tokcmp(reader, ctx.subject, "graph", 5)) { + read_ws_star(reader); + TRY(st, read_labelOrSubject(reader, &ctx.graph)); + read_ws_star(reader); + TRY(st, read_wrappedGraph(reader, &ctx)); + pop_node(reader, ctx.graph); + ctx.graph = 0; + read_ws_star(reader); + } else if (read_ws_star(reader) && peek_byte(reader) == '{') { + if (s_type == '(' || (s_type == '[' && !*ctx.flags)) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid graph name\n"); + } + ctx.graph = ctx.subject; + ctx.subject = 0; + TRY(st, read_wrappedGraph(reader, &ctx)); + pop_node(reader, ctx.graph); + read_ws_star(reader); + } else if ((st = read_triples(reader, ctx, &ate_dot))) { + if (st == SERD_FAILURE && s_type == '[') { + return SERD_SUCCESS; + } + + if (ate_dot) { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "unexpected end of statement\n"); + } + + return st > SERD_FAILURE ? st : SERD_ERR_BAD_SYNTAX; + } else if (!ate_dot) { + read_ws_star(reader); + st = (eat_byte_check(reader, '.') == '.') ? SERD_SUCCESS + : SERD_ERR_BAD_SYNTAX; + } + break; + } + return st; +} + +static void +skip_until(SerdReader* reader, uint8_t byte) +{ + for (int c = 0; (c = peek_byte(reader)) && c != byte;) { + eat_byte_safe(reader, c); + } +} + +SerdStatus +read_turtleTrigDoc(SerdReader* reader) +{ + while (!reader->source.eof) { + const SerdStatus st = read_n3_statement(reader); + if (st > SERD_FAILURE) { + if (reader->strict) { + return st; + } + skip_until(reader, '\n'); + } + } + + return SERD_SUCCESS; +} + +SerdStatus +read_nquadsDoc(SerdReader* reader) +{ + SerdStatus st = SERD_SUCCESS; + while (!reader->source.eof) { + SerdStatementFlags flags = 0; + ReadContext ctx = {0, 0, 0, 0, 0, 0, &flags}; + bool ate_dot = false; + int s_type = 0; + read_ws_star(reader); + if (peek_byte(reader) == EOF) { + break; + } + + if (peek_byte(reader) == '@') { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "syntax does not support directives\n"); + } + + // subject predicate object + if ((st = read_subject(reader, ctx, &ctx.subject, &s_type)) || + !read_ws_star(reader) || (st = read_IRIREF(reader, &ctx.predicate)) || + !read_ws_star(reader) || + (st = read_object(reader, &ctx, false, &ate_dot))) { + return st; + } + + if (!ate_dot) { // graphLabel? + read_ws_star(reader); + switch (peek_byte(reader)) { + case '.': + break; + case '_': + TRY(st, read_BLANK_NODE_LABEL(reader, &ctx.graph, &ate_dot)); + break; + default: + TRY(st, read_IRIREF(reader, &ctx.graph)); + } + + // Terminating '.' + read_ws_star(reader); + if (!eat_byte_check(reader, '.')) { + return SERD_ERR_BAD_SYNTAX; + } + } + + TRY(st, emit_statement(reader, ctx, ctx.object, ctx.datatype, ctx.lang)); + + pop_node(reader, ctx.graph); + pop_node(reader, ctx.lang); + pop_node(reader, ctx.datatype); + pop_node(reader, ctx.object); + } + return SERD_SUCCESS; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,393 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#include "node.h" + +#include "base64.h" +#include "string_utils.h" + +#include "serd/serd.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +# ifndef isnan +# define isnan(x) _isnan(x) +# endif +# ifndef isinf +# define isinf(x) (!_finite(x)) +# endif +#endif + +SerdNode +serd_node_from_string(SerdType type, const uint8_t* str) +{ + if (!str) { + return SERD_NODE_NULL; + } + + SerdNodeFlags flags = 0; + size_t buf_n_bytes = 0; + const size_t buf_n_chars = serd_strlen(str, &buf_n_bytes, &flags); + SerdNode ret = {str, buf_n_bytes, buf_n_chars, flags, type}; + return ret; +} + +SerdNode +serd_node_from_substring(SerdType type, const uint8_t* str, const size_t len) +{ + if (!str) { + return SERD_NODE_NULL; + } + + SerdNodeFlags flags = 0; + size_t buf_n_bytes = 0; + const size_t buf_n_chars = serd_substrlen(str, len, &buf_n_bytes, &flags); + assert(buf_n_bytes <= len); + SerdNode ret = {str, buf_n_bytes, buf_n_chars, flags, type}; + return ret; +} + +SerdNode +serd_node_copy(const SerdNode* node) +{ + if (!node || !node->buf) { + return SERD_NODE_NULL; + } + + SerdNode copy = *node; + uint8_t* buf = (uint8_t*)malloc(copy.n_bytes + 1); + memcpy(buf, node->buf, copy.n_bytes + 1); + copy.buf = buf; + return copy; +} + +bool +serd_node_equals(const SerdNode* a, const SerdNode* b) +{ + return (a == b) || + (a->type == b->type && a->n_bytes == b->n_bytes && + a->n_chars == b->n_chars && + ((a->buf == b->buf) || + !memcmp((const char*)a->buf, (const char*)b->buf, a->n_bytes + 1))); +} + +static size_t +serd_uri_string_length(const SerdURI* uri) +{ + size_t len = uri->path_base.len; + +#define ADD_LEN(field, n_delims) \ + if ((field).len) { \ + len += (field).len + (n_delims); \ + } + + ADD_LEN(uri->path, 1) // + possible leading `/' + ADD_LEN(uri->scheme, 1) // + trailing `:' + ADD_LEN(uri->authority, 2) // + leading `//' + ADD_LEN(uri->query, 1) // + leading `?' + ADD_LEN(uri->fragment, 1) // + leading `#' + + return len + 2; // + 2 for authority `//' +} + +static size_t +string_sink(const void* buf, size_t len, void* stream) +{ + uint8_t** ptr = (uint8_t**)stream; + memcpy(*ptr, buf, len); + *ptr += len; + return len; +} + +SerdNode +serd_node_new_uri_from_node(const SerdNode* uri_node, + const SerdURI* base, + SerdURI* out) +{ + return (uri_node->type == SERD_URI && uri_node->buf) + ? serd_node_new_uri_from_string(uri_node->buf, base, out) + : SERD_NODE_NULL; +} + +SerdNode +serd_node_new_uri_from_string(const uint8_t* str, + const SerdURI* base, + SerdURI* out) +{ + if (!str || str[0] == '\0') { + // Empty URI => Base URI, or nothing if no base is given + return base ? serd_node_new_uri(base, NULL, out) : SERD_NODE_NULL; + } + + SerdURI uri; + serd_uri_parse(str, &uri); + return serd_node_new_uri(&uri, base, out); // Resolve/Serialise +} + +static inline bool +is_uri_path_char(const uint8_t c) +{ + if (is_alpha(c) || is_digit(c)) { + return true; + } + + switch (c) { + // unreserved: + case '-': + case '.': + case '_': + case '~': + // pchar: + case ':': + case '@': + // separator: + case '/': + // sub-delimeters: + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case ';': + case '=': + return true; + default: + return false; + } +} + +SerdNode +serd_node_new_file_uri(const uint8_t* path, + const uint8_t* hostname, + SerdURI* out, + bool escape) +{ + const size_t path_len = strlen((const char*)path); + const size_t hostname_len = hostname ? strlen((const char*)hostname) : 0; + const bool is_windows = is_windows_path(path); + size_t uri_len = 0; + uint8_t* uri = NULL; + + if (path[0] == '/' || is_windows) { + uri_len = strlen("file://") + hostname_len + is_windows; + uri = (uint8_t*)calloc(uri_len + 1, 1); + + memcpy(uri, "file://", 7); + + if (hostname) { + memcpy(uri + 7, hostname, hostname_len); + } + + if (is_windows) { + ((char*)uri)[7 + hostname_len] = '/'; + } + } + + SerdChunk chunk = {uri, uri_len}; + for (size_t i = 0; i < path_len; ++i) { + if (is_windows && path[i] == '\\') { + serd_chunk_sink("/", 1, &chunk); + } else if (path[i] == '%') { + serd_chunk_sink("%%", 2, &chunk); + } else if (!escape || is_uri_path_char(path[i])) { + serd_chunk_sink(path + i, 1, &chunk); + } else { + char escape_str[4] = {'%', 0, 0, 0}; + snprintf(escape_str + 1, sizeof(escape_str) - 1, "%X", (unsigned)path[i]); + serd_chunk_sink(escape_str, 3, &chunk); + } + } + + serd_chunk_sink_finish(&chunk); + + if (out) { + serd_uri_parse(chunk.buf, out); + } + + return serd_node_from_substring(SERD_URI, chunk.buf, chunk.len); +} + +SerdNode +serd_node_new_uri(const SerdURI* uri, const SerdURI* base, SerdURI* out) +{ + SerdURI abs_uri = *uri; + if (base) { + serd_uri_resolve(uri, base, &abs_uri); + } + + const size_t len = serd_uri_string_length(&abs_uri); + uint8_t* buf = (uint8_t*)malloc(len + 1); + SerdNode node = {buf, 0, 0, 0, SERD_URI}; + uint8_t* ptr = buf; + const size_t actual_len = serd_uri_serialise(&abs_uri, string_sink, &ptr); + + buf[actual_len] = '\0'; + node.n_bytes = actual_len; + node.n_chars = serd_strlen(buf, NULL, NULL); + + if (out) { + serd_uri_parse(buf, out); // TODO: cleverly avoid double parse + } + + return node; +} + +SerdNode +serd_node_new_relative_uri(const SerdURI* uri, + const SerdURI* base, + const SerdURI* root, + SerdURI* out) +{ + const size_t uri_len = serd_uri_string_length(uri); + const size_t base_len = serd_uri_string_length(base); + uint8_t* buf = (uint8_t*)malloc(uri_len + base_len + 1); + SerdNode node = {buf, 0, 0, 0, SERD_URI}; + uint8_t* ptr = buf; + const size_t actual_len = + serd_uri_serialise_relative(uri, base, root, string_sink, &ptr); + + buf[actual_len] = '\0'; + node.n_bytes = actual_len; + node.n_chars = serd_strlen(buf, NULL, NULL); + + if (out) { + serd_uri_parse(buf, out); // TODO: cleverly avoid double parse + } + + return node; +} + +static inline unsigned +serd_digits(double abs) +{ + const double lg = ceil(log10(floor(abs) + 1.0)); + return lg < 1.0 ? 1U : (unsigned)lg; +} + +SerdNode +serd_node_new_decimal(double d, unsigned frac_digits) +{ + if (isnan(d) || isinf(d)) { + return SERD_NODE_NULL; + } + + const double abs_d = fabs(d); + const unsigned int_digits = serd_digits(abs_d); + char* buf = (char*)calloc(int_digits + frac_digits + 3, 1); + SerdNode node = {(const uint8_t*)buf, 0, 0, 0, SERD_LITERAL}; + const double int_part = floor(abs_d); + + // Point s to decimal point location + char* s = buf + int_digits; + if (d < 0.0) { + *buf = '-'; + ++s; + } + + // Write integer part (right to left) + char* t = s - 1; + uint64_t dec = (uint64_t)int_part; + do { + *t-- = (char)('0' + dec % 10); + } while ((dec /= 10) > 0); + + *s++ = '.'; + + // Write fractional part (right to left) + double frac_part = fabs(d - int_part); + if (frac_part < DBL_EPSILON) { + *s++ = '0'; + node.n_bytes = node.n_chars = (size_t)(s - buf); + } else { + uint64_t frac = (uint64_t)llround(frac_part * pow(10.0, (int)frac_digits)); + s += frac_digits - 1; + unsigned i = 0; + + // Skip trailing zeros + for (; i < frac_digits - 1 && !(frac % 10); ++i, --s, frac /= 10) { + } + + node.n_bytes = node.n_chars = (size_t)(s - buf) + 1u; + + // Write digits from last trailing zero to decimal point + for (; i < frac_digits; ++i) { + *s-- = (char)('0' + (frac % 10)); + frac /= 10; + } + } + + return node; +} + +SerdNode +serd_node_new_integer(int64_t i) +{ + uint64_t abs_i = (i < 0) ? -i : i; + const unsigned digits = serd_digits((double)abs_i); + char* buf = (char*)calloc(digits + 2, 1); + SerdNode node = {(const uint8_t*)buf, 0, 0, 0, SERD_LITERAL}; + + // Point s to the end + char* s = buf + digits - 1; + if (i < 0) { + *buf = '-'; + ++s; + } + + node.n_bytes = node.n_chars = (size_t)(s - buf) + 1u; + + // Write integer part (right to left) + do { + *s-- = (char)('0' + (abs_i % 10)); + } while ((abs_i /= 10) > 0); + + return node; +} + +SerdNode +serd_node_new_blob(const void* buf, size_t size, bool wrap_lines) +{ + const size_t len = serd_base64_get_length(size, wrap_lines); + uint8_t* str = (uint8_t*)calloc(len + 2, 1); + SerdNode node = {str, len, len, 0, SERD_LITERAL}; + + if (serd_base64_encode(str, buf, size, wrap_lines)) { + node.flags |= SERD_HAS_NEWLINE; + } + + return node; +} + +void +serd_node_free(SerdNode* node) +{ + if (node && node->buf) { + free((uint8_t*)node->buf); + node->buf = NULL; + } +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,48 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef SERD_NODE_H +#define SERD_NODE_H + +#include "serd/serd.h" + +#include + +struct SerdNodeImpl { + size_t n_bytes; /**< Size in bytes (not including null) */ + SerdNodeFlags flags; /**< Node flags (e.g. string properties) */ + SerdType type; /**< Node type */ +}; + +static inline char* +serd_node_buffer(SerdNode* node) +{ + return (char*)(node + 1); +} + +static inline const char* +serd_node_buffer_c(const SerdNode* node) +{ + return (const char*)(node + 1); +} + +SerdNode* +serd_node_malloc(size_t n_bytes, SerdNodeFlags flags, SerdType type); + +void +serd_node_set(SerdNode** dst, const SerdNode* src); + +#endif // SERD_NODE_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,425 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#include "byte_source.h" +#include "reader.h" +#include "stack.h" +#include "system.h" + +#include "serd_internal.h" + +#include +#include +#include +#include +#include +#include + +SerdStatus +r_err(SerdReader* reader, SerdStatus st, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const Cursor* const cur = &reader->source.cur; + const SerdError e = {st, cur->filename, cur->line, cur->col, fmt, &args}; + serd_error(reader->error_sink, reader->error_handle, &e); + va_end(args); + return st; +} + +void +set_blank_id(SerdReader* reader, Ref ref, size_t buf_size) +{ + SerdNode* node = deref(reader, ref); + const char* prefix = reader->bprefix ? (const char*)reader->bprefix : ""; + node->n_bytes = node->n_chars = (size_t)snprintf( + (char*)node->buf, buf_size, "%sb%u", prefix, reader->next_id++); +} + +size_t +genid_size(SerdReader* reader) +{ + return reader->bprefix_len + 1 + 10 + 1; // + "b" + UINT32_MAX + \0 +} + +Ref +blank_id(SerdReader* reader) +{ + Ref ref = push_node_padded(reader, genid_size(reader), SERD_BLANK, "", 0); + set_blank_id(reader, ref, genid_size(reader)); + return ref; +} + +/** fread-like wrapper for getc (which is faster). */ +static size_t +serd_file_read_byte(void* buf, size_t size, size_t nmemb, void* stream) +{ + (void)size; + (void)nmemb; + + const int c = getc((FILE*)stream); + if (c == EOF) { + *((uint8_t*)buf) = 0; + return 0; + } + *((uint8_t*)buf) = (uint8_t)c; + return 1; +} + +Ref +push_node_padded(SerdReader* reader, + size_t maxlen, + SerdType type, + const char* str, + size_t n_bytes) +{ + void* mem = serd_stack_push_aligned( + &reader->stack, sizeof(SerdNode) + maxlen + 1, sizeof(SerdNode)); + + SerdNode* const node = (SerdNode*)mem; + node->n_bytes = node->n_chars = n_bytes; + node->flags = 0; + node->type = type; + node->buf = NULL; + + uint8_t* buf = (uint8_t*)(node + 1); + memcpy(buf, str, n_bytes + 1); + +#ifdef SERD_STACK_CHECK + reader->allocs = (Ref*)realloc(reader->allocs, + sizeof(reader->allocs) * (++reader->n_allocs)); + reader->allocs[reader->n_allocs - 1] = ((uint8_t*)mem - reader->stack.buf); +#endif + return (Ref)((uint8_t*)node - reader->stack.buf); +} + +Ref +push_node(SerdReader* reader, SerdType type, const char* str, size_t n_bytes) +{ + return push_node_padded(reader, n_bytes, type, str, n_bytes); +} + +SerdNode* +deref(SerdReader* reader, const Ref ref) +{ + if (ref) { + SerdNode* node = (SerdNode*)(reader->stack.buf + ref); + node->buf = (uint8_t*)node + sizeof(SerdNode); + return node; + } + return NULL; +} + +Ref +pop_node(SerdReader* reader, Ref ref) +{ + if (ref && ref != reader->rdf_first && ref != reader->rdf_rest && + ref != reader->rdf_nil) { +#ifdef SERD_STACK_CHECK + SERD_STACK_ASSERT_TOP(reader, ref); + --reader->n_allocs; +#endif + SerdNode* const node = deref(reader, ref); + uint8_t* const top = reader->stack.buf + reader->stack.size; + serd_stack_pop_aligned(&reader->stack, (size_t)(top - (uint8_t*)node)); + } + return 0; +} + +SerdStatus +emit_statement(SerdReader* reader, ReadContext ctx, Ref o, Ref d, Ref l) +{ + SerdNode* graph = deref(reader, ctx.graph); + if (!graph && reader->default_graph.buf) { + graph = &reader->default_graph; + } + + const SerdStatus st = !reader->statement_sink + ? SERD_SUCCESS + : reader->statement_sink(reader->handle, + *ctx.flags, + graph, + deref(reader, ctx.subject), + deref(reader, ctx.predicate), + deref(reader, o), + deref(reader, d), + deref(reader, l)); + + *ctx.flags &= SERD_ANON_CONT | SERD_LIST_CONT; // Preserve only cont flags + return st; +} + +static SerdStatus +read_statement(SerdReader* reader) +{ + return read_n3_statement(reader); +} + +static SerdStatus +read_doc(SerdReader* reader) +{ + return ((reader->syntax == SERD_NQUADS) ? read_nquadsDoc(reader) + : read_turtleTrigDoc(reader)); +} + +SerdReader* +serd_reader_new(SerdSyntax syntax, + void* handle, + void (*free_handle)(void*), + SerdBaseSink base_sink, + SerdPrefixSink prefix_sink, + SerdStatementSink statement_sink, + SerdEndSink end_sink) +{ + SerdReader* me = (SerdReader*)calloc(1, sizeof(SerdReader)); + me->handle = handle; + me->free_handle = free_handle; + me->base_sink = base_sink; + me->prefix_sink = prefix_sink; + me->statement_sink = statement_sink; + me->end_sink = end_sink; + me->default_graph = SERD_NODE_NULL; + me->stack = serd_stack_new(SERD_PAGE_SIZE); + me->syntax = syntax; + me->next_id = 1; + me->strict = true; + + me->rdf_first = push_node(me, SERD_URI, NS_RDF "first", 48); + me->rdf_rest = push_node(me, SERD_URI, NS_RDF "rest", 47); + me->rdf_nil = push_node(me, SERD_URI, NS_RDF "nil", 46); + + return me; +} + +void +serd_reader_set_strict(SerdReader* reader, bool strict) +{ + reader->strict = strict; +} + +void +serd_reader_set_error_sink(SerdReader* reader, + SerdErrorSink error_sink, + void* error_handle) +{ + reader->error_sink = error_sink; + reader->error_handle = error_handle; +} + +void +serd_reader_free(SerdReader* reader) +{ + if (!reader) { + return; + } + + pop_node(reader, reader->rdf_nil); + pop_node(reader, reader->rdf_rest); + pop_node(reader, reader->rdf_first); + serd_node_free(&reader->default_graph); + +#ifdef SERD_STACK_CHECK + free(reader->allocs); +#endif + free(reader->stack.buf); + free(reader->bprefix); + if (reader->free_handle) { + reader->free_handle(reader->handle); + } + free(reader); +} + +void* +serd_reader_get_handle(const SerdReader* reader) +{ + return reader->handle; +} + +void +serd_reader_add_blank_prefix(SerdReader* reader, const uint8_t* prefix) +{ + free(reader->bprefix); + reader->bprefix_len = 0; + reader->bprefix = NULL; + + const size_t prefix_len = prefix ? strlen((const char*)prefix) : 0; + if (prefix_len) { + reader->bprefix_len = prefix_len; + reader->bprefix = (uint8_t*)malloc(reader->bprefix_len + 1); + memcpy(reader->bprefix, prefix, reader->bprefix_len + 1); + } +} + +void +serd_reader_set_default_graph(SerdReader* reader, const SerdNode* graph) +{ + serd_node_free(&reader->default_graph); + reader->default_graph = serd_node_copy(graph); +} + +SerdStatus +serd_reader_read_file(SerdReader* reader, const uint8_t* uri) +{ + uint8_t* const path = serd_file_uri_parse(uri, NULL); + if (!path) { + return SERD_ERR_BAD_ARG; + } + + FILE* fd = serd_fopen((const char*)path, "rb"); + if (!fd) { + serd_free(path); + return SERD_ERR_UNKNOWN; + } + + SerdStatus ret = serd_reader_read_file_handle(reader, fd, path); + fclose(fd); + free(path); + return ret; +} + +static SerdStatus +skip_bom(SerdReader* me) +{ + if (serd_byte_source_peek(&me->source) == 0xEF) { + serd_byte_source_advance(&me->source); + if (serd_byte_source_peek(&me->source) != 0xBB || + serd_byte_source_advance(&me->source) || + serd_byte_source_peek(&me->source) != 0xBF || + serd_byte_source_advance(&me->source)) { + r_err(me, SERD_ERR_BAD_SYNTAX, "corrupt byte order mark\n"); + return SERD_ERR_BAD_SYNTAX; + } + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_reader_start_stream(SerdReader* reader, + FILE* file, + const uint8_t* name, + bool bulk) +{ + return serd_reader_start_source_stream(reader, + bulk ? (SerdSource)fread + : serd_file_read_byte, + (SerdStreamErrorFunc)ferror, + file, + name, + bulk ? SERD_PAGE_SIZE : 1); +} + +SerdStatus +serd_reader_start_source_stream(SerdReader* reader, + SerdSource read_func, + SerdStreamErrorFunc error_func, + void* stream, + const uint8_t* name, + size_t page_size) +{ + return serd_byte_source_open_source( + &reader->source, read_func, error_func, stream, name, page_size); +} + +static SerdStatus +serd_reader_prepare(SerdReader* reader) +{ + SerdStatus st = serd_byte_source_prepare(&reader->source); + if (st == SERD_SUCCESS) { + st = skip_bom(reader); + } else if (st == SERD_FAILURE) { + reader->source.eof = true; + } else { + r_err(reader, st, "read error: %s\n", strerror(errno)); + } + return st; +} + +SerdStatus +serd_reader_read_chunk(SerdReader* reader) +{ + SerdStatus st = SERD_SUCCESS; + if (!reader->source.prepared) { + st = serd_reader_prepare(reader); + } else if (reader->source.eof) { + st = serd_byte_source_advance(&reader->source); + } + + if (peek_byte(reader) == 0) { + // Skip leading null byte, for reading from a null-delimited socket + eat_byte_safe(reader, 0); + } + + return st ? st : read_statement(reader); +} + +SerdStatus +serd_reader_end_stream(SerdReader* reader) +{ + return serd_byte_source_close(&reader->source); +} + +SerdStatus +serd_reader_read_file_handle(SerdReader* reader, + FILE* file, + const uint8_t* name) +{ + return serd_reader_read_source(reader, + (SerdSource)fread, + (SerdStreamErrorFunc)ferror, + file, + name, + SERD_PAGE_SIZE); +} + +SerdStatus +serd_reader_read_source(SerdReader* reader, + SerdSource source, + SerdStreamErrorFunc error, + void* stream, + const uint8_t* name, + size_t page_size) +{ + SerdStatus st = serd_reader_start_source_stream( + reader, source, error, stream, name, page_size); + + if (st || (st = serd_reader_prepare(reader))) { + serd_reader_end_stream(reader); + return st; + } + + if ((st = read_doc(reader))) { + serd_reader_end_stream(reader); + return st; + } + + return serd_reader_end_stream(reader); +} + +SerdStatus +serd_reader_read_string(SerdReader* reader, const uint8_t* utf8) +{ + serd_byte_source_open_string(&reader->source, utf8); + + SerdStatus st = serd_reader_prepare(reader); + if (!st) { + st = read_doc(reader); + } + + serd_byte_source_close(&reader->source); + + return st; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,196 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef SERD_READER_H +#define SERD_READER_H + +#include "byte_source.h" +#include "stack.h" + +#include "serd/serd.h" + +#include +#include +#include +#include + +#if defined(__GNUC__) +# define SERD_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define SERD_LOG_FUNC(fmt, arg1) +#endif + +#ifdef SERD_STACK_CHECK +# define SERD_STACK_ASSERT_TOP(reader, ref) \ + assert(ref == reader->allocs[reader->n_allocs - 1]); +#else +# define SERD_STACK_ASSERT_TOP(reader, ref) +#endif + +/* Reference to a node in the stack (we can not use pointers since the + stack may be reallocated, invalidating any pointers to elements). +*/ +typedef size_t Ref; + +typedef struct { + Ref graph; + Ref subject; + Ref predicate; + Ref object; + Ref datatype; + Ref lang; + SerdStatementFlags* flags; +} ReadContext; + +struct SerdReaderImpl { + void* handle; + void (*free_handle)(void* ptr); + SerdBaseSink base_sink; + SerdPrefixSink prefix_sink; + SerdStatementSink statement_sink; + SerdEndSink end_sink; + SerdErrorSink error_sink; + void* error_handle; + Ref rdf_first; + Ref rdf_rest; + Ref rdf_nil; + SerdNode default_graph; + SerdByteSource source; + SerdStack stack; + SerdSyntax syntax; + unsigned next_id; + uint8_t* buf; + uint8_t* bprefix; + size_t bprefix_len; + bool strict; ///< True iff strict parsing + bool seen_genid; +#ifdef SERD_STACK_CHECK + Ref* allocs; ///< Stack of push offsets + size_t n_allocs; ///< Number of stack pushes +#endif +}; + +SERD_LOG_FUNC(3, 4) +SerdStatus +r_err(SerdReader* reader, SerdStatus st, const char* fmt, ...); + +Ref +push_node_padded(SerdReader* reader, + size_t maxlen, + SerdType type, + const char* str, + size_t n_bytes); + +Ref +push_node(SerdReader* reader, SerdType type, const char* str, size_t n_bytes); + +SERD_PURE_FUNC size_t +genid_size(SerdReader* reader); + +Ref +blank_id(SerdReader* reader); + +void +set_blank_id(SerdReader* reader, Ref ref, size_t buf_size); + +SerdNode* +deref(SerdReader* reader, Ref ref); + +Ref +pop_node(SerdReader* reader, Ref ref); + +SerdStatus +emit_statement(SerdReader* reader, ReadContext ctx, Ref o, Ref d, Ref l); + +SerdStatus +read_n3_statement(SerdReader* reader); + +SerdStatus +read_nquadsDoc(SerdReader* reader); + +SerdStatus +read_turtleTrigDoc(SerdReader* reader); + +static inline int +peek_byte(SerdReader* reader) +{ + SerdByteSource* source = &reader->source; + + return source->eof ? EOF : (int)source->read_buf[source->read_head]; +} + +static inline int +eat_byte_safe(SerdReader* reader, const int byte) +{ + (void)byte; + + const int c = peek_byte(reader); + assert(c == byte); + + serd_byte_source_advance(&reader->source); + return c; +} + +static inline int +eat_byte_check(SerdReader* reader, const int byte) +{ + const int c = peek_byte(reader); + if (c != byte) { + r_err(reader, SERD_ERR_BAD_SYNTAX, "expected `%c', not `%c'\n", byte, c); + return 0; + } + return eat_byte_safe(reader, byte); +} + +static inline SerdStatus +eat_string(SerdReader* reader, const char* str, unsigned n) +{ + for (unsigned i = 0; i < n; ++i) { + if (!eat_byte_check(reader, ((const uint8_t*)str)[i])) { + return SERD_ERR_BAD_SYNTAX; + } + } + return SERD_SUCCESS; +} + +static inline SerdStatus +push_byte(SerdReader* reader, Ref ref, const int c) +{ + assert(c != EOF); + SERD_STACK_ASSERT_TOP(reader, ref); + + uint8_t* const s = (uint8_t*)serd_stack_push(&reader->stack, 1); + SerdNode* const node = (SerdNode*)(reader->stack.buf + ref); + + ++node->n_bytes; + if (!(c & 0x80)) { // Starts with 0 bit, start of new character + ++node->n_chars; + } + + *(s - 1) = (uint8_t)c; + *s = '\0'; + return SERD_SUCCESS; +} + +static inline void +push_bytes(SerdReader* reader, Ref ref, const uint8_t* bytes, unsigned len) +{ + for (unsigned i = 0; i < len; ++i) { + push_byte(reader, ref, bytes[i]); + } +} + +#endif // SERD_READER_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,98 @@ +/* + Copyright 2021 David Robillard + + 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. +*/ + +/* + Configuration header that defines reasonable defaults at compile time. + + This allows compile-time configuration from the command line (typically via + the build system) while still allowing the source to be built without any + configuration. The build system can define SERD_NO_DEFAULT_CONFIG to disable + defaults, in which case it must define things like HAVE_FEATURE to enable + features. The design here ensures that compiler warnings or + include-what-you-use will catch any mistakes. +*/ + +#ifndef SERD_CONFIG_H +#define SERD_CONFIG_H + +// Define version unconditionally so a warning will catch a mismatch +#define SERD_VERSION "0.30.10" + +#if !defined(SERD_NO_DEFAULT_CONFIG) + +// We need unistd.h to check _POSIX_VERSION +# ifndef SERD_NO_POSIX +# ifdef __has_include +# if __has_include() +# include +# endif +# elif defined(__unix__) +# include +# endif +# endif + +// POSIX.1-2001: fileno() +# ifndef HAVE_FILENO +# if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L +# define HAVE_FILENO +# endif +# endif + +// POSIX.1-2001: posix_fadvise() +# ifndef HAVE_POSIX_FADVISE +# ifndef __APPLE__ +# if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L +# define HAVE_POSIX_FADVISE +# endif +# endif +# endif + +// POSIX.1-2001: posix_memalign() +# ifndef HAVE_POSIX_MEMALIGN +# if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L +# define HAVE_POSIX_MEMALIGN +# endif +# endif + +#endif // !defined(SERD_NO_DEFAULT_CONFIG) + +/* + Make corresponding USE_FEATURE defines based on the HAVE_FEATURE defines from + above or the command line. The code checks for these using #if (not #ifdef), + so there will be an undefined warning if it checks for an unknown feature, + and this header is always required by any code that checks for features, even + if the build system defines them all. +*/ + +#ifdef HAVE_FILENO +# define USE_FILENO 1 +#else +# define USE_FILENO 0 +#endif + +#ifdef HAVE_POSIX_FADVISE +# define USE_POSIX_FADVISE 1 +#else +# define USE_POSIX_FADVISE 0 +#endif + +#ifdef HAVE_POSIX_MEMALIGN +# define USE_POSIX_MEMALIGN 1 +#else +# define USE_POSIX_MEMALIGN 0 +#endif + +#endif // SERD_CONFIG_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,377 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#define _POSIX_C_SOURCE 200809L /* for fileno and posix_fadvise */ + +#include "serd_config.h" +#include "string_utils.h" + +#include "serd/serd.h" + +#ifdef _WIN32 +# ifdef _MSC_VER +# define WIN32_LEAN_AND_MEAN 1 +# endif +# include +# include +#endif + +#if USE_POSIX_FADVISE && USE_FILENO +# include +#endif + +#include +#include +#include +#include +#include +#include + +#define SERDI_ERROR(msg) fprintf(stderr, "serdi: " msg) +#define SERDI_ERRORF(fmt, ...) fprintf(stderr, "serdi: " fmt, __VA_ARGS__) + +typedef struct { + SerdSyntax syntax; + const char* name; + const char* extension; +} Syntax; + +static const Syntax syntaxes[] = {{SERD_TURTLE, "turtle", ".ttl"}, + {SERD_NTRIPLES, "ntriples", ".nt"}, + {SERD_NQUADS, "nquads", ".nq"}, + {SERD_TRIG, "trig", ".trig"}, + {(SerdSyntax)0, NULL, NULL}}; + +static SerdSyntax +get_syntax(const char* name) +{ + for (const Syntax* s = syntaxes; s->name; ++s) { + if (!serd_strncasecmp(s->name, name, strlen(name))) { + return s->syntax; + } + } + + SERDI_ERRORF("unknown syntax `%s'\n", name); + return (SerdSyntax)0; +} + +static SERD_PURE_FUNC SerdSyntax +guess_syntax(const char* filename) +{ + const char* ext = strrchr(filename, '.'); + if (ext) { + for (const Syntax* s = syntaxes; s->name; ++s) { + if (!serd_strncasecmp(s->extension, ext, strlen(ext))) { + return s->syntax; + } + } + } + + return (SerdSyntax)0; +} + +static int +print_version(void) +{ + printf("serdi " SERD_VERSION " \n"); + printf("Copyright 2011-2021 David Robillard .\n" + "License: \n" + "This is free software; you are free to change and redistribute it." + "\nThere is NO WARRANTY, to the extent permitted by law.\n"); + return 0; +} + +static int +print_usage(const char* name, bool error) +{ + FILE* const os = error ? stderr : stdout; + fprintf(os, "%s", error ? "\n" : ""); + fprintf(os, "Usage: %s [OPTION]... INPUT [BASE_URI]\n", name); + fprintf(os, "Read and write RDF syntax.\n"); + fprintf(os, "Use - for INPUT to read from standard input.\n\n"); + fprintf(os, " -a Write ASCII output if possible.\n"); + fprintf(os, " -b Fast bulk output for large serialisations.\n"); + fprintf(os, " -c PREFIX Chop PREFIX from matching blank node IDs.\n"); + fprintf(os, " -e Eat input one character at a time.\n"); + fprintf(os, " -f Keep full URIs in input (don't qualify).\n"); + fprintf(os, " -h Display this help and exit.\n"); + fprintf(os, " -i SYNTAX Input syntax: turtle/ntriples/trig/nquads.\n"); + fprintf(os, " -l Lax (non-strict) parsing.\n"); + fprintf(os, " -o SYNTAX Output syntax: turtle/ntriples/nquads.\n"); + fprintf(os, " -p PREFIX Add PREFIX to blank node IDs.\n"); + fprintf(os, " -q Suppress all output except data.\n"); + fprintf(os, " -r ROOT_URI Keep relative URIs within ROOT_URI.\n"); + fprintf(os, " -s INPUT Parse INPUT as string (terminates options).\n"); + fprintf(os, " -v Display version information and exit.\n"); + return error ? 1 : 0; +} + +static int +missing_arg(const char* name, char opt) +{ + SERDI_ERRORF("option requires an argument -- '%c'\n", opt); + return print_usage(name, true); +} + +static SerdStatus +quiet_error_sink(void* handle, const SerdError* e) +{ + (void)handle; + (void)e; + return SERD_SUCCESS; +} + +static inline FILE* +serd_fopen(const char* path, const char* mode) +{ + FILE* fd = fopen(path, mode); + if (!fd) { + SERDI_ERRORF("failed to open file %s (%s)\n", path, strerror(errno)); + return NULL; + } + +#if USE_POSIX_FADVISE && USE_FILENO + posix_fadvise(fileno(fd), 0, 0, POSIX_FADV_SEQUENTIAL | POSIX_FADV_NOREUSE); +#endif + + return fd; +} + +static SerdStyle +choose_style(const SerdSyntax input_syntax, + const SerdSyntax output_syntax, + const bool ascii, + const bool bulk_write, + const bool full_uris) +{ + unsigned output_style = 0u; + if (output_syntax == SERD_NTRIPLES || ascii) { + output_style |= SERD_STYLE_ASCII; + } else if (output_syntax == SERD_TURTLE) { + output_style |= SERD_STYLE_ABBREVIATED; + if (!full_uris) { + output_style |= SERD_STYLE_CURIED; + } + } + + if ((input_syntax == SERD_TURTLE || input_syntax == SERD_TRIG) || + (output_style & SERD_STYLE_CURIED)) { + // Base URI may change and/or we're abbreviating URIs, so must resolve + output_style |= SERD_STYLE_RESOLVED; + } + + if (bulk_write) { + output_style |= SERD_STYLE_BULK; + } + + return (SerdStyle)output_style; +} + +int +main(int argc, char** argv) +{ + if (argc < 2) { + return print_usage(argv[0], true); + } + + FILE* in_fd = NULL; + SerdSyntax input_syntax = (SerdSyntax)0; + SerdSyntax output_syntax = (SerdSyntax)0; + bool from_file = true; + bool ascii = false; + bool bulk_read = true; + bool bulk_write = false; + bool full_uris = false; + bool lax = false; + bool quiet = false; + const uint8_t* in_name = NULL; + const uint8_t* add_prefix = NULL; + const uint8_t* chop_prefix = NULL; + const uint8_t* root_uri = NULL; + int a = 1; + for (; a < argc && argv[a][0] == '-'; ++a) { + if (argv[a][1] == '\0') { + in_name = (const uint8_t*)"(stdin)"; + in_fd = stdin; + break; + } + + if (argv[a][1] == 'a') { + ascii = true; + } else if (argv[a][1] == 'b') { + bulk_write = true; + } else if (argv[a][1] == 'e') { + bulk_read = false; + } else if (argv[a][1] == 'f') { + full_uris = true; + } else if (argv[a][1] == 'h') { + return print_usage(argv[0], false); + } else if (argv[a][1] == 'l') { + lax = true; + } else if (argv[a][1] == 'q') { + quiet = true; + } else if (argv[a][1] == 'v') { + return print_version(); + } else if (argv[a][1] == 's') { + in_name = (const uint8_t*)"(string)"; + from_file = false; + ++a; + break; + } else if (argv[a][1] == 'i') { + if (++a == argc) { + return missing_arg(argv[0], 'i'); + } + + if (!(input_syntax = get_syntax(argv[a]))) { + return print_usage(argv[0], true); + } + } else if (argv[a][1] == 'o') { + if (++a == argc) { + return missing_arg(argv[0], 'o'); + } + + if (!(output_syntax = get_syntax(argv[a]))) { + return print_usage(argv[0], true); + } + } else if (argv[a][1] == 'p') { + if (++a == argc) { + return missing_arg(argv[0], 'p'); + } + + add_prefix = (const uint8_t*)argv[a]; + } else if (argv[a][1] == 'c') { + if (++a == argc) { + return missing_arg(argv[0], 'c'); + } + + chop_prefix = (const uint8_t*)argv[a]; + } else if (argv[a][1] == 'r') { + if (++a == argc) { + return missing_arg(argv[0], 'r'); + } + + root_uri = (const uint8_t*)argv[a]; + } else { + SERDI_ERRORF("invalid option -- '%s'\n", argv[a] + 1); + return print_usage(argv[0], true); + } + } + + if (a == argc) { + SERDI_ERROR("missing input\n"); + return 1; + } + +#ifdef _WIN32 + _setmode(_fileno(stdin), _O_BINARY); + _setmode(_fileno(stdout), _O_BINARY); +#endif + + uint8_t* input_path = NULL; + const uint8_t* input = (const uint8_t*)argv[a++]; + if (from_file) { + in_name = in_name ? in_name : input; + if (!in_fd) { + if (!strncmp((const char*)input, "file:", 5)) { + input_path = serd_file_uri_parse(input, NULL); + input = input_path; + } + if (!input || !(in_fd = serd_fopen((const char*)input, "rb"))) { + return 1; + } + } + } + + if (!input_syntax && !(input_syntax = guess_syntax((const char*)in_name))) { + input_syntax = SERD_TRIG; + } + + if (!output_syntax) { + output_syntax = + ((input_syntax == SERD_TURTLE || input_syntax == SERD_NTRIPLES) + ? SERD_NTRIPLES + : SERD_NQUADS); + } + + const SerdStyle output_style = + choose_style(input_syntax, output_syntax, ascii, bulk_write, full_uris); + + SerdURI base_uri = SERD_URI_NULL; + SerdNode base = SERD_NODE_NULL; + if (a < argc) { // Base URI given on command line + base = + serd_node_new_uri_from_string((const uint8_t*)argv[a], NULL, &base_uri); + } else if (from_file && in_fd != stdin) { // Use input file URI + base = serd_node_new_file_uri(input, NULL, &base_uri, true); + } + + FILE* const out_fd = stdout; + SerdEnv* const env = serd_env_new(&base); + + SerdWriter* const writer = serd_writer_new( + output_syntax, output_style, env, &base_uri, serd_file_sink, out_fd); + + SerdReader* const reader = + serd_reader_new(input_syntax, + writer, + NULL, + (SerdBaseSink)serd_writer_set_base_uri, + (SerdPrefixSink)serd_writer_set_prefix, + (SerdStatementSink)serd_writer_write_statement, + (SerdEndSink)serd_writer_end_anon); + + serd_reader_set_strict(reader, !lax); + if (quiet) { + serd_reader_set_error_sink(reader, quiet_error_sink, NULL); + serd_writer_set_error_sink(writer, quiet_error_sink, NULL); + } + + SerdNode root = serd_node_from_string(SERD_URI, root_uri); + serd_writer_set_root_uri(writer, &root); + serd_writer_chop_blank_prefix(writer, chop_prefix); + serd_reader_add_blank_prefix(reader, add_prefix); + + SerdStatus st = SERD_SUCCESS; + if (!from_file) { + st = serd_reader_read_string(reader, input); + } else if (bulk_read) { + st = serd_reader_read_file_handle(reader, in_fd, in_name); + } else { + st = serd_reader_start_stream(reader, in_fd, in_name, false); + while (!st) { + st = serd_reader_read_chunk(reader); + } + serd_reader_end_stream(reader); + } + + serd_reader_free(reader); + serd_writer_finish(writer); + serd_writer_free(writer); + serd_env_free(env); + serd_node_free(&base); + free(input_path); + + if (from_file) { + fclose(in_fd); + } + + if (fclose(out_fd)) { + perror("serdi: write error"); + st = SERD_ERR_UNKNOWN; + } + + return (st > SERD_FAILURE) ? 1 : 0; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,46 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef SERD_INTERNAL_H +#define SERD_INTERNAL_H + +#include "serd/serd.h" + +#include + +#define NS_XSD "http://www.w3.org/2001/XMLSchema#" +#define NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#" + +#define SERD_PAGE_SIZE 4096 + +#ifndef MIN +# define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +/* Error reporting */ + +static inline void +serd_error(SerdErrorSink error_sink, void* handle, const SerdError* e) +{ + if (error_sink) { + error_sink(handle, e); + } else { + fprintf(stderr, "error: %s:%u:%u: ", e->filename, e->line, e->col); + vfprintf(stderr, e->fmt, *e->args); + } +} + +#endif // SERD_INTERNAL_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,119 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef SERD_STACK_H +#define SERD_STACK_H + +#include +#include +#include +#include +#include + +/** An offset to start the stack at. Note 0 is reserved for NULL. */ +#define SERD_STACK_BOTTOM sizeof(void*) + +/** A dynamic stack in memory. */ +typedef struct { + uint8_t* buf; ///< Stack memory + size_t buf_size; ///< Allocated size of buf (>= size) + size_t size; ///< Conceptual size of stack in buf +} SerdStack; + +/** An offset to start the stack at. Note 0 is reserved for NULL. */ +#define SERD_STACK_BOTTOM sizeof(void*) + +static inline SerdStack +serd_stack_new(size_t size) +{ + SerdStack stack; + stack.buf = (uint8_t*)calloc(size, 1); + stack.buf_size = size; + stack.size = SERD_STACK_BOTTOM; + return stack; +} + +static inline bool +serd_stack_is_empty(SerdStack* stack) +{ + return stack->size <= SERD_STACK_BOTTOM; +} + +static inline void +serd_stack_free(SerdStack* stack) +{ + free(stack->buf); + stack->buf = NULL; + stack->buf_size = 0; + stack->size = 0; +} + +static inline void* +serd_stack_push(SerdStack* stack, size_t n_bytes) +{ + const size_t new_size = stack->size + n_bytes; + if (stack->buf_size < new_size) { + stack->buf_size += (stack->buf_size >> 1); // *= 1.5 + stack->buf = (uint8_t*)realloc(stack->buf, stack->buf_size); + } + + uint8_t* const ret = (stack->buf + stack->size); + + stack->size = new_size; + return ret; +} + +static inline void +serd_stack_pop(SerdStack* stack, size_t n_bytes) +{ + assert(stack->size >= n_bytes); + stack->size -= n_bytes; +} + +static inline void* +serd_stack_push_aligned(SerdStack* stack, size_t n_bytes, size_t align) +{ + // Push one byte to ensure space for a pad count + serd_stack_push(stack, 1); + + // Push padding if necessary + const size_t pad = align - stack->size % align; + if (pad > 0) { + serd_stack_push(stack, pad); + } + + // Set top of stack to pad count so we can properly pop later + assert(pad < UINT8_MAX); + stack->buf[stack->size - 1] = (uint8_t)pad; + + // Push requested space at aligned location + return serd_stack_push(stack, n_bytes); +} + +static inline void +serd_stack_pop_aligned(SerdStack* stack, size_t n_bytes) +{ + // Pop requested space down to aligned location + serd_stack_pop(stack, n_bytes); + + // Get amount of padding from top of stack + const uint8_t pad = stack->buf[stack->size - 1]; + + // Pop padding and pad count + serd_stack_pop(stack, pad + 1u); +} + +#endif // SERD_STACK_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,179 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#include "string_utils.h" + +#include "serd/serd.h" + +#include +#include +#include + +void +serd_free(void* ptr) +{ + free(ptr); +} + +const uint8_t* +serd_strerror(SerdStatus status) +{ + switch (status) { + case SERD_SUCCESS: + return (const uint8_t*)"Success"; + case SERD_FAILURE: + return (const uint8_t*)"Non-fatal failure"; + case SERD_ERR_UNKNOWN: + return (const uint8_t*)"Unknown error"; + case SERD_ERR_BAD_SYNTAX: + return (const uint8_t*)"Invalid syntax"; + case SERD_ERR_BAD_ARG: + return (const uint8_t*)"Invalid argument"; + case SERD_ERR_NOT_FOUND: + return (const uint8_t*)"Not found"; + case SERD_ERR_ID_CLASH: + return (const uint8_t*)"Blank node ID clash"; + case SERD_ERR_BAD_CURIE: + return (const uint8_t*)"Invalid CURIE"; + case SERD_ERR_INTERNAL: + return (const uint8_t*)"Internal error"; + default: + break; + } + return (const uint8_t*)"Unknown error"; // never reached +} + +static inline void +serd_update_flags(const uint8_t c, SerdNodeFlags* const flags) +{ + switch (c) { + case '\r': + case '\n': + *flags |= SERD_HAS_NEWLINE; + break; + case '"': + *flags |= SERD_HAS_QUOTE; + default: + break; + } +} + +size_t +serd_substrlen(const uint8_t* const str, + const size_t len, + size_t* const n_bytes, + SerdNodeFlags* const flags) +{ + size_t n_chars = 0; + size_t i = 0; + SerdNodeFlags f = 0; + for (; i < len && str[i]; ++i) { + if ((str[i] & 0xC0) != 0x80) { // Start of new character + ++n_chars; + serd_update_flags(str[i], &f); + } + } + if (n_bytes) { + *n_bytes = i; + } + if (flags) { + *flags = f; + } + return n_chars; +} + +size_t +serd_strlen(const uint8_t* str, size_t* n_bytes, SerdNodeFlags* flags) +{ + size_t n_chars = 0; + size_t i = 0; + SerdNodeFlags f = 0; + for (; str[i]; ++i) { + if ((str[i] & 0xC0) != 0x80) { // Start of new character + ++n_chars; + serd_update_flags(str[i], &f); + } + } + if (n_bytes) { + *n_bytes = i; + } + if (flags) { + *flags = f; + } + return n_chars; +} + +static inline double +read_sign(const char** sptr) +{ + double sign = 1.0; + switch (**sptr) { + case '-': + sign = -1.0; + // fallthru + case '+': + ++(*sptr); + // fallthru + default: + return sign; + } +} + +double +serd_strtod(const char* str, char** endptr) +{ + double result = 0.0; + + // Point s at the first non-whitespace character + const char* s = str; + while (is_space(*s)) { + ++s; + } + + // Read leading sign if necessary + const double sign = read_sign(&s); + + // Parse integer part + for (; is_digit(*s); ++s) { + result = (result * 10.0) + (*s - '0'); + } + + // Parse fractional part + if (*s == '.') { + double denom = 10.0; + for (++s; is_digit(*s); ++s) { + result += (*s - '0') / denom; + denom *= 10.0; + } + } + + // Parse exponent + if (*s == 'e' || *s == 'E') { + ++s; + double expt = 0.0; + double expt_sign = read_sign(&s); + for (; is_digit(*s); ++s) { + expt = (expt * 10.0) + (*s - '0'); + } + result *= pow(10, expt * expt_sign); + } + + if (endptr) { + *endptr = (char*)s; + } + + return result * sign; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,173 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef SERD_STRING_UTILS_H +#define SERD_STRING_UTILS_H + +#include "serd/serd.h" + +#include +#include +#include + +/** Unicode replacement character in UTF-8 */ +static const uint8_t replacement_char[] = {0xEF, 0xBF, 0xBD}; + +/** Return true if `c` lies within [`min`...`max`] (inclusive) */ +static inline bool +in_range(const int c, const int min, const int max) +{ + return (c >= min && c <= max); +} + +/** RFC2234: ALPHA ::= %x41-5A / %x61-7A ; A-Z / a-z */ +static inline bool +is_alpha(const int c) +{ + return in_range(c, 'A', 'Z') || in_range(c, 'a', 'z'); +} + +/** RFC2234: DIGIT ::= %x30-39 ; 0-9 */ +static inline bool +is_digit(const int c) +{ + return in_range(c, '0', '9'); +} + +/* RFC2234: HEXDIG ::= DIGIT / "A" / "B" / "C" / "D" / "E" / "F" */ +static inline bool +is_hexdig(const int c) +{ + return is_digit(c) || in_range(c, 'A', 'F'); +} + +/* Turtle / JSON / C: XDIGIT ::= DIGIT / A-F / a-f */ +static inline bool +is_xdigit(const int c) +{ + return is_hexdig(c) || in_range(c, 'a', 'f'); +} + +static inline bool +is_space(const char c) +{ + switch (c) { + case ' ': + case '\f': + case '\n': + case '\r': + case '\t': + case '\v': + return true; + default: + return false; + } +} + +static inline bool +is_print(const int c) +{ + return c >= 0x20 && c <= 0x7E; +} + +static inline bool +is_base64(const uint8_t c) +{ + return is_alpha(c) || is_digit(c) || c == '+' || c == '/' || c == '='; +} + +static inline bool +is_windows_path(const uint8_t* path) +{ + return is_alpha(path[0]) && (path[1] == ':' || path[1] == '|') && + (path[2] == '/' || path[2] == '\\'); +} + +size_t +serd_substrlen(const uint8_t* str, + size_t len, + size_t* n_bytes, + SerdNodeFlags* flags); + +static inline char +serd_to_upper(const char c) +{ + return (char)((c >= 'a' && c <= 'z') ? c - 32 : c); +} + +static inline int +serd_strncasecmp(const char* s1, const char* s2, size_t n) +{ + for (; n > 0 && *s2; s1++, s2++, --n) { + if (serd_to_upper(*s1) != serd_to_upper(*s2)) { + return ((*(const uint8_t*)s1 < *(const uint8_t*)s2) ? -1 : +1); + } + } + + return 0; +} + +static inline uint32_t +utf8_num_bytes(const uint8_t c) +{ + if ((c & 0x80) == 0) { // Starts with `0' + return 1; + } + + if ((c & 0xE0) == 0xC0) { // Starts with `110' + return 2; + } + + if ((c & 0xF0) == 0xE0) { // Starts with `1110' + return 3; + } + + if ((c & 0xF8) == 0xF0) { // Starts with `11110' + return 4; + } + + return 0; +} + +/// Return the code point of a UTF-8 character with known length +static inline uint32_t +parse_counted_utf8_char(const uint8_t* utf8, size_t size) +{ + uint32_t c = utf8[0] & ((1u << (8 - size)) - 1); + for (size_t i = 1; i < size; ++i) { + const uint8_t in = utf8[i] & 0x3F; + c = (c << 6) | in; + } + return c; +} + +/// Parse a UTF-8 character, set *size to the length, and return the code point +static inline uint32_t +parse_utf8_char(const uint8_t* utf8, size_t* size) +{ + switch (*size = utf8_num_bytes(utf8[0])) { + case 1: + case 2: + case 3: + case 4: + return parse_counted_utf8_char(utf8, *size); + default: + *size = 0; + return 0; + } +} + +#endif // SERD_STRING_UTILS_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,82 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#define _POSIX_C_SOURCE 200809L /* for posix_memalign and posix_fadvise */ + +#include "system.h" + +#include "serd_config.h" +#include "serd_internal.h" + +#if USE_POSIX_FADVISE && USE_FILENO +# include +#endif + +#ifdef _WIN32 +# include +#endif + +#include +#include +#include +#include + +FILE* +serd_fopen(const char* path, const char* mode) +{ + FILE* fd = fopen(path, mode); + if (!fd) { + fprintf( + stderr, "error: failed to open file %s (%s)\n", path, strerror(errno)); + return NULL; + } + +#if USE_POSIX_FADVISE && USE_FILENO + posix_fadvise(fileno(fd), 0, 0, POSIX_FADV_SEQUENTIAL); +#endif + return fd; +} + +void* +serd_malloc_aligned(const size_t alignment, const size_t size) +{ +#if defined(_WIN32) + return _aligned_malloc(size, alignment); +#elif USE_POSIX_MEMALIGN + void* ptr = NULL; + const int ret = posix_memalign(&ptr, alignment, size); + return ret ? NULL : ptr; +#else + (void)alignment; + return malloc(size); +#endif +} + +void* +serd_allocate_buffer(const size_t size) +{ + return serd_malloc_aligned(SERD_PAGE_SIZE, size); +} + +void +serd_free_aligned(void* const ptr) +{ +#ifdef _WIN32 + _aligned_free(ptr); +#else + free(ptr); +#endif +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,40 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef SERD_SYSTEM_H +#define SERD_SYSTEM_H + +#include "attributes.h" + +#include + +/// Open a file configured for fast sequential reading +FILE* +serd_fopen(const char* path, const char* mode); + +/// Allocate a buffer aligned to `alignment` bytes +SERD_MALLOC_FUNC void* +serd_malloc_aligned(size_t alignment, size_t size); + +/// Allocate an aligned buffer for I/O +SERD_MALLOC_FUNC void* +serd_allocate_buffer(size_t size); + +/// Free a buffer allocated with an aligned allocation function +void +serd_free_aligned(void* ptr); + +#endif // SERD_SYSTEM_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,506 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#include "string_utils.h" +#include "uri_utils.h" + +#include "serd/serd.h" + +#include +#include +#include +#include +#include + +const uint8_t* +serd_uri_to_path(const uint8_t* uri) +{ + const uint8_t* path = uri; + if (!is_windows_path(uri) && serd_uri_string_has_scheme(uri)) { + if (strncmp((const char*)uri, "file:", 5)) { + fprintf(stderr, "Non-file URI `%s'\n", uri); + return NULL; + } + + if (!strncmp((const char*)uri, "file://localhost/", 17)) { + path = uri + 16; + } else if (!strncmp((const char*)uri, "file://", 7)) { + path = uri + 7; + } else { + fprintf(stderr, "Invalid file URI `%s'\n", uri); + return NULL; + } + + if (is_windows_path(path + 1)) { + ++path; // Special case for terrible Windows file URIs + } + } + return path; +} + +uint8_t* +serd_file_uri_parse(const uint8_t* uri, uint8_t** hostname) +{ + const uint8_t* path = uri; + if (hostname) { + *hostname = NULL; + } + if (!strncmp((const char*)uri, "file://", 7)) { + const uint8_t* auth = uri + 7; + if (*auth == '/') { // No hostname + path = auth; + } else { // Has hostname + if (!(path = (const uint8_t*)strchr((const char*)auth, '/'))) { + return NULL; + } + + if (hostname) { + *hostname = (uint8_t*)calloc((size_t)(path - auth + 1), 1); + memcpy(*hostname, auth, (size_t)(path - auth)); + } + } + } + + if (is_windows_path(path + 1)) { + ++path; + } + + SerdChunk chunk = {NULL, 0}; + for (const uint8_t* s = path; *s; ++s) { + if (*s == '%') { + if (*(s + 1) == '%') { + serd_chunk_sink("%", 1, &chunk); + ++s; + } else if (is_hexdig(*(s + 1)) && is_hexdig(*(s + 2))) { + const uint8_t code[3] = {*(s + 1), *(s + 2), 0}; + const uint8_t c = (uint8_t)strtoul((const char*)code, NULL, 16); + serd_chunk_sink(&c, 1, &chunk); + s += 2; + } else { + s += 2; // Junk escape, ignore + } + } else { + serd_chunk_sink(s, 1, &chunk); + } + } + + return serd_chunk_sink_finish(&chunk); +} + +bool +serd_uri_string_has_scheme(const uint8_t* utf8) +{ + // RFC3986: scheme ::= ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) + if (!utf8 || !is_alpha(utf8[0])) { + return false; // Invalid scheme initial character, URI is relative + } + + for (uint8_t c = 0; (c = *++utf8) != '\0';) { + if (!is_uri_scheme_char(c)) { + return false; + } + + if (c == ':') { + return true; // End of scheme + } + } + + return false; +} + +SerdStatus +serd_uri_parse(const uint8_t* utf8, SerdURI* out) +{ + *out = SERD_URI_NULL; + + const uint8_t* ptr = utf8; + + /* See http://tools.ietf.org/html/rfc3986#section-3 + URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + */ + + /* S3.1: scheme ::= ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) */ + if (is_alpha(*ptr)) { + for (uint8_t c = *++ptr; true; c = *++ptr) { + switch (c) { + case '\0': + case '/': + case '?': + case '#': + ptr = utf8; + goto path; // Relative URI (starts with path by definition) + case ':': + out->scheme.buf = utf8; + out->scheme.len = (size_t)((ptr++) - utf8); + goto maybe_authority; // URI with scheme + case '+': + case '-': + case '.': + continue; + default: + if (is_alpha(c) || is_digit(c)) { + continue; + } + } + } + } + + /* S3.2: The authority component is preceded by a double slash ("//") + and is terminated by the next slash ("/"), question mark ("?"), + or number sign ("#") character, or by the end of the URI. + */ +maybe_authority: + if (*ptr == '/' && *(ptr + 1) == '/') { + ptr += 2; + out->authority.buf = ptr; + for (uint8_t c = 0; (c = *ptr) != '\0'; ++ptr) { + switch (c) { + case '/': + goto path; + case '?': + goto query; + case '#': + goto fragment; + default: + ++out->authority.len; + } + } + } + + /* RFC3986 S3.3: The path is terminated by the first question mark ("?") + or number sign ("#") character, or by the end of the URI. + */ +path: + switch (*ptr) { + case '?': + goto query; + case '#': + goto fragment; + case '\0': + goto end; + default: + break; + } + out->path.buf = ptr; + out->path.len = 0; + for (uint8_t c = 0; (c = *ptr) != '\0'; ++ptr) { + switch (c) { + case '?': + goto query; + case '#': + goto fragment; + default: + ++out->path.len; + } + } + + /* RFC3986 S3.4: The query component is indicated by the first question + mark ("?") character and terminated by a number sign ("#") character + or by the end of the URI. + */ +query: + if (*ptr == '?') { + out->query.buf = ++ptr; + for (uint8_t c = 0; (c = *ptr) != '\0'; ++ptr) { + if (c == '#') { + goto fragment; + } + ++out->query.len; + } + } + + /* RFC3986 S3.5: A fragment identifier component is indicated by the + presence of a number sign ("#") character and terminated by the end + of the URI. + */ +fragment: + if (*ptr == '#') { + out->fragment.buf = ptr; + while (*ptr++ != '\0') { + ++out->fragment.len; + } + } + +end: + return SERD_SUCCESS; +} + +/** + Remove leading dot components from `path`. + See http://tools.ietf.org/html/rfc3986#section-5.2.3 + @param up Set to the number of up-references (e.g. "../") trimmed + @return A pointer to the new start of `path` +*/ +static const uint8_t* +remove_dot_segments(const uint8_t* path, size_t len, size_t* up) +{ + const uint8_t* begin = path; + const uint8_t* const end = path + len; + + *up = 0; + while (begin < end) { + switch (begin[0]) { + case '.': + switch (begin[1]) { + case '/': + begin += 2; // Chop leading "./" + break; + case '.': + switch (begin[2]) { + case '\0': + ++*up; + begin += 2; // Chop input ".." + break; + case '/': + ++*up; + begin += 3; // Chop leading "../" + break; + default: + return begin; + } + break; + case '\0': + return ++begin; // Chop input "." + default: + return begin; + } + break; + + case '/': + switch (begin[1]) { + case '.': + switch (begin[2]) { + case '/': + begin += 2; // Leading "/./" => "/" + break; + case '.': + switch (begin[3]) { + case '/': + ++*up; + begin += 3; // Leading "/../" => "/" + } + break; + default: + return begin; + } + } + return begin; + + default: + return begin; // Finished chopping dot components + } + } + + return begin; +} + +/// Merge `base` and `path` in-place +static void +merge(SerdChunk* base, SerdChunk* path) +{ + size_t up = 0; + const uint8_t* begin = remove_dot_segments(path->buf, path->len, &up); + const uint8_t* end = path->buf + path->len; + + if (base->len) { + // Find the up'th last slash + const uint8_t* base_last = (base->buf + base->len - 1); + ++up; + do { + if (*base_last == '/') { + --up; + } + } while (up > 0 && (--base_last > base->buf)); + + // Set path prefix + base->len = (size_t)(base_last - base->buf + 1); + } + + // Set path suffix + path->buf = begin; + path->len = (size_t)(end - begin); +} + +/// See http://tools.ietf.org/html/rfc3986#section-5.2.2 +void +serd_uri_resolve(const SerdURI* r, const SerdURI* base, SerdURI* t) +{ + if (!base->scheme.len) { + *t = *r; // Don't resolve against non-absolute URIs + return; + } + + t->path_base.buf = NULL; + t->path_base.len = 0; + if (r->scheme.len) { + *t = *r; + } else { + if (r->authority.len) { + t->authority = r->authority; + t->path = r->path; + t->query = r->query; + } else { + t->path = r->path; + if (!r->path.len) { + t->path_base = base->path; + if (r->query.len) { + t->query = r->query; + } else { + t->query = base->query; + } + } else { + if (r->path.buf[0] != '/') { + t->path_base = base->path; + } + merge(&t->path_base, &t->path); + t->query = r->query; + } + t->authority = base->authority; + } + t->scheme = base->scheme; + t->fragment = r->fragment; + } +} + +/** Write the path of `uri` starting at index `i` */ +static size_t +write_path_tail(SerdSink sink, void* stream, const SerdURI* uri, size_t i) +{ + size_t len = 0; + if (i < uri->path_base.len) { + len += sink(uri->path_base.buf + i, uri->path_base.len - i, stream); + } + + if (uri->path.buf) { + if (i < uri->path_base.len) { + len += sink(uri->path.buf, uri->path.len, stream); + } else { + const size_t j = (i - uri->path_base.len); + len += sink(uri->path.buf + j, uri->path.len - j, stream); + } + } + + return len; +} + +/** Write the path of `uri` relative to the path of `base`. */ +static size_t +write_rel_path(SerdSink sink, + void* stream, + const SerdURI* uri, + const SerdURI* base) +{ + const size_t path_len = uri_path_len(uri); + const size_t base_len = uri_path_len(base); + const size_t min_len = (path_len < base_len) ? path_len : base_len; + + // Find the last separator common to both paths + size_t last_shared_sep = 0; + size_t i = 0; + for (; i < min_len && uri_path_at(uri, i) == uri_path_at(base, i); ++i) { + if (uri_path_at(uri, i) == '/') { + last_shared_sep = i; + } + } + + if (i == path_len && i == base_len) { // Paths are identical + return 0; + } + + // Find the number of up references ("..") required + size_t up = 0; + for (size_t s = last_shared_sep + 1; s < base_len; ++s) { + if (uri_path_at(base, s) == '/') { + ++up; + } + } + + // Write up references + size_t len = 0; + for (size_t u = 0; u < up; ++u) { + len += sink("../", 3, stream); + } + + if (last_shared_sep == 0 && up == 0) { + len += sink("/", 1, stream); + } + + // Write suffix + return len + write_path_tail(sink, stream, uri, last_shared_sep + 1); +} + +static uint8_t +serd_uri_path_starts_without_slash(const SerdURI* uri) +{ + return ((uri->path_base.len || uri->path.len) && + ((!uri->path_base.len || uri->path_base.buf[0] != '/') && + (!uri->path.len || uri->path.buf[0] != '/'))); +} + +/// See http://tools.ietf.org/html/rfc3986#section-5.3 +size_t +serd_uri_serialise_relative(const SerdURI* uri, + const SerdURI* base, + const SerdURI* root, + SerdSink sink, + void* stream) +{ + size_t len = 0; + const bool relative = + root ? uri_is_under(uri, root) : uri_is_related(uri, base); + + if (relative) { + len = write_rel_path(sink, stream, uri, base); + } + + if (!relative || (!len && base->query.buf)) { + if (uri->scheme.buf) { + len += sink(uri->scheme.buf, uri->scheme.len, stream); + len += sink(":", 1, stream); + } + if (uri->authority.buf) { + len += sink("//", 2, stream); + len += sink(uri->authority.buf, uri->authority.len, stream); + if (uri->authority.len > 0 && + uri->authority.buf[uri->authority.len - 1] != '/' && + serd_uri_path_starts_without_slash(uri)) { + // Special case: ensure path begins with a slash + // https://tools.ietf.org/html/rfc3986#section-3.2 + len += sink("/", 1, stream); + } + } + len += write_path_tail(sink, stream, uri, 0); + } + + if (uri->query.buf) { + len += sink("?", 1, stream); + len += sink(uri->query.buf, uri->query.len, stream); + } + + if (uri->fragment.buf) { + // Note uri->fragment.buf includes the leading `#' + len += sink(uri->fragment.buf, uri->fragment.len, stream); + } + + return len; +} + +/// See http://tools.ietf.org/html/rfc3986#section-5.3 +size_t +serd_uri_serialise(const SerdURI* uri, SerdSink sink, void* stream) +{ + return serd_uri_serialise_relative(uri, NULL, NULL, sink, stream); +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,110 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef SERD_URI_UTILS_H +#define SERD_URI_UTILS_H + +#include "serd/serd.h" + +#include "string_utils.h" + +#include +#include +#include + +static inline bool +chunk_equals(const SerdChunk* a, const SerdChunk* b) +{ + return a->len == b->len && + !strncmp((const char*)a->buf, (const char*)b->buf, a->len); +} + +static inline size_t +uri_path_len(const SerdURI* uri) +{ + return uri->path_base.len + uri->path.len; +} + +static inline uint8_t +uri_path_at(const SerdURI* uri, size_t i) +{ + return (i < uri->path_base.len) ? uri->path_base.buf[i] + : uri->path.buf[i - uri->path_base.len]; +} + +/** + Return the index of the first differing character after the last root slash, + or zero if `uri` is not under `root`. +*/ +static inline SERD_PURE_FUNC size_t +uri_rooted_index(const SerdURI* uri, const SerdURI* root) +{ + if (!root || !root->scheme.len || + !chunk_equals(&root->scheme, &uri->scheme) || + !chunk_equals(&root->authority, &uri->authority)) { + return 0; + } + + bool differ = false; + const size_t path_len = uri_path_len(uri); + const size_t root_len = uri_path_len(root); + size_t last_root_slash = 0; + for (size_t i = 0; i < path_len && i < root_len; ++i) { + const uint8_t u = uri_path_at(uri, i); + const uint8_t r = uri_path_at(root, i); + + differ = differ || u != r; + if (r == '/') { + last_root_slash = i; + if (differ) { + return 0; + } + } + } + + return last_root_slash + 1; +} + +/** Return true iff `uri` shares path components with `root` */ +static inline SERD_PURE_FUNC bool +uri_is_related(const SerdURI* uri, const SerdURI* root) +{ + return uri_rooted_index(uri, root) > 0; +} + +/** Return true iff `uri` is within the base of `root` */ +static inline SERD_PURE_FUNC bool +uri_is_under(const SerdURI* uri, const SerdURI* root) +{ + const size_t index = uri_rooted_index(uri, root); + return index > 0 && uri->path.len > index; +} + +static inline bool +is_uri_scheme_char(const int c) +{ + switch (c) { + case ':': + case '+': + case '-': + case '.': + return true; + default: + return is_alpha(c) || is_digit(c); + } +} + +#endif // SERD_URI_UTILS_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1114 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#include "byte_sink.h" +#include "serd_internal.h" +#include "stack.h" +#include "string_utils.h" +#include "uri_utils.h" + +#include "serd/serd.h" + +#include +#include +#include +#include +#include +#include +#include + +typedef enum { + FIELD_NONE, + FIELD_SUBJECT, + FIELD_PREDICATE, + FIELD_OBJECT, + FIELD_GRAPH +} Field; + +typedef struct { + SerdNode graph; + SerdNode subject; + SerdNode predicate; +} WriteContext; + +static const WriteContext WRITE_CONTEXT_NULL = {{0, 0, 0, 0, SERD_NOTHING}, + {0, 0, 0, 0, SERD_NOTHING}, + {0, 0, 0, 0, SERD_NOTHING}}; + +typedef enum { + SEP_NONE, + SEP_END_S, ///< End of a subject ('.') + SEP_END_P, ///< End of a predicate (';') + SEP_END_O, ///< End of an object (',') + SEP_S_P, ///< Between a subject and predicate (whitespace) + SEP_P_O, ///< Between a predicate and object (whitespace) + SEP_ANON_BEGIN, ///< Start of anonymous node ('[') + SEP_ANON_END, ///< End of anonymous node (']') + SEP_LIST_BEGIN, ///< Start of list ('(') + SEP_LIST_SEP, ///< List separator (whitespace) + SEP_LIST_END, ///< End of list (')') + SEP_GRAPH_BEGIN, ///< Start of graph ('{') + SEP_GRAPH_END, ///< End of graph ('}') + SEP_URI_BEGIN, ///< URI start quote ('<') + SEP_URI_END ///< URI end quote ('>') +} Sep; + +typedef struct { + const char* str; ///< Sep string + uint8_t len; ///< Length of sep string + uint8_t space_before; ///< Newline before sep + uint8_t space_after_node; ///< Newline after sep if after node + uint8_t space_after_sep; ///< Newline after sep if after sep +} SepRule; + +static const SepRule rules[] = {{NULL, 0, 0, 0, 0}, + {" .\n\n", 4, 0, 0, 0}, + {" ;", 2, 0, 1, 1}, + {" ,", 2, 0, 1, 0}, + {NULL, 0, 0, 1, 0}, + {" ", 1, 0, 0, 0}, + {"[", 1, 0, 1, 1}, + {"]", 1, 1, 0, 0}, + {"(", 1, 0, 0, 0}, + {NULL, 0, 0, 1, 0}, + {")", 1, 1, 0, 0}, + {" {", 2, 0, 1, 1}, + {" }", 2, 0, 1, 1}, + {"<", 1, 0, 0, 0}, + {">", 1, 0, 0, 0}, + {"\n", 1, 0, 1, 0}}; + +struct SerdWriterImpl { + SerdSyntax syntax; + SerdStyle style; + SerdEnv* env; + SerdNode root_node; + SerdURI root_uri; + SerdURI base_uri; + SerdStack anon_stack; + SerdByteSink byte_sink; + SerdErrorSink error_sink; + void* error_handle; + WriteContext context; + SerdNode list_subj; + unsigned list_depth; + unsigned indent; + uint8_t* bprefix; + size_t bprefix_len; + Sep last_sep; + bool empty; +}; + +typedef enum { WRITE_STRING, WRITE_LONG_STRING } TextContext; + +static bool +write_node(SerdWriter* writer, + const SerdNode* node, + const SerdNode* datatype, + const SerdNode* lang, + Field field, + SerdStatementFlags flags); + +static bool +supports_abbrev(const SerdWriter* writer) +{ + return writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG; +} + +static bool +supports_uriref(const SerdWriter* writer) +{ + return writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG; +} + +static void +w_err(SerdWriter* writer, SerdStatus st, const char* fmt, ...) +{ + /* TODO: This results in errors with no file information, which is not + helpful when re-serializing a file (particularly for "undefined + namespace prefix" errors. The statement sink API needs to be changed to + add a Cursor parameter so the source can notify the writer of the + statement origin for better error reporting. */ + + va_list args; + va_start(args, fmt); + const SerdError e = {st, (const uint8_t*)"", 0, 0, fmt, &args}; + serd_error(writer->error_sink, writer->error_handle, &e); + va_end(args); +} + +static inline SERD_PURE_FUNC WriteContext* +anon_stack_top(SerdWriter* writer) +{ + assert(!serd_stack_is_empty(&writer->anon_stack)); + return (WriteContext*)(writer->anon_stack.buf + writer->anon_stack.size - + sizeof(WriteContext)); +} + +static void +copy_node(SerdNode* dst, const SerdNode* src) +{ + if (src) { + dst->buf = (uint8_t*)realloc((char*)dst->buf, src->n_bytes + 1); + dst->n_bytes = src->n_bytes; + dst->n_chars = src->n_chars; + dst->flags = src->flags; + dst->type = src->type; + memcpy((char*)dst->buf, src->buf, src->n_bytes + 1); + } else { + dst->type = SERD_NOTHING; + } +} + +static inline size_t +sink(const void* buf, size_t len, SerdWriter* writer) +{ + return serd_byte_sink_write(buf, len, &writer->byte_sink); +} + +// Write a single character, as an escape for single byte characters +// (Caller prints any single byte characters that don't need escaping) +static size_t +write_character(SerdWriter* writer, const uint8_t* utf8, size_t* size) +{ + char escape[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + const uint32_t c = parse_utf8_char(utf8, size); + switch (*size) { + case 0: + w_err(writer, SERD_ERR_BAD_ARG, "invalid UTF-8: %X\n", utf8[0]); + return sink(replacement_char, sizeof(replacement_char), writer); + case 1: + snprintf(escape, sizeof(escape), "\\u%04X", utf8[0]); + return sink(escape, 6, writer); + default: + break; + } + + if (!(writer->style & SERD_STYLE_ASCII)) { + // Write UTF-8 character directly to UTF-8 output + return sink(utf8, *size, writer); + } + + if (c <= 0xFFFF) { + snprintf(escape, sizeof(escape), "\\u%04X", c); + return sink(escape, 6, writer); + } + + snprintf(escape, sizeof(escape), "\\U%08X", c); + return sink(escape, 10, writer); +} + +static inline bool +uri_must_escape(const uint8_t c) +{ + switch (c) { + case ' ': + case '"': + case '<': + case '>': + case '\\': + case '^': + case '`': + case '{': + case '|': + case '}': + return true; + default: + return !in_range(c, 0x20, 0x7E); + } +} + +static size_t +write_uri(SerdWriter* writer, const uint8_t* utf8, size_t n_bytes) +{ + size_t len = 0; + for (size_t i = 0; i < n_bytes;) { + size_t j = i; // Index of next character that must be escaped + for (; j < n_bytes; ++j) { + if (uri_must_escape(utf8[j])) { + break; + } + } + + // Bulk write all characters up to this special one + len += sink(&utf8[i], j - i, writer); + if ((i = j) == n_bytes) { + break; // Reached end + } + + // Write UTF-8 character + size_t size = 0; + len += write_character(writer, utf8 + i, &size); + i += size; + if (size == 0) { + // Corrupt input, scan to start of next character + for (++i; i < n_bytes && (utf8[i] & 0x80); ++i) { + } + } + } + + return len; +} + +static bool +lname_must_escape(const uint8_t c) +{ + /* This arbitrary list of characters, most of which have nothing to do with + Turtle, must be handled as special cases here because the RDF and SPARQL + WGs are apparently intent on making the once elegant Turtle a baroque + and inconsistent mess, throwing elegance and extensibility completely + out the window for no good reason. + + Note '-', '.', and '_' are also in PN_LOCAL_ESC, but are valid unescaped + in local names, so they are not escaped here. */ + + switch (c) { + case '\'': + case '!': + case '#': + case '$': + case '%': + case '&': + case '(': + case ')': + case '*': + case '+': + case ',': + case '/': + case ';': + case '=': + case '?': + case '@': + case '~': + return true; + default: + break; + } + return false; +} + +static size_t +write_lname(SerdWriter* writer, const uint8_t* utf8, size_t n_bytes) +{ + size_t len = 0; + for (size_t i = 0; i < n_bytes; ++i) { + size_t j = i; // Index of next character that must be escaped + for (; j < n_bytes; ++j) { + if (lname_must_escape(utf8[j])) { + break; + } + } + + // Bulk write all characters up to this special one + len += sink(&utf8[i], j - i, writer); + if ((i = j) == n_bytes) { + break; // Reached end + } + + // Write escape + len += sink("\\", 1, writer); + len += sink(&utf8[i], 1, writer); + } + + return len; +} + +static size_t +write_text(SerdWriter* writer, + TextContext ctx, + const uint8_t* utf8, + size_t n_bytes) +{ + size_t len = 0; + for (size_t i = 0; i < n_bytes;) { + // Fast bulk write for long strings of printable ASCII + size_t j = i; + for (; j < n_bytes; ++j) { + if (utf8[j] == '\\' || utf8[j] == '"' || + (!in_range(utf8[j], 0x20, 0x7E))) { + break; + } + } + + len += sink(&utf8[i], j - i, writer); + if ((i = j) == n_bytes) { + break; // Reached end + } + + const uint8_t in = utf8[i++]; + if (ctx == WRITE_LONG_STRING) { + switch (in) { + case '\\': + len += sink("\\\\", 2, writer); + continue; + case '\b': + len += sink("\\b", 2, writer); + continue; + case '\n': + case '\r': + case '\t': + case '\f': + len += sink(&in, 1, writer); // Write character as-is + continue; + case '\"': + if (i == n_bytes) { // '"' at string end + len += sink("\\\"", 2, writer); + } else { + len += sink(&in, 1, writer); + } + continue; + default: + break; + } + } else if (ctx == WRITE_STRING) { + switch (in) { + case '\\': + len += sink("\\\\", 2, writer); + continue; + case '\n': + len += sink("\\n", 2, writer); + continue; + case '\r': + len += sink("\\r", 2, writer); + continue; + case '\t': + len += sink("\\t", 2, writer); + continue; + case '"': + len += sink("\\\"", 2, writer); + continue; + default: + break; + } + if (writer->syntax == SERD_TURTLE) { + switch (in) { + case '\b': + len += sink("\\b", 2, writer); + continue; + case '\f': + len += sink("\\f", 2, writer); + continue; + default: + break; + } + } + } + + // Write UTF-8 character + size_t size = 0; + len += write_character(writer, utf8 + i - 1, &size); + if (size == 0) { + // Corrupt input, scan to start of next character + for (; i < n_bytes && (utf8[i] & 0x80); ++i) { + } + } else { + i += size - 1; + } + } + + return len; +} + +static size_t +uri_sink(const void* buf, size_t len, void* stream) +{ + return write_uri((SerdWriter*)stream, (const uint8_t*)buf, len); +} + +static void +write_newline(SerdWriter* writer) +{ + sink("\n", 1, writer); + for (unsigned i = 0; i < writer->indent; ++i) { + sink("\t", 1, writer); + } +} + +static bool +write_sep(SerdWriter* writer, const Sep sep) +{ + const SepRule* rule = &rules[sep]; + if (rule->space_before) { + write_newline(writer); + } + + if (rule->str) { + sink(rule->str, rule->len, writer); + } + + if ((writer->last_sep && rule->space_after_sep) || + (!writer->last_sep && rule->space_after_node)) { + write_newline(writer); + } else if (writer->last_sep && rule->space_after_node) { + sink(" ", 1, writer); + } + + writer->last_sep = sep; + return true; +} + +static SerdStatus +reset_context(SerdWriter* writer, bool graph) +{ + if (graph) { + writer->context.graph.type = SERD_NOTHING; + } + + writer->context.subject.type = SERD_NOTHING; + writer->context.predicate.type = SERD_NOTHING; + writer->empty = false; + return SERD_SUCCESS; +} + +static SerdStatus +free_context(SerdWriter* writer) +{ + serd_node_free(&writer->context.graph); + serd_node_free(&writer->context.subject); + serd_node_free(&writer->context.predicate); + return reset_context(writer, true); +} + +static bool +is_inline_start(const SerdWriter* writer, Field field, SerdStatementFlags flags) +{ + return (supports_abbrev(writer) && + ((field == FIELD_SUBJECT && (flags & SERD_ANON_S_BEGIN)) || + (field == FIELD_OBJECT && (flags & SERD_ANON_O_BEGIN)))); +} + +static bool +write_literal(SerdWriter* writer, + const SerdNode* node, + const SerdNode* datatype, + const SerdNode* lang, + SerdStatementFlags flags) +{ + if (supports_abbrev(writer) && datatype && datatype->buf) { + const char* type_uri = (const char*)datatype->buf; + if (!strncmp(type_uri, NS_XSD, sizeof(NS_XSD) - 1) && + (!strcmp(type_uri + sizeof(NS_XSD) - 1, "boolean") || + !strcmp(type_uri + sizeof(NS_XSD) - 1, "integer"))) { + sink(node->buf, node->n_bytes, writer); + return true; + } + + if (!strncmp(type_uri, NS_XSD, sizeof(NS_XSD) - 1) && + !strcmp(type_uri + sizeof(NS_XSD) - 1, "decimal") && + strchr((const char*)node->buf, '.') && + node->buf[node->n_bytes - 1] != '.') { + /* xsd:decimal literals without trailing digits, e.g. "5.", can + not be written bare in Turtle. We could add a 0 which is + prettier, but changes the text and breaks round tripping. + */ + sink(node->buf, node->n_bytes, writer); + return true; + } + } + + if (supports_abbrev(writer) && + (node->flags & (SERD_HAS_NEWLINE | SERD_HAS_QUOTE))) { + sink("\"\"\"", 3, writer); + write_text(writer, WRITE_LONG_STRING, node->buf, node->n_bytes); + sink("\"\"\"", 3, writer); + } else { + sink("\"", 1, writer); + write_text(writer, WRITE_STRING, node->buf, node->n_bytes); + sink("\"", 1, writer); + } + if (lang && lang->buf) { + sink("@", 1, writer); + sink(lang->buf, lang->n_bytes, writer); + } else if (datatype && datatype->buf) { + sink("^^", 2, writer); + return write_node(writer, datatype, NULL, NULL, FIELD_NONE, flags); + } + return true; +} + +// Return true iff `buf` is a valid prefixed name suffix +static inline bool +is_name(const uint8_t* buf, const size_t len) +{ + // TODO: This is more strict than it should be + for (size_t i = 0; i < len; ++i) { + if (!(is_alpha(buf[i]) || is_digit(buf[i]))) { + return false; + } + } + + return true; +} + +static bool +write_uri_node(SerdWriter* const writer, + const SerdNode* node, + const Field field, + const SerdStatementFlags flags) +{ + SerdNode prefix; + SerdChunk suffix; + + if (is_inline_start(writer, field, flags)) { + ++writer->indent; + write_sep(writer, SEP_ANON_BEGIN); + sink("== ", 3, writer); + } + + const bool has_scheme = serd_uri_string_has_scheme(node->buf); + if (supports_abbrev(writer)) { + if (field == FIELD_PREDICATE && + !strcmp((const char*)node->buf, NS_RDF "type")) { + return sink("a", 1, writer) == 1; + } + + if (!strcmp((const char*)node->buf, NS_RDF "nil")) { + return sink("()", 2, writer) == 2; + } + + if (has_scheme && (writer->style & SERD_STYLE_CURIED) && + serd_env_qualify(writer->env, node, &prefix, &suffix) && + is_name(suffix.buf, suffix.len)) { + write_uri(writer, prefix.buf, prefix.n_bytes); + sink(":", 1, writer); + write_uri(writer, suffix.buf, suffix.len); + return true; + } + } + + if (!has_scheme && !supports_uriref(writer) && + !serd_env_get_base_uri(writer->env, NULL)->buf) { + w_err(writer, + SERD_ERR_BAD_ARG, + "syntax does not support URI reference <%s>\n", + node->buf); + return false; + } + + write_sep(writer, SEP_URI_BEGIN); + if (writer->style & SERD_STYLE_RESOLVED) { + SerdURI in_base_uri; + SerdURI uri; + SerdURI abs_uri; + serd_env_get_base_uri(writer->env, &in_base_uri); + serd_uri_parse(node->buf, &uri); + serd_uri_resolve(&uri, &in_base_uri, &abs_uri); + bool rooted = uri_is_under(&writer->base_uri, &writer->root_uri); + SerdURI* root = rooted ? &writer->root_uri : &writer->base_uri; + if (!uri_is_under(&abs_uri, root) || writer->syntax == SERD_NTRIPLES || + writer->syntax == SERD_NQUADS) { + serd_uri_serialise(&abs_uri, uri_sink, writer); + } else { + serd_uri_serialise_relative( + &uri, &writer->base_uri, root, uri_sink, writer); + } + } else { + write_uri(writer, node->buf, node->n_bytes); + } + + write_sep(writer, SEP_URI_END); + if (is_inline_start(writer, field, flags)) { + sink(" ;", 2, writer); + write_newline(writer); + } + + return true; +} + +static bool +write_curie(SerdWriter* const writer, + const SerdNode* node, + const Field field, + const SerdStatementFlags flags) +{ + SerdChunk prefix = {NULL, 0}; + SerdChunk suffix = {NULL, 0}; + SerdStatus st = SERD_SUCCESS; + + switch (writer->syntax) { + case SERD_NTRIPLES: + case SERD_NQUADS: + if ((st = serd_env_expand(writer->env, node, &prefix, &suffix))) { + w_err(writer, st, "undefined namespace prefix `%s'\n", node->buf); + return false; + } + write_sep(writer, SEP_URI_BEGIN); + write_uri(writer, prefix.buf, prefix.len); + write_uri(writer, suffix.buf, suffix.len); + write_sep(writer, SEP_URI_END); + break; + case SERD_TURTLE: + case SERD_TRIG: + if (is_inline_start(writer, field, flags)) { + ++writer->indent; + write_sep(writer, SEP_ANON_BEGIN); + sink("== ", 3, writer); + } + write_lname(writer, node->buf, node->n_bytes); + if (is_inline_start(writer, field, flags)) { + sink(" ;", 2, writer); + write_newline(writer); + } + } + + return true; +} + +static bool +write_blank(SerdWriter* const writer, + const SerdNode* node, + const Field field, + const SerdStatementFlags flags) +{ + if (supports_abbrev(writer)) { + if (is_inline_start(writer, field, flags)) { + ++writer->indent; + return write_sep(writer, SEP_ANON_BEGIN); + } + + if (field == FIELD_SUBJECT && (flags & SERD_LIST_S_BEGIN)) { + assert(writer->list_depth == 0); + copy_node(&writer->list_subj, node); + ++writer->list_depth; + ++writer->indent; + return write_sep(writer, SEP_LIST_BEGIN); + } + + if (field == FIELD_OBJECT && (flags & SERD_LIST_O_BEGIN)) { + ++writer->indent; + ++writer->list_depth; + return write_sep(writer, SEP_LIST_BEGIN); + } + + if ((field == FIELD_SUBJECT && (flags & SERD_EMPTY_S)) || + (field == FIELD_OBJECT && (flags & SERD_EMPTY_O))) { + return sink("[]", 2, writer) == 2; + } + } + + sink("_:", 2, writer); + if (writer->bprefix && !strncmp((const char*)node->buf, + (const char*)writer->bprefix, + writer->bprefix_len)) { + sink(node->buf + writer->bprefix_len, + node->n_bytes - writer->bprefix_len, + writer); + } else { + sink(node->buf, node->n_bytes, writer); + } + + return true; +} + +static bool +write_node(SerdWriter* writer, + const SerdNode* node, + const SerdNode* datatype, + const SerdNode* lang, + Field field, + SerdStatementFlags flags) +{ + bool ret = false; + switch (node->type) { + case SERD_NOTHING: + break; + case SERD_LITERAL: + ret = write_literal(writer, node, datatype, lang, flags); + break; + case SERD_URI: + ret = write_uri_node(writer, node, field, flags); + break; + case SERD_CURIE: + ret = write_curie(writer, node, field, flags); + break; + case SERD_BLANK: + ret = write_blank(writer, node, field, flags); + break; + } + + writer->last_sep = SEP_NONE; + return ret; +} + +static inline bool +is_resource(const SerdNode* node) +{ + return node && node->buf && node->type > SERD_LITERAL; +} + +static void +write_pred(SerdWriter* writer, SerdStatementFlags flags, const SerdNode* pred) +{ + write_node(writer, pred, NULL, NULL, FIELD_PREDICATE, flags); + write_sep(writer, SEP_P_O); + copy_node(&writer->context.predicate, pred); +} + +static bool +write_list_obj(SerdWriter* writer, + SerdStatementFlags flags, + const SerdNode* predicate, + const SerdNode* object, + const SerdNode* datatype, + const SerdNode* lang) +{ + if (!strcmp((const char*)object->buf, NS_RDF "nil")) { + --writer->indent; + write_sep(writer, SEP_LIST_END); + return true; + } + + if (!strcmp((const char*)predicate->buf, NS_RDF "first")) { + write_sep(writer, SEP_LIST_SEP); + write_node(writer, object, datatype, lang, FIELD_OBJECT, flags); + } + + return false; +} + +SerdStatus +serd_writer_write_statement(SerdWriter* writer, + SerdStatementFlags flags, + const SerdNode* graph, + const SerdNode* subject, + const SerdNode* predicate, + const SerdNode* object, + const SerdNode* datatype, + const SerdNode* lang) +{ + if (!is_resource(subject) || !is_resource(predicate) || !object || + !object->buf) { + return SERD_ERR_BAD_ARG; + } + +#define TRY(write_result) \ + do { \ + if (!(write_result)) { \ + return SERD_ERR_UNKNOWN; \ + } \ + } while (0) + + if (writer->syntax == SERD_NTRIPLES || writer->syntax == SERD_NQUADS) { + TRY(write_node(writer, subject, NULL, NULL, FIELD_SUBJECT, flags)); + sink(" ", 1, writer); + TRY(write_node(writer, predicate, NULL, NULL, FIELD_PREDICATE, flags)); + sink(" ", 1, writer); + TRY(write_node(writer, object, datatype, lang, FIELD_OBJECT, flags)); + if (writer->syntax == SERD_NQUADS && graph) { + sink(" ", 1, writer); + TRY(write_node(writer, graph, datatype, lang, FIELD_GRAPH, flags)); + } + sink(" .\n", 3, writer); + return SERD_SUCCESS; + } + + if ((graph && !serd_node_equals(graph, &writer->context.graph)) || + (!graph && writer->context.graph.type)) { + writer->indent = 0; + + if (writer->context.subject.type) { + write_sep(writer, SEP_END_S); + } + + if (writer->context.graph.type) { + write_sep(writer, SEP_GRAPH_END); + } + + reset_context(writer, true); + if (graph) { + TRY(write_node(writer, graph, datatype, lang, FIELD_GRAPH, flags)); + ++writer->indent; + write_sep(writer, SEP_GRAPH_BEGIN); + copy_node(&writer->context.graph, graph); + } + } + + if ((flags & SERD_LIST_CONT)) { + if (write_list_obj(writer, flags, predicate, object, datatype, lang)) { + // Reached end of list + if (--writer->list_depth == 0 && writer->list_subj.type) { + reset_context(writer, false); + serd_node_free(&writer->context.subject); + writer->context.subject = writer->list_subj; + writer->list_subj = SERD_NODE_NULL; + } + return SERD_SUCCESS; + } + } else if (serd_node_equals(subject, &writer->context.subject)) { + if (serd_node_equals(predicate, &writer->context.predicate)) { + // Abbreviate S P + if (!(flags & SERD_ANON_O_BEGIN)) { + ++writer->indent; + } + write_sep(writer, SEP_END_O); + write_node(writer, object, datatype, lang, FIELD_OBJECT, flags); + if (!(flags & SERD_ANON_O_BEGIN)) { + --writer->indent; + } + } else { + // Abbreviate S + Sep sep = writer->context.predicate.type ? SEP_END_P : SEP_S_P; + write_sep(writer, sep); + write_pred(writer, flags, predicate); + write_node(writer, object, datatype, lang, FIELD_OBJECT, flags); + } + } else { + // No abbreviation + if (writer->context.subject.type) { + assert(writer->indent > 0); + --writer->indent; + if (serd_stack_is_empty(&writer->anon_stack)) { + write_sep(writer, SEP_END_S); + } + } else if (!writer->empty) { + write_sep(writer, SEP_S_P); + } + + if (!(flags & SERD_ANON_CONT)) { + write_node(writer, subject, NULL, NULL, FIELD_SUBJECT, flags); + ++writer->indent; + write_sep(writer, SEP_S_P); + } else { + ++writer->indent; + } + + reset_context(writer, false); + copy_node(&writer->context.subject, subject); + + if (!(flags & SERD_LIST_S_BEGIN)) { + write_pred(writer, flags, predicate); + } + + write_node(writer, object, datatype, lang, FIELD_OBJECT, flags); + } + + if (flags & (SERD_ANON_S_BEGIN | SERD_ANON_O_BEGIN)) { + WriteContext* ctx = + (WriteContext*)serd_stack_push(&writer->anon_stack, sizeof(WriteContext)); + *ctx = writer->context; + WriteContext new_context = { + serd_node_copy(graph), serd_node_copy(subject), SERD_NODE_NULL}; + if ((flags & SERD_ANON_S_BEGIN)) { + new_context.predicate = serd_node_copy(predicate); + } + writer->context = new_context; + } else { + copy_node(&writer->context.graph, graph); + copy_node(&writer->context.subject, subject); + copy_node(&writer->context.predicate, predicate); + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_writer_end_anon(SerdWriter* writer, const SerdNode* node) +{ + if (writer->syntax == SERD_NTRIPLES || writer->syntax == SERD_NQUADS) { + return SERD_SUCCESS; + } + + if (serd_stack_is_empty(&writer->anon_stack) || writer->indent == 0) { + w_err(writer, SERD_ERR_UNKNOWN, "unexpected end of anonymous node\n"); + return SERD_ERR_UNKNOWN; + } + + --writer->indent; + write_sep(writer, SEP_ANON_END); + free_context(writer); + writer->context = *anon_stack_top(writer); + serd_stack_pop(&writer->anon_stack, sizeof(WriteContext)); + const bool is_subject = serd_node_equals(node, &writer->context.subject); + if (is_subject) { + copy_node(&writer->context.subject, node); + writer->context.predicate.type = SERD_NOTHING; + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_writer_finish(SerdWriter* writer) +{ + if (writer->context.subject.type) { + write_sep(writer, SEP_END_S); + } + + if (writer->context.graph.type) { + write_sep(writer, SEP_GRAPH_END); + } + + serd_byte_sink_flush(&writer->byte_sink); + writer->indent = 0; + return free_context(writer); +} + +SerdWriter* +serd_writer_new(SerdSyntax syntax, + SerdStyle style, + SerdEnv* env, + const SerdURI* base_uri, + SerdSink ssink, + void* stream) +{ + const WriteContext context = WRITE_CONTEXT_NULL; + SerdWriter* writer = (SerdWriter*)calloc(1, sizeof(SerdWriter)); + + writer->syntax = syntax; + writer->style = style; + writer->env = env; + writer->root_node = SERD_NODE_NULL; + writer->root_uri = SERD_URI_NULL; + writer->base_uri = base_uri ? *base_uri : SERD_URI_NULL; + writer->anon_stack = serd_stack_new(4 * sizeof(WriteContext)); + writer->context = context; + writer->list_subj = SERD_NODE_NULL; + writer->empty = true; + writer->byte_sink = serd_byte_sink_new( + ssink, stream, (style & SERD_STYLE_BULK) ? SERD_PAGE_SIZE : 1); + + return writer; +} + +void +serd_writer_set_error_sink(SerdWriter* writer, + SerdErrorSink error_sink, + void* error_handle) +{ + writer->error_sink = error_sink; + writer->error_handle = error_handle; +} + +void +serd_writer_chop_blank_prefix(SerdWriter* writer, const uint8_t* prefix) +{ + free(writer->bprefix); + writer->bprefix_len = 0; + writer->bprefix = NULL; + + const size_t prefix_len = prefix ? strlen((const char*)prefix) : 0; + if (prefix_len) { + writer->bprefix_len = prefix_len; + writer->bprefix = (uint8_t*)malloc(writer->bprefix_len + 1); + memcpy(writer->bprefix, prefix, writer->bprefix_len + 1); + } +} + +SerdStatus +serd_writer_set_base_uri(SerdWriter* writer, const SerdNode* uri) +{ + if (!serd_env_set_base_uri(writer->env, uri)) { + serd_env_get_base_uri(writer->env, &writer->base_uri); + + if (writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG) { + if (writer->context.graph.type || writer->context.subject.type) { + sink(" .\n\n", 4, writer); + reset_context(writer, true); + } + sink("@base <", 7, writer); + sink(uri->buf, uri->n_bytes, writer); + sink("> .\n", 4, writer); + } + writer->indent = 0; + return reset_context(writer, true); + } + + return SERD_ERR_UNKNOWN; +} + +SerdStatus +serd_writer_set_root_uri(SerdWriter* writer, const SerdNode* uri) +{ + serd_node_free(&writer->root_node); + + if (uri && uri->buf) { + writer->root_node = serd_node_copy(uri); + serd_uri_parse(uri->buf, &writer->root_uri); + } else { + writer->root_node = SERD_NODE_NULL; + writer->root_uri = SERD_URI_NULL; + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_writer_set_prefix(SerdWriter* writer, + const SerdNode* name, + const SerdNode* uri) +{ + if (!serd_env_set_prefix(writer->env, name, uri)) { + if (writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG) { + if (writer->context.graph.type || writer->context.subject.type) { + sink(" .\n\n", 4, writer); + reset_context(writer, true); + } + sink("@prefix ", 8, writer); + sink(name->buf, name->n_bytes, writer); + sink(": <", 3, writer); + write_uri(writer, uri->buf, uri->n_bytes); + sink("> .\n", 4, writer); + } + writer->indent = 0; + return reset_context(writer, true); + } + + return SERD_ERR_UNKNOWN; +} + +void +serd_writer_free(SerdWriter* writer) +{ + if (!writer) { + return; + } + + serd_writer_finish(writer); + serd_stack_free(&writer->anon_stack); + free(writer->bprefix); + serd_byte_sink_free(&writer->byte_sink); + serd_node_free(&writer->root_node); + free(writer); +} + +SerdEnv* +serd_writer_get_env(SerdWriter* writer) +{ + return writer->env; +} + +size_t +serd_file_sink(const void* buf, size_t len, void* stream) +{ + return fwrite(buf, 1, len, (FILE*)stream); +} + +size_t +serd_chunk_sink(const void* buf, size_t len, void* stream) +{ + SerdChunk* chunk = (SerdChunk*)stream; + chunk->buf = (uint8_t*)realloc((uint8_t*)chunk->buf, chunk->len + len); + memcpy((uint8_t*)chunk->buf + chunk->len, buf, len); + chunk->len += len; + return len; +} + +uint8_t* +serd_chunk_sink_finish(SerdChunk* stream) +{ + serd_chunk_sink("", 1, stream); + return (uint8_t*)stream->buf; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,33 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +/* + Instead of providing a config header per lv2-related library, we put all + of the config in a single file, which is included below. +*/ + +#pragma once + +#include "juce_lv2_config.h" diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/COPYING juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/COPYING --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/COPYING 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,13 @@ +Copyright 2011-2021 David Robillard + +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. \ No newline at end of file diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,642 @@ +/* + Copyright 2011-2016 David Robillard + + 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 sord.h API for Sord, a lightweight RDF model library. +*/ + +#ifndef SORD_SORD_H +#define SORD_SORD_H + +#include "serd/serd.h" + +#include +#include +#include + +#if defined(_WIN32) && !defined(SORD_STATIC) && defined(SORD_INTERNAL) +# define SORD_API __declspec(dllexport) +#elif defined(_WIN32) && !defined(SORD_STATIC) +# define SORD_API __declspec(dllimport) +#elif defined(__GNUC__) +# define SORD_API __attribute__((visibility("default"))) +#else +# define SORD_API +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @defgroup sord Sord + A lightweight RDF model library. + + Sord stores RDF (subject object predicate context) quads, where the context + may be omitted (to represent triples in the default graph). + @{ +*/ + +/** + Sord World. + The World represents all library state, including interned strings. +*/ +typedef struct SordWorldImpl SordWorld; + +/** + Sord Model. + + A model is an indexed set of Quads (i.e. it can contain several RDF + graphs). It may be searched using various patterns depending on which + indices are enabled. +*/ +typedef struct SordModelImpl SordModel; + +/** + Model Inserter. + + An inserter is used for writing statements to a model using the Serd sink + interface. This makes it simple to write to a model directly using a + SerdReader, or any other code that writes statements to a SerdStatementSink. +*/ +typedef struct SordInserterImpl SordInserter; + +/** + Model Iterator. +*/ +typedef struct SordIterImpl SordIter; + +/** + RDF Node. + A Node is a component of a Quad. Nodes may be URIs, blank nodes, or + (in the case of quad objects only) string literals. Literal nodes may + have an associate language or datatype (but not both). +*/ +typedef struct SordNodeImpl SordNode; + +/** + Quad of nodes (a statement), or a quad pattern. + + Nodes are ordered (S P O G). The ID of the default graph is 0. +*/ +typedef const SordNode* SordQuad[4]; + +/** + Index into a SordQuad. +*/ +typedef enum { + SORD_SUBJECT = 0, /**< Subject */ + SORD_PREDICATE = 1, /**< Predicate ("key") */ + SORD_OBJECT = 2, /**< Object ("value") */ + SORD_GRAPH = 3 /**< Graph ("context") */ +} SordQuadIndex; + +/** + Type of a node. +*/ +typedef enum { + SORD_URI = 1, /**< URI */ + SORD_BLANK = 2, /**< Blank node identifier */ + SORD_LITERAL = 3 /**< Literal (string with optional lang or datatype) */ +} SordNodeType; + +/** + Indexing option. +*/ +typedef enum { + SORD_SPO = 1, /**< Subject, Predicate, Object */ + SORD_SOP = 1 << 1, /**< Subject, Object, Predicate */ + SORD_OPS = 1 << 2, /**< Object, Predicate, Subject */ + SORD_OSP = 1 << 3, /**< Object, Subject, Predicate */ + SORD_PSO = 1 << 4, /**< Predicate, Subject, Object */ + SORD_POS = 1 << 5 /**< Predicate, Object, Subject */ +} SordIndexOption; + +/** + @name World + @{ +*/ + +/** + Create a new Sord World. + It is safe to use multiple worlds in one process, though no data + (e.g. nodes) can be shared between worlds, and this should be avoided if + possible for performance reasons. +*/ +SORD_API +SordWorld* +sord_world_new(void); + +/** + Free `world`. +*/ +SORD_API +void +sord_world_free(SordWorld* world); + +/** + Set a function to be called when errors occur. + + The `error_sink` will be called with `handle` as its first argument. If + no error function is set, errors are printed to stderr. +*/ +SORD_API +void +sord_world_set_error_sink(SordWorld* world, + SerdErrorSink error_sink, + void* handle); + +/** + @} + @name Node + @{ +*/ + +/** + Get a URI node from a string. + + Note this function measures `str`, which is a common bottleneck. + Use sord_node_from_serd_node() instead if `str` is already measured. +*/ +SORD_API +SordNode* +sord_new_uri(SordWorld* world, const uint8_t* uri); + +/** + Get a URI node from a relative URI string. +*/ +SORD_API +SordNode* +sord_new_relative_uri(SordWorld* world, + const uint8_t* uri, + const uint8_t* base_uri); + +/** + Get a blank node from a string. + + Note this function measures `str`, which is a common bottleneck. + Use sord_node_from_serd_node() instead if `str` is already measured. +*/ +SORD_API +SordNode* +sord_new_blank(SordWorld* world, const uint8_t* str); + +/** + Get a literal node from a string. + + Note this function measures `str`, which is a common bottleneck. + Use sord_node_from_serd_node() instead if `str` is already measured. +*/ +SORD_API +SordNode* +sord_new_literal(SordWorld* world, + SordNode* datatype, + const uint8_t* str, + const char* lang); + +/** + Copy a node (obtain a reference). + + Node that since nodes are interned and reference counted, this does not + actually create a deep copy of `node`. +*/ +SORD_API +SordNode* +sord_node_copy(const SordNode* node); + +/** + Free a node (drop a reference). +*/ +SORD_API +void +sord_node_free(SordWorld* world, SordNode* node); + +/** + Return the type of a node (SORD_URI, SORD_BLANK, or SORD_LITERAL). +*/ +SORD_API +SordNodeType +sord_node_get_type(const SordNode* node); + +/** + Return the string value of a node. +*/ +SORD_API +const uint8_t* +sord_node_get_string(const SordNode* node); + +/** + Return the string value of a node, and set `bytes` to its length in bytes. +*/ +SORD_API +const uint8_t* +sord_node_get_string_counted(const SordNode* node, size_t* bytes); + +/** + Return the string value of a node, and set `bytes` to its length in bytes, + and `count` to its length in characters. +*/ +SORD_API +const uint8_t* +sord_node_get_string_measured(const SordNode* node, + size_t* bytes, + size_t* chars); + +/** + Return the language of a literal node (or NULL). +*/ +SORD_API +const char* +sord_node_get_language(const SordNode* node); + +/** + Return the datatype URI of a literal node (or NULL). +*/ +SORD_API +SordNode* +sord_node_get_datatype(const SordNode* node); + +/** + Return the flags (string attributes) of a node. +*/ +SORD_API +SerdNodeFlags +sord_node_get_flags(const SordNode* node); + +/** + Return true iff node can be serialised as an inline object. + + More specifically, this returns true iff the node is the object field + of exactly one statement, and therefore can be inlined since it needn't + be referred to by name. +*/ +SORD_API +bool +sord_node_is_inline_object(const SordNode* node); + +/** + Return true iff `a` is equal to `b`. + + Note this is much faster than comparing the node's strings. +*/ +SORD_API +bool +sord_node_equals(const SordNode* a, const SordNode* b); + +/** + Return a SordNode as a SerdNode. + + The returned node is shared and must not be freed or modified. +*/ +SORD_API +const SerdNode* +sord_node_to_serd_node(const SordNode* node); + +/** + Create a new SordNode from a SerdNode. + + The returned node must be freed using sord_node_free(). +*/ +SORD_API +SordNode* +sord_node_from_serd_node(SordWorld* world, + SerdEnv* env, + const SerdNode* node, + const SerdNode* datatype, + const SerdNode* lang); + +/** + @} + @name Model + @{ +*/ + +/** + Create a new model. + + @param world The world in which to make this model. + + @param indices SordIndexOption flags (e.g. SORD_SPO|SORD_OPS). Be sure to + enable an index where the most significant node(s) are not variables in your + queries (e.g. to make (? P O) queries, enable either SORD_OPS or SORD_POS). + + @param graphs If true, store (and index) graph contexts. +*/ +SORD_API +SordModel* +sord_new(SordWorld* world, unsigned indices, bool graphs); + +/** + Close and free `model`. +*/ +SORD_API +void +sord_free(SordModel* model); + +/** + Get the world associated with `model`. +*/ +SORD_API +SordWorld* +sord_get_world(SordModel* model); + +/** + Return the number of nodes stored in `world`. + + Nodes are included in this count iff they are a part of a quad in `world`. +*/ +SORD_API +size_t +sord_num_nodes(const SordWorld* world); + +/** + Return the number of quads stored in `model`. +*/ +SORD_API +size_t +sord_num_quads(const SordModel* model); + +/** + Return an iterator to the start of `model`. +*/ +SORD_API +SordIter* +sord_begin(const SordModel* model); + +/** + Search for statements by a quad pattern. + @return an iterator to the first match, or NULL if no matches found. +*/ +SORD_API +SordIter* +sord_find(SordModel* model, const SordQuad pat); + +/** + Search for statements by nodes. + @return an iterator to the first match, or NULL if no matches found. +*/ +SORD_API +SordIter* +sord_search(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g); +/** + Search for a single node that matches a pattern. + Exactly one of `s`, `p`, `o` must be NULL. + This function is mainly useful for predicates that only have one value. + The returned node must be freed using sord_node_free(). + @return the first matching node, or NULL if no matches are found. +*/ +SORD_API +SordNode* +sord_get(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g); + +/** + Return true iff a statement exists. +*/ +SORD_API +bool +sord_ask(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g); + +/** + Return the number of matching statements. +*/ +SORD_API +uint64_t +sord_count(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g); + +/** + Check if `model` contains a triple pattern. + + @return true if `model` contains a match for `pat`, otherwise false. +*/ +SORD_API +bool +sord_contains(SordModel* model, const SordQuad pat); + +/** + Add a quad to a model. + + Calling this function invalidates all iterators on `model`. + + @return true on success, false, on error. +*/ +SORD_API +bool +sord_add(SordModel* model, const SordQuad tup); + +/** + Remove a quad from a model. + + Calling this function invalidates all iterators on `model`. To remove quads + while iterating, use sord_erase() instead. +*/ +SORD_API +void +sord_remove(SordModel* model, const SordQuad tup); + +/** + Remove a quad from a model via an iterator. + + Calling this function invalidates all iterators on `model` except `iter`. + + @param model The model which `iter` points to. + @param iter Iterator to the element to erase, which is incremented to the + next value on return. +*/ +SORD_API +SerdStatus +sord_erase(SordModel* model, SordIter* iter); + +/** + @} + @name Inserter + @{ +*/ + +/** + Create an inserter for writing statements to a model. +*/ +SORD_API +SordInserter* +sord_inserter_new(SordModel* model, SerdEnv* env); + +/** + Free an inserter. +*/ +SORD_API +void +sord_inserter_free(SordInserter* inserter); + +/** + Set the current base URI for writing to the model. + + Note this function can be safely casted to SerdBaseSink. +*/ +SORD_API +SerdStatus +sord_inserter_set_base_uri(SordInserter* inserter, const SerdNode* uri); + +/** + Set a namespace prefix for writing to the model. + + Note this function can be safely casted to SerdPrefixSink. +*/ +SORD_API +SerdStatus +sord_inserter_set_prefix(SordInserter* inserter, + const SerdNode* name, + const SerdNode* uri); + +/** + Write a statement to the model. + + Note this function can be safely casted to SerdStatementSink. +*/ +SORD_API +SerdStatus +sord_inserter_write_statement(SordInserter* inserter, + SerdStatementFlags flags, + const SerdNode* graph, + const SerdNode* subject, + const SerdNode* predicate, + const SerdNode* object, + const SerdNode* object_datatype, + const SerdNode* object_lang); + +/** + @} + @name Iteration + @{ +*/ + +/** + Set `quad` to the quad pointed to by `iter`. +*/ +SORD_API +void +sord_iter_get(const SordIter* iter, SordQuad tup); + +/** + Return a field of the quad pointed to by `iter`. + + Returns NULL if `iter` is NULL or is at the end. +*/ +SORD_API +const SordNode* +sord_iter_get_node(const SordIter* iter, SordQuadIndex index); + +/** + Return the store pointed to by `iter`. +*/ +SORD_API +const SordModel* +sord_iter_get_model(SordIter* iter); + +/** + Increment `iter` to point to the next statement. +*/ +SORD_API +bool +sord_iter_next(SordIter* iter); + +/** + Return true iff `iter` is at the end of its range. +*/ +SORD_API +bool +sord_iter_end(const SordIter* iter); + +/** + Free `iter`. +*/ +SORD_API +void +sord_iter_free(SordIter* iter); + +/** + @} + @name Utilities + @{ +*/ + +/** + Match two quads (using ID comparison only). + + This function is a straightforward and fast equivalence match with wildcard + support (ID 0 is a wildcard). It does not actually read node data. + @return true iff `x` and `y` match. +*/ +SORD_API +bool +sord_quad_match(const SordQuad x, const SordQuad y); + +/** + @} + @name Serialisation + @{ +*/ + +/** + Return a reader that will read into `model`. +*/ +SORD_API +SerdReader* +sord_new_reader(SordModel* model, + SerdEnv* env, + SerdSyntax syntax, + SordNode* graph); + +/** + Write a model to a writer. +*/ +SORD_API +bool +sord_write(SordModel* model, SerdWriter* writer, SordNode* graph); + +/** + Write a range to a writer. + + This increments `iter` to its end, then frees it. +*/ +SORD_API +bool +sord_write_iter(SordIter* iter, SerdWriter* writer); + +/** + @} + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* SORD_SORD_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,720 @@ +/* + Copyright 2011-2013 David Robillard + + 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 sordmm.hpp + Public Sord C++ API. +*/ + +#ifndef SORD_SORDMM_HPP +#define SORD_SORDMM_HPP + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#endif + +#include "serd/serd.h" +#include "sord/sord.h" + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SORD_NS_XSD "http://www.w3.org/2001/XMLSchema#" + +namespace Sord { + +/** Utility base class to prevent copying or moving. */ +class Noncopyable +{ +public: + Noncopyable() = default; + ~Noncopyable() = default; + + Noncopyable(const Noncopyable&) = delete; + const Noncopyable& operator=(const Noncopyable&) = delete; + + Noncopyable(Noncopyable&&) = delete; + Noncopyable& operator=(Noncopyable&&) = delete; +}; + +/** C++ wrapper for a Sord object. */ +template +class Wrapper +{ +public: + inline Wrapper(T* c_obj = nullptr) + : _c_obj(c_obj) + {} + + inline T* c_obj() { return _c_obj; } + inline const T* c_obj() const { return _c_obj; } + +protected: + T* _c_obj; +}; + +/** Collection of RDF namespaces with prefixes. */ +class Namespaces : public Wrapper +{ +public: + Namespaces() + : Wrapper(serd_env_new(nullptr)) + {} + + ~Namespaces() { serd_env_free(_c_obj); } + + static inline SerdNode string_to_node(SerdType type, const std::string& s) + { + SerdNode ret = {reinterpret_cast(s.c_str()), + s.length(), + s.length(), + 0, + type}; + return ret; + } + + inline void add(const std::string& name, const std::string& uri) + { + const SerdNode name_node = string_to_node(SERD_LITERAL, name); + const SerdNode uri_node = string_to_node(SERD_URI, uri); + serd_env_set_prefix(_c_obj, &name_node, &uri_node); + } + + inline std::string qualify(std::string uri) const + { + const SerdNode uri_node = string_to_node(SERD_URI, uri); + SerdNode prefix; + SerdChunk suffix; + if (serd_env_qualify(_c_obj, &uri_node, &prefix, &suffix)) { + std::string ret(reinterpret_cast(prefix.buf), + prefix.n_bytes); + ret.append(":").append(reinterpret_cast(suffix.buf), + suffix.len); + return ret; + } + return uri; + } + + inline std::string expand(const std::string& curie) const + { + assert(curie.find(':') != std::string::npos); + SerdNode curie_node = string_to_node(SERD_CURIE, curie); + SerdChunk uri_prefix; + SerdChunk uri_suffix; + if (!serd_env_expand(_c_obj, &curie_node, &uri_prefix, &uri_suffix)) { + std::string ret(reinterpret_cast(uri_prefix.buf), + uri_prefix.len); + ret.append(reinterpret_cast(uri_suffix.buf), uri_suffix.len); + return ret; + } + std::cerr << "CURIE `" << curie << "' has unknown prefix." << std::endl; + return curie; + } +}; + +/** Sord library state. */ +class World + : public Noncopyable + , public Wrapper +{ +public: + inline World() + : _next_blank_id(0) + { + _c_obj = sord_world_new(); + } + + inline ~World() { sord_world_free(_c_obj); } + + inline uint64_t blank_id() { return _next_blank_id++; } + + inline void add_prefix(const std::string& prefix, const std::string& uri) + { + _prefixes.add(prefix, uri); + } + + inline const Namespaces& prefixes() const { return _prefixes; } + inline Namespaces& prefixes() { return _prefixes; } + inline SordWorld* world() { return _c_obj; } + +private: + Namespaces _prefixes; + std::set _blank_ids; + uint64_t _next_blank_id; +}; + +/** An RDF Node (resource, literal, etc) + */ +class Node : public Wrapper +{ +public: + enum Type { + UNKNOWN = 0, + URI = SORD_URI, + BLANK = SORD_BLANK, + LITERAL = SORD_LITERAL + }; + + inline Node() + : Wrapper(nullptr) + , _world(nullptr) + {} + + inline Node(World& world, Type t, const std::string& s); + inline Node(World& world); + inline Node(World& world, const SordNode* node); + inline Node(World& world, SordNode* node, bool copy = false); + inline Node(const Node& other); + inline ~Node(); + + inline Type type() const + { + return _c_obj ? static_cast(sord_node_get_type(_c_obj)) : UNKNOWN; + } + + inline const SordNode* get_node() const { return _c_obj; } + inline SordNode* get_node() { return _c_obj; } + + const SerdNode* to_serd_node() const + { + return sord_node_to_serd_node(_c_obj); + } + + inline bool is_valid() const { return type() != UNKNOWN; } + + inline bool operator<(const Node& other) const + { + if (type() != other.type()) { + return type() < other.type(); + } else { + return to_string() < other.to_string(); + } + } + + Node& operator=(const Node& other) + { + if (&other != this) { + if (_c_obj) { + sord_node_free(_world->c_obj(), _c_obj); + } + _world = other._world; + _c_obj = other._c_obj ? sord_node_copy(other._c_obj) : nullptr; + } + return *this; + } + + inline bool operator==(const Node& other) const + { + return sord_node_equals(_c_obj, other._c_obj); + } + + inline const uint8_t* to_u_string() const; + inline const char* to_c_string() const; + inline std::string to_string() const; + + inline bool is_literal_type(const char* type_uri) const; + + inline bool is_uri() const { return _c_obj && type() == URI; } + inline bool is_blank() const { return _c_obj && type() == BLANK; } + inline bool is_int() const { return is_literal_type(SORD_NS_XSD "integer"); } + inline bool is_float() const + { + return is_literal_type(SORD_NS_XSD "decimal"); + } + inline bool is_bool() const { return is_literal_type(SORD_NS_XSD "boolean"); } + + inline int to_int() const; + inline float to_float() const; + inline bool to_bool() const; + + inline static Node blank_id(World& world, const std::string& base = "b") + { + const uint64_t num = world.blank_id(); + std::ostringstream ss; + ss << base << num; + return Node(world, Node::BLANK, ss.str()); + } + +private: + World* _world; +}; + +inline std::ostream& +operator<<(std::ostream& os, const Node& node) +{ + return os << node.to_string(); +} + +class URI : public Node +{ +public: + inline URI(World& world, const std::string& s) + : Node(world, Node::URI, s) + {} + + inline URI(World& world, const std::string& s, const std::string& base) + : Node( + world, + sord_new_relative_uri(world.world(), + reinterpret_cast(s.c_str()), + reinterpret_cast(base.c_str()))) + {} +}; + +class Curie : public Node +{ +public: + inline Curie(World& world, const std::string& s) + : Node(world, Node::URI, world.prefixes().expand(s)) + {} +}; + +class Literal : public Node +{ +public: + inline Literal(World& world, const std::string& s) + : Node(world, Node::LITERAL, s) + {} + + static inline Node decimal(World& world, double d, unsigned frac_digits) + { + const SerdNode val = serd_node_new_decimal(d, frac_digits); + const SerdNode type = serd_node_from_string( + SERD_URI, reinterpret_cast(SORD_NS_XSD "decimal")); + + return Node( + world, + sord_node_from_serd_node( + world.c_obj(), world.prefixes().c_obj(), &val, &type, nullptr), + false); + } + + static inline Node integer(World& world, int64_t i) + { + const SerdNode val = serd_node_new_integer(i); + const SerdNode type = serd_node_from_string( + SERD_URI, reinterpret_cast(SORD_NS_XSD "integer")); + + return Node( + world, + sord_node_from_serd_node( + world.c_obj(), world.prefixes().c_obj(), &val, &type, nullptr), + false); + } +}; + +inline Node::Node(World& world, Type type, const std::string& s) + : _world(&world) +{ + switch (type) { + case URI: + _c_obj = sord_new_uri(world.world(), + reinterpret_cast(s.c_str())); + break; + case LITERAL: + _c_obj = sord_new_literal(world.world(), + nullptr, + reinterpret_cast(s.c_str()), + nullptr); + break; + case BLANK: + _c_obj = sord_new_blank(world.world(), + reinterpret_cast(s.c_str())); + break; + default: + _c_obj = nullptr; + } + + assert(this->type() == type); +} + +inline Node::Node(World& world) + : _world(&world) +{ + Node me = blank_id(world); + *this = me; +} + +inline Node::Node(World& world, const SordNode* node) + : _world(&world) +{ + _c_obj = sord_node_copy(node); +} + +inline Node::Node(World& world, SordNode* node, bool copy) + : _world(&world) +{ + _c_obj = copy ? sord_node_copy(node) : node; +} + +inline Node::Node(const Node& other) // NOLINT(bugprone-copy-constructor-init) + : Wrapper() + , _world(other._world) +{ + if (_world) { + _c_obj = other._c_obj ? sord_node_copy(other._c_obj) : nullptr; + } + + assert((!_c_obj && !other._c_obj) || to_string() == other.to_string()); +} + +inline Node::~Node() +{ + if (_world) { + sord_node_free(_world->c_obj(), _c_obj); + } +} + +inline std::string +Node::to_string() const +{ + return _c_obj ? reinterpret_cast(sord_node_get_string(_c_obj)) + : ""; +} + +inline const char* +Node::to_c_string() const +{ + return reinterpret_cast(sord_node_get_string(_c_obj)); +} + +inline const uint8_t* +Node::to_u_string() const +{ + return sord_node_get_string(_c_obj); +} + +inline bool +Node::is_literal_type(const char* type_uri) const +{ + if (_c_obj && sord_node_get_type(_c_obj) == SORD_LITERAL) { + const SordNode* datatype = sord_node_get_datatype(_c_obj); + if (datatype && + !strcmp(reinterpret_cast(sord_node_get_string(datatype)), + type_uri)) { + return true; + } + } + return false; +} + +inline int +Node::to_int() const +{ + assert(is_int()); + char* endptr = nullptr; + return strtol( + reinterpret_cast(sord_node_get_string(_c_obj)), &endptr, 10); +} + +inline float +Node::to_float() const +{ + assert(is_float()); + return serd_strtod( + reinterpret_cast(sord_node_get_string(_c_obj)), nullptr); +} + +inline bool +Node::to_bool() const +{ + assert(is_bool()); + return !strcmp(reinterpret_cast(sord_node_get_string(_c_obj)), + "true"); +} + +struct Iter : public Wrapper { + inline Iter(World& world, SordIter* c_obj) + : Wrapper(c_obj) + , _world(world) + {} + + Iter(const Iter&) = delete; + Iter& operator=(const Iter&) = delete; + + inline Iter(Iter&& iter) noexcept + : Wrapper(iter) + , _world(iter._world) + {} + + inline ~Iter() { sord_iter_free(_c_obj); } + + inline bool end() const { return sord_iter_end(_c_obj); } + inline bool next() const { return sord_iter_next(_c_obj); } + inline Iter& operator++() + { + assert(!end()); + next(); + return *this; + } + inline Node get_subject() const + { + SordQuad quad; + sord_iter_get(_c_obj, quad); + return Node(_world, quad[SORD_SUBJECT]); + } + inline Node get_predicate() const + { + SordQuad quad; + sord_iter_get(_c_obj, quad); + return Node(_world, quad[SORD_PREDICATE]); + } + inline Node get_object() const + { + SordQuad quad; + sord_iter_get(_c_obj, quad); + return Node(_world, quad[SORD_OBJECT]); + } + World& _world; +}; + +/** An RDF Model (collection of triples). + */ +class Model + : public Noncopyable + , public Wrapper +{ +public: + inline Model(World& world, + const std::string& base_uri, + unsigned indices = (SORD_SPO | SORD_OPS), + bool graphs = true); + + inline ~Model(); + + inline const Node& base_uri() const { return _base; } + + size_t num_quads() const { return sord_num_quads(_c_obj); } + + inline void load_file(SerdEnv* env, + SerdSyntax syntax, + const std::string& uri, + const std::string& base_uri = ""); + + inline void load_string(SerdEnv* env, + SerdSyntax syntax, + const char* str, + size_t len, + const std::string& base_uri); + + inline SerdStatus write_to_file(const std::string& uri, + SerdSyntax syntax = SERD_TURTLE, + SerdStyle style = static_cast( + SERD_STYLE_ABBREVIATED | SERD_STYLE_CURIED | + SERD_STYLE_RESOLVED)); + + inline std::string write_to_string( + const std::string& base_uri, + SerdSyntax syntax = SERD_TURTLE, + SerdStyle style = static_cast(SERD_STYLE_ABBREVIATED | + SERD_STYLE_CURIED | + SERD_STYLE_RESOLVED)); + + inline void add_statement(const Node& subject, + const Node& predicate, + const Node& object); + + inline Iter find(const Node& subject, + const Node& predicate, + const Node& object); + + inline Node get(const Node& subject, + const Node& predicate, + const Node& object); + + inline World& world() const { return _world; } + +private: + World& _world; + Node _base; +}; + +/** Create an empty in-memory RDF model. + */ +inline Model::Model(World& world, + const std::string& base_uri, + unsigned indices, + bool graphs) + : _world(world) + , _base(world, Node::URI, base_uri) +{ + _c_obj = sord_new(_world.world(), indices, graphs); +} + +inline void +Model::load_string(SerdEnv* env, + SerdSyntax syntax, + const char* str, + size_t /*len*/, + const std::string& /*base_uri*/) +{ + SerdReader* reader = sord_new_reader(_c_obj, env, syntax, nullptr); + serd_reader_read_string(reader, reinterpret_cast(str)); + serd_reader_free(reader); +} + +inline Model::~Model() +{ + sord_free(_c_obj); +} + +inline void +Model::load_file(SerdEnv* env, + SerdSyntax syntax, + const std::string& data_uri, + const std::string& /*base_uri*/) +{ + uint8_t* path = serd_file_uri_parse( + reinterpret_cast(data_uri.c_str()), nullptr); + if (!path) { + fprintf(stderr, "Failed to parse file URI <%s>\n", data_uri.c_str()); + return; + } + + // FIXME: blank prefix parameter? + SerdReader* reader = sord_new_reader(_c_obj, env, syntax, nullptr); + serd_reader_read_file(reader, path); + serd_reader_free(reader); + serd_free(path); +} + +inline SerdStatus +Model::write_to_file(const std::string& uri, SerdSyntax syntax, SerdStyle style) +{ + uint8_t* path = + serd_file_uri_parse(reinterpret_cast(uri.c_str()), nullptr); + if (!path) { + fprintf(stderr, "Failed to parse file URI <%s>\n", uri.c_str()); + return SERD_ERR_BAD_ARG; + } + + FILE* const fd = fopen(reinterpret_cast(path), "w"); + if (!fd) { + fprintf(stderr, "Failed to open file %s\n", path); + serd_free(path); + return SERD_ERR_UNKNOWN; + } + serd_free(path); + + SerdURI base_uri = SERD_URI_NULL; + if (serd_uri_parse(reinterpret_cast(uri.c_str()), + &base_uri)) { + fprintf(stderr, "Invalid base URI <%s>\n", uri.c_str()); + fclose(fd); + return SERD_ERR_BAD_ARG; + } + + SerdWriter* writer = serd_writer_new( + syntax, style, _world.prefixes().c_obj(), &base_uri, serd_file_sink, fd); + + serd_env_foreach(_world.prefixes().c_obj(), + reinterpret_cast(serd_writer_set_prefix), + writer); + + sord_write(_c_obj, writer, nullptr); + serd_writer_free(writer); + fclose(fd); + + return SERD_SUCCESS; +} + +extern "C" { + +static size_t +string_sink(const void* buf, size_t len, void* stream) +{ + try { + auto* str = static_cast(stream); + str->append(static_cast(buf), len); + return len; + } catch (...) { + return 0; + } +} +} + +inline std::string +Model::write_to_string(const std::string& base_uri_str, + SerdSyntax syntax, + SerdStyle style) +{ + SerdURI base_uri = SERD_URI_NULL; + if (serd_uri_parse(reinterpret_cast(base_uri_str.c_str()), + &base_uri)) { + fprintf(stderr, "Invalid base URI <%s>\n", base_uri_str.c_str()); + return ""; + } + + std::string ret; + + SerdWriter* writer = serd_writer_new( + syntax, style, _world.prefixes().c_obj(), &base_uri, string_sink, &ret); + + const SerdNode base_uri_node = serd_node_from_string( + SERD_URI, reinterpret_cast(base_uri_str.c_str())); + serd_writer_set_base_uri(writer, &base_uri_node); + + serd_env_foreach(_world.prefixes().c_obj(), + reinterpret_cast(serd_writer_set_prefix), + writer); + + sord_write(_c_obj, writer, nullptr); + + serd_writer_free(writer); + return ret; +} + +inline void +Model::add_statement(const Node& subject, + const Node& predicate, + const Node& object) +{ + SordQuad quad = {subject.c_obj(), predicate.c_obj(), object.c_obj(), nullptr}; + + sord_add(_c_obj, quad); +} + +inline Iter +Model::find(const Node& subject, const Node& predicate, const Node& object) +{ + SordQuad quad = {subject.c_obj(), predicate.c_obj(), object.c_obj(), nullptr}; + + return Iter(_world, sord_find(_c_obj, quad)); +} + +inline Node +Model::get(const Node& subject, const Node& predicate, const Node& object) +{ + SordNode* c_node = sord_get( + _c_obj, subject.c_obj(), predicate.c_obj(), object.c_obj(), nullptr); + return Node(_world, c_node, false); +} + +} // namespace Sord + +#endif // SORD_SORDMM_HPP diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1368 @@ +/* + Copyright 2011-2016 David Robillard + + 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. +*/ + +#include "sord_config.h" // IWYU pragma: keep +#include "sord_internal.h" + +#include "serd/serd.h" +#include "sord/sord.h" + +#define ZIX_INLINE +#include "zix/btree.c" +#include "zix/btree.h" +#include "zix/common.h" +#include "zix/digest.c" +#include "zix/hash.c" +#include "zix/hash.h" + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# define SORD_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define SORD_LOG_FUNC(fmt, arg1) +#endif + +#define SORD_LOG(prefix, ...) fprintf(stderr, "[Sord::" prefix "] " __VA_ARGS__) + +#ifdef SORD_DEBUG_ITER +# define SORD_ITER_LOG(...) SORD_LOG("iter", __VA_ARGS__) +#else +# define SORD_ITER_LOG(...) +#endif +#ifdef SORD_DEBUG_SEARCH +# define SORD_FIND_LOG(...) SORD_LOG("search", __VA_ARGS__) +#else +# define SORD_FIND_LOG(...) +#endif +#ifdef SORD_DEBUG_WRITE +# define SORD_WRITE_LOG(...) SORD_LOG("write", __VA_ARGS__) +#else +# define SORD_WRITE_LOG(...) +#endif + +#define NUM_ORDERS 12 +#define STATEMENT_LEN 3 +#define TUP_LEN (STATEMENT_LEN + 1) +#define DEFAULT_ORDER SPO +#define DEFAULT_GRAPH_ORDER GSPO + +#define TUP_FMT "(%s %s %s %s)" +#define TUP_FMT_ELEM(e) ((e) ? sord_node_get_string(e) : (const uint8_t*)"*") +#define TUP_FMT_ARGS(t) \ + TUP_FMT_ELEM((t)[0]), TUP_FMT_ELEM((t)[1]), TUP_FMT_ELEM((t)[2]), \ + TUP_FMT_ELEM((t)[3]) + +#define TUP_G 3 + +/** Triple ordering */ +typedef enum { + SPO, ///< Subject, Predicate, Object + SOP, ///< Subject, Object, Predicate + OPS, ///< Object, Predicate, Subject + OSP, ///< Object, Subject, Predicate + PSO, ///< Predicate, Subject, Object + POS, ///< Predicate, Object, Subject + GSPO, ///< Graph, Subject, Predicate, Object + GSOP, ///< Graph, Subject, Object, Predicate + GOPS, ///< Graph, Object, Predicate, Subject + GOSP, ///< Graph, Object, Subject, Predicate + GPSO, ///< Graph, Predicate, Subject, Object + GPOS ///< Graph, Predicate, Object, Subject +} SordOrder; + +#ifdef SORD_DEBUG_SEARCH +/** String name of each ordering (array indexed by SordOrder) */ +static const char* const order_names[NUM_ORDERS] = {"spo", + "sop", + "ops", + "osp", + "pso", + "pos", + "gspo", + "gsop", + "gops", + "gosp", + "gpso", + "gpos"}; +#endif + +/** + Quads of indices for each order, from most to least significant + (array indexed by SordOrder) +*/ +static const int orderings[NUM_ORDERS][TUP_LEN] = { + {0, 1, 2, 3}, // SPO + {0, 2, 1, 3}, // SOP + {2, 1, 0, 3}, // OPS + {2, 0, 1, 3}, // OSP + {1, 0, 2, 3}, // PSO + {1, 2, 0, 3}, // POS + {3, 0, 1, 2}, // GSPO + {3, 0, 2, 1}, // GSOP + {3, 2, 1, 0}, // GOPS + {3, 2, 0, 1}, // GOSP + {3, 1, 0, 2}, // GPSO + {3, 1, 2, 0} // GPOS +}; + +/** World */ +struct SordWorldImpl { + ZixHash* nodes; + SerdErrorSink error_sink; + void* error_handle; +}; + +/** Store */ +struct SordModelImpl { + SordWorld* world; + + /** Index for each possible triple ordering (may or may not exist). + * Each index is a tree of SordQuad with the appropriate ordering. + */ + ZixBTree* indices[NUM_ORDERS]; + + size_t n_quads; + size_t n_iters; +}; + +/** Mode for searching or iteration */ +typedef enum { + ALL, ///< Iterate over entire store + SINGLE, ///< Iteration over a single element (exact search) + RANGE, ///< Iterate over range with equal prefix + FILTER_RANGE, ///< Iterate over range with equal prefix, filtering + FILTER_ALL ///< Iterate to end of store, filtering +} SearchMode; + +/** Iterator over some range of a store */ +struct SordIterImpl { + const SordModel* sord; ///< Model being iterated over + ZixBTreeIter* cur; ///< Current DB cursor + SordQuad pat; ///< Pattern (in ordering order) + SordOrder order; ///< Store order (which index) + SearchMode mode; ///< Iteration mode + int n_prefix; ///< Prefix for RANGE and FILTER_RANGE + bool end; ///< True iff reached end + bool skip_graphs; ///< Iteration should ignore graphs +}; + +static uint32_t +sord_node_hash(const void* n) +{ + const SordNode* node = (const SordNode*)n; + uint32_t hash = zix_digest_start(); + hash = zix_digest_add(hash, node->node.buf, node->node.n_bytes); + hash = zix_digest_add(hash, &node->node.type, sizeof(node->node.type)); + if (node->node.type == SERD_LITERAL) { + hash = zix_digest_add(hash, &node->meta.lit, sizeof(node->meta.lit)); + } + return hash; +} + +static bool +sord_node_hash_equal(const void* a, const void* b) +{ + const SordNode* a_node = (const SordNode*)a; + const SordNode* b_node = (const SordNode*)b; + return (a_node == b_node) || + ((a_node->node.type == b_node->node.type) && + (a_node->node.type != SERD_LITERAL || + (a_node->meta.lit.datatype == b_node->meta.lit.datatype && + !strncmp(a_node->meta.lit.lang, + b_node->meta.lit.lang, + sizeof(a_node->meta.lit.lang)))) && + (serd_node_equals(&a_node->node, &b_node->node))); +} + +SORD_LOG_FUNC(3, 4) +static void +error(SordWorld* world, SerdStatus st, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const SerdError e = {st, NULL, 0, 0, fmt, &args}; + if (world->error_sink) { + world->error_sink(world->error_handle, &e); + } else { + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, args); + } + va_end(args); +} + +SordWorld* +sord_world_new(void) +{ + SordWorld* world = (SordWorld*)malloc(sizeof(SordWorld)); + world->error_sink = NULL; + world->error_handle = NULL; + + world->nodes = + zix_hash_new(sord_node_hash, sord_node_hash_equal, sizeof(SordNode)); + + return world; +} + +static void +free_node_entry(void* value, void* user_data) +{ + SordNode* node = (SordNode*)value; + if (node->node.type == SERD_LITERAL) { + sord_node_free((SordWorld*)user_data, node->meta.lit.datatype); + } + free((uint8_t*)node->node.buf); +} + +void +sord_world_free(SordWorld* world) +{ + zix_hash_foreach(world->nodes, free_node_entry, world); + zix_hash_free(world->nodes); + free(world); +} + +void +sord_world_set_error_sink(SordWorld* world, + SerdErrorSink error_sink, + void* handle) +{ + world->error_sink = error_sink; + world->error_handle = handle; +} + +static inline int +sord_node_compare_literal(const SordNode* a, const SordNode* b) +{ + const int cmp = strcmp((const char*)sord_node_get_string(a), + (const char*)sord_node_get_string(b)); + if (cmp != 0) { + return cmp; + } + + const bool a_has_lang = a->meta.lit.lang[0]; + const bool b_has_lang = b->meta.lit.lang[0]; + const bool a_has_datatype = a->meta.lit.datatype; + const bool b_has_datatype = b->meta.lit.datatype; + const bool a_has_meta = a_has_lang || a_has_datatype; + const bool b_has_meta = b_has_lang || b_has_datatype; + + assert(!(a_has_lang && a_has_datatype)); + assert(!(b_has_lang && b_has_datatype)); + + if (!a_has_meta && !b_has_meta) { + return 0; + } else if (!a_has_meta || (a_has_lang && b_has_datatype)) { + return -1; + } else if (!b_has_meta || (a_has_datatype && b_has_lang)) { + return 1; + } else if (a_has_lang) { + assert(b_has_lang); + return strcmp(a->meta.lit.lang, b->meta.lit.lang); + } + + assert(a_has_datatype); + assert(b_has_datatype); + return strcmp((const char*)a->meta.lit.datatype->node.buf, + (const char*)b->meta.lit.datatype->node.buf); +} + +/** Compare nodes, considering NULL a wildcard match. */ +static inline int +sord_node_compare(const SordNode* a, const SordNode* b) +{ + if (a == b || !a || !b) { + return 0; // Exact or wildcard match + } else if (a->node.type != b->node.type) { + return (a->node.type < b->node.type) ? -1 : 1; + } + + int cmp = 0; + switch (a->node.type) { + case SERD_URI: + case SERD_BLANK: + return strcmp((const char*)a->node.buf, (const char*)b->node.buf); + case SERD_LITERAL: + cmp = sord_node_compare_literal(a, b); + break; + default: + break; + } + return cmp; +} + +bool +sord_node_equals(const SordNode* a, const SordNode* b) +{ + return a == b; // Nodes are interned +} + +/** Return true iff IDs are equivalent, or one is a wildcard */ +static inline bool +sord_id_match(const SordNode* a, const SordNode* b) +{ + return !a || !b || (a == b); +} + +static inline bool +sord_quad_match_inline(const SordQuad x, const SordQuad y) +{ + return sord_id_match(x[0], y[0]) && sord_id_match(x[1], y[1]) && + sord_id_match(x[2], y[2]) && sord_id_match(x[3], y[3]); +} + +bool +sord_quad_match(const SordQuad x, const SordQuad y) +{ + return sord_quad_match_inline(x, y); +} + +/** + Compare two quad IDs lexicographically. + NULL IDs (equal to 0) are treated as wildcards, always less than every + other possible ID, except itself. +*/ +static int +sord_quad_compare(const void* x_ptr, const void* y_ptr, const void* user_data) +{ + const int* const ordering = (const int*)user_data; + const SordNode* const* const x = (const SordNode* const*)x_ptr; + const SordNode* const* const y = (const SordNode* const*)y_ptr; + + for (int i = 0; i < TUP_LEN; ++i) { + const int idx = ordering[i]; + const int cmp = sord_node_compare(x[idx], y[idx]); + if (cmp) { + return cmp; + } + } + + return 0; +} + +static inline bool +sord_iter_forward(SordIter* iter) +{ + if (!iter->skip_graphs) { + zix_btree_iter_increment(iter->cur); + return zix_btree_iter_is_end(iter->cur); + } + + SordNode** key = (SordNode**)zix_btree_get(iter->cur); + const SordQuad initial = {key[0], key[1], key[2], key[3]}; + zix_btree_iter_increment(iter->cur); + while (!zix_btree_iter_is_end(iter->cur)) { + key = (SordNode**)zix_btree_get(iter->cur); + for (int i = 0; i < 3; ++i) { + if (key[i] != initial[i]) { + return false; + } + } + + zix_btree_iter_increment(iter->cur); + } + + return true; +} + +/** + Seek forward as necessary until `iter` points at a match. + @return true iff iterator reached end of valid range. +*/ +static inline bool +sord_iter_seek_match(SordIter* iter) +{ + for (iter->end = true; !zix_btree_iter_is_end(iter->cur); + sord_iter_forward(iter)) { + const SordNode** const key = (const SordNode**)zix_btree_get(iter->cur); + if (sord_quad_match_inline(key, iter->pat)) { + return (iter->end = false); + } + } + return true; +} + +/** + Seek forward as necessary until `iter` points at a match, or the prefix + no longer matches iter->pat. + @return true iff iterator reached end of valid range. +*/ +static inline bool +sord_iter_seek_match_range(SordIter* iter) +{ + assert(!iter->end); + + do { + const SordNode** key = (const SordNode**)zix_btree_get(iter->cur); + + if (sord_quad_match_inline(key, iter->pat)) { + return false; // Found match + } + + for (int i = 0; i < iter->n_prefix; ++i) { + const int idx = orderings[iter->order][i]; + if (!sord_id_match(key[idx], iter->pat[idx])) { + iter->end = true; // Reached end of valid range + return true; + } + } + } while (!sord_iter_forward(iter)); + + return (iter->end = true); // Reached end +} + +static SordIter* +sord_iter_new(const SordModel* sord, + ZixBTreeIter* cur, + const SordQuad pat, + SordOrder order, + SearchMode mode, + int n_prefix) +{ + SordIter* iter = (SordIter*)malloc(sizeof(SordIter)); + iter->sord = sord; + iter->cur = cur; + iter->order = order; + iter->mode = mode; + iter->n_prefix = n_prefix; + iter->end = false; + iter->skip_graphs = order < GSPO; + for (int i = 0; i < TUP_LEN; ++i) { + iter->pat[i] = pat[i]; + } + + switch (iter->mode) { + case ALL: + case SINGLE: + case RANGE: + assert(sord_quad_match_inline((const SordNode**)zix_btree_get(iter->cur), + iter->pat)); + break; + case FILTER_RANGE: + sord_iter_seek_match_range(iter); + break; + case FILTER_ALL: + sord_iter_seek_match(iter); + break; + } + +#ifdef SORD_DEBUG_ITER + SordQuad value; + sord_iter_get(iter, value); + SORD_ITER_LOG("New %p pat=" TUP_FMT " cur=" TUP_FMT " end=%d skip=%d\n", + (void*)iter, + TUP_FMT_ARGS(pat), + TUP_FMT_ARGS(value), + iter->end, + iter->skip_graphs); +#endif + + ++((SordModel*)sord)->n_iters; + return iter; +} + +const SordModel* +sord_iter_get_model(SordIter* iter) +{ + return iter->sord; +} + +void +sord_iter_get(const SordIter* iter, SordQuad tup) +{ + SordNode** key = (SordNode**)zix_btree_get(iter->cur); + for (int i = 0; i < TUP_LEN; ++i) { + tup[i] = key[i]; + } +} + +const SordNode* +sord_iter_get_node(const SordIter* iter, SordQuadIndex index) +{ + return (!sord_iter_end(iter) ? ((SordNode**)zix_btree_get(iter->cur))[index] + : NULL); +} + +static bool +sord_iter_scan_next(SordIter* iter) +{ + if (iter->end) { + return true; + } + + const SordNode** key; + if (!iter->end) { + switch (iter->mode) { + case ALL: + // At the end if the cursor is (assigned above) + break; + case SINGLE: + iter->end = true; + SORD_ITER_LOG("%p reached single end\n", (void*)iter); + break; + case RANGE: + SORD_ITER_LOG("%p range next\n", (void*)iter); + // At the end if the MSNs no longer match + key = (const SordNode**)zix_btree_get(iter->cur); + assert(key); + for (int i = 0; i < iter->n_prefix; ++i) { + const int idx = orderings[iter->order][i]; + if (!sord_id_match(key[idx], iter->pat[idx])) { + iter->end = true; + SORD_ITER_LOG("%p reached non-match end\n", (void*)iter); + break; + } + } + break; + case FILTER_RANGE: + // Seek forward to next match, stopping if prefix changes + sord_iter_seek_match_range(iter); + break; + case FILTER_ALL: + // Seek forward to next match + sord_iter_seek_match(iter); + break; + } + } else { + SORD_ITER_LOG("%p reached index end\n", (void*)iter); + } + + if (iter->end) { + SORD_ITER_LOG("%p Reached end\n", (void*)iter); + return true; + } else { +#ifdef SORD_DEBUG_ITER + SordQuad tup; + sord_iter_get(iter, tup); + SORD_ITER_LOG( + "%p Increment to " TUP_FMT "\n", (void*)iter, TUP_FMT_ARGS(tup)); +#endif + return false; + } +} + +bool +sord_iter_next(SordIter* iter) +{ + if (iter->end) { + return true; + } + + iter->end = sord_iter_forward(iter); + return sord_iter_scan_next(iter); +} + +bool +sord_iter_end(const SordIter* iter) +{ + return !iter || iter->end; +} + +void +sord_iter_free(SordIter* iter) +{ + SORD_ITER_LOG("%p Free\n", (void*)iter); + if (iter) { + --((SordModel*)iter->sord)->n_iters; + zix_btree_iter_free(iter->cur); + free(iter); + } +} + +/** + Return true iff `sord` has an index for `order`. + If `graphs` is true, `order` will be modified to be the + corresponding order with a G prepended (so G will be the MSN). +*/ +static inline bool +sord_has_index(SordModel* model, SordOrder* order, int* n_prefix, bool graphs) +{ + if (graphs) { + *order = (SordOrder)(*order + GSPO); + *n_prefix += 1; + } + + return model->indices[*order]; +} + +/** + Return the best available index for a pattern. + @param pat Pattern in standard (S P O G) order + @param mode Set to the (best) iteration mode for iterating over results + @param n_prefix Set to the length of the range prefix + (for `mode` == RANGE and `mode` == FILTER_RANGE) +*/ +static inline SordOrder +sord_best_index(SordModel* sord, + const SordQuad pat, + SearchMode* mode, + int* n_prefix) +{ + const bool graph_search = (pat[TUP_G] != 0); + + const unsigned sig = (pat[0] ? 1 : 0) * 0x100 + (pat[1] ? 1 : 0) * 0x010 + + (pat[2] ? 1 : 0) * 0x001; + + SordOrder good[2] = {(SordOrder)-1, (SordOrder)-1}; + +#define PAT_CASE(sig, m, g0, g1, np) \ + case sig: \ + *mode = m; \ + good[0] = g0; \ + good[1] = g1; \ + *n_prefix = np; \ + break + + // Good orderings that don't require filtering + *mode = RANGE; + *n_prefix = 0; + switch (sig) { + case 0x000: + assert(graph_search); + *mode = RANGE; + *n_prefix = 1; + return DEFAULT_GRAPH_ORDER; + case 0x111: + *mode = SINGLE; + return graph_search ? DEFAULT_GRAPH_ORDER : DEFAULT_ORDER; + + PAT_CASE(0x001, RANGE, OPS, OSP, 1); + PAT_CASE(0x010, RANGE, POS, PSO, 1); + PAT_CASE(0x011, RANGE, OPS, POS, 2); + PAT_CASE(0x100, RANGE, SPO, SOP, 1); + PAT_CASE(0x101, RANGE, SOP, OSP, 2); + PAT_CASE(0x110, RANGE, SPO, PSO, 2); + } + + if (*mode == RANGE) { + if (sord_has_index(sord, &good[0], n_prefix, graph_search)) { + return good[0]; + } else if (sord_has_index(sord, &good[1], n_prefix, graph_search)) { + return good[1]; + } + } + + // Not so good orderings that require filtering, but can + // still be constrained to a range + switch (sig) { + PAT_CASE(0x011, FILTER_RANGE, OSP, PSO, 1); + PAT_CASE(0x101, FILTER_RANGE, SPO, OPS, 1); + // SPO is always present, so 0x110 is never reached here + default: + break; + } + + if (*mode == FILTER_RANGE) { + if (sord_has_index(sord, &good[0], n_prefix, graph_search)) { + return good[0]; + } else if (sord_has_index(sord, &good[1], n_prefix, graph_search)) { + return good[1]; + } + } + + if (graph_search) { + *mode = FILTER_RANGE; + *n_prefix = 1; + return DEFAULT_GRAPH_ORDER; + } else { + *mode = FILTER_ALL; + return DEFAULT_ORDER; + } +} + +SordModel* +sord_new(SordWorld* world, unsigned indices, bool graphs) +{ + SordModel* model = (SordModel*)malloc(sizeof(struct SordModelImpl)); + model->world = world; + model->n_quads = 0; + model->n_iters = 0; + + for (unsigned i = 0; i < (NUM_ORDERS / 2); ++i) { + const int* const ordering = orderings[i]; + const int* const g_ordering = orderings[i + (NUM_ORDERS / 2)]; + + if (indices & (1 << i)) { + model->indices[i] = + zix_btree_new(sord_quad_compare, (void*)ordering, NULL); + if (graphs) { + model->indices[i + (NUM_ORDERS / 2)] = + zix_btree_new(sord_quad_compare, (void*)g_ordering, NULL); + } else { + model->indices[i + (NUM_ORDERS / 2)] = NULL; + } + } else { + model->indices[i] = NULL; + model->indices[i + (NUM_ORDERS / 2)] = NULL; + } + } + + if (!model->indices[DEFAULT_ORDER]) { + model->indices[DEFAULT_ORDER] = + zix_btree_new(sord_quad_compare, (void*)orderings[DEFAULT_ORDER], NULL); + } + if (graphs && !model->indices[DEFAULT_GRAPH_ORDER]) { + model->indices[DEFAULT_GRAPH_ORDER] = zix_btree_new( + sord_quad_compare, (void*)orderings[DEFAULT_GRAPH_ORDER], NULL); + } + + return model; +} + +static void +sord_node_free_internal(SordWorld* world, SordNode* node) +{ + assert(node->refs == 0); + + // If you hit this, the world has probably been destroyed too early + assert(world); + + // Cache pointer to buffer to free after node removal and destruction + const uint8_t* const buf = node->node.buf; + + // Remove node from hash (which frees the node) + if (zix_hash_remove(world->nodes, node)) { + error(world, SERD_ERR_INTERNAL, "failed to remove node from hash\n"); + } + + // Free buffer + free((uint8_t*)buf); +} + +static void +sord_add_quad_ref(SordModel* model, const SordNode* node, SordQuadIndex i) +{ + if (node) { + assert(node->refs > 0); + ++((SordNode*)node)->refs; + if (node->node.type != SERD_LITERAL && i == SORD_OBJECT) { + ++((SordNode*)node)->meta.res.refs_as_obj; + } + } +} + +static void +sord_drop_quad_ref(SordModel* model, const SordNode* node, SordQuadIndex i) +{ + if (!node) { + return; + } + + assert(node->refs > 0); + if (node->node.type != SERD_LITERAL && i == SORD_OBJECT) { + assert(node->meta.res.refs_as_obj > 0); + --((SordNode*)node)->meta.res.refs_as_obj; + } + if (--((SordNode*)node)->refs == 0) { + sord_node_free_internal(sord_get_world(model), (SordNode*)node); + } +} + +void +sord_free(SordModel* model) +{ + if (!model) { + return; + } + + // Free nodes + SordQuad tup; + SordIter* i = sord_begin(model); + for (; !sord_iter_end(i); sord_iter_next(i)) { + sord_iter_get(i, tup); + for (int t = 0; t < TUP_LEN; ++t) { + sord_drop_quad_ref(model, tup[t], (SordQuadIndex)t); + } + } + sord_iter_free(i); + + // Free quads + ZixBTreeIter* t = zix_btree_begin(model->indices[DEFAULT_ORDER]); + for (; !zix_btree_iter_is_end(t); zix_btree_iter_increment(t)) { + free(zix_btree_get(t)); + } + zix_btree_iter_free(t); + + // Free indices + for (unsigned o = 0; o < NUM_ORDERS; ++o) { + if (model->indices[o]) { + zix_btree_free(model->indices[o]); + } + } + + free(model); +} + +SordWorld* +sord_get_world(SordModel* model) +{ + return model->world; +} + +size_t +sord_num_quads(const SordModel* model) +{ + return model->n_quads; +} + +size_t +sord_num_nodes(const SordWorld* world) +{ + return zix_hash_size(world->nodes); +} + +SordIter* +sord_begin(const SordModel* model) +{ + if (sord_num_quads(model) == 0) { + return NULL; + } else { + ZixBTreeIter* cur = zix_btree_begin(model->indices[DEFAULT_ORDER]); + SordQuad pat = {0, 0, 0, 0}; + return sord_iter_new(model, cur, pat, DEFAULT_ORDER, ALL, 0); + } +} + +SordIter* +sord_find(SordModel* model, const SordQuad pat) +{ + if (!pat[0] && !pat[1] && !pat[2] && !pat[3]) { + return sord_begin(model); + } + + SearchMode mode; + int n_prefix; + const SordOrder index_order = sord_best_index(model, pat, &mode, &n_prefix); + + SORD_FIND_LOG("Find " TUP_FMT " index=%s mode=%u n_prefix=%d\n", + TUP_FMT_ARGS(pat), + order_names[index_order], + mode, + n_prefix); + + if (pat[0] && pat[1] && pat[2] && pat[3]) { + mode = SINGLE; // No duplicate quads (Sord is a set) + } + + ZixBTree* const db = model->indices[index_order]; + ZixBTreeIter* cur = NULL; + + if (mode == FILTER_ALL) { + // No prefix shared with an index at all, linear search (worst case) + cur = zix_btree_begin(db); + } else if (mode == FILTER_RANGE) { + /* Some prefix, but filtering still required. Build a search pattern + with only the prefix to find the lower bound in log time. */ + SordQuad prefix_pat = {NULL, NULL, NULL, NULL}; + const int* const ordering = orderings[index_order]; + for (int i = 0; i < n_prefix; ++i) { + prefix_pat[ordering[i]] = pat[ordering[i]]; + } + zix_btree_lower_bound(db, prefix_pat, &cur); + } else { + // Ideal case, pattern matches an index with no filtering required + zix_btree_lower_bound(db, pat, &cur); + } + + if (zix_btree_iter_is_end(cur)) { + SORD_FIND_LOG("No match found\n"); + zix_btree_iter_free(cur); + return NULL; + } + const SordNode** const key = (const SordNode**)zix_btree_get(cur); + if (!key || ((mode == RANGE || mode == SINGLE) && + !sord_quad_match_inline(pat, key))) { + SORD_FIND_LOG("No match found\n"); + zix_btree_iter_free(cur); + return NULL; + } + + return sord_iter_new(model, cur, pat, index_order, mode, n_prefix); +} + +SordIter* +sord_search(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g) +{ + SordQuad pat = {s, p, o, g}; + return sord_find(model, pat); +} + +SordNode* +sord_get(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g) +{ + if ((bool)s + (bool)p + (bool)o != 2) { + return NULL; + } + + SordIter* i = sord_search(model, s, p, o, g); + SordNode* ret = NULL; + if (!s) { + ret = sord_node_copy(sord_iter_get_node(i, SORD_SUBJECT)); + } else if (!p) { + ret = sord_node_copy(sord_iter_get_node(i, SORD_PREDICATE)); + } else if (!o) { + ret = sord_node_copy(sord_iter_get_node(i, SORD_OBJECT)); + } + + sord_iter_free(i); + return ret; +} + +bool +sord_ask(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g) +{ + SordQuad pat = {s, p, o, g}; + return sord_contains(model, pat); +} + +uint64_t +sord_count(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g) +{ + SordIter* i = sord_search(model, s, p, o, g); + uint64_t n = 0; + for (; !sord_iter_end(i); sord_iter_next(i)) { + ++n; + } + sord_iter_free(i); + return n; +} + +bool +sord_contains(SordModel* model, const SordQuad pat) +{ + SordIter* iter = sord_find(model, pat); + bool ret = (iter != NULL); + sord_iter_free(iter); + return ret; +} + +static uint8_t* +sord_strndup(const uint8_t* str, size_t len) +{ + uint8_t* dup = (uint8_t*)malloc(len + 1); + memcpy(dup, str, len + 1); + return dup; +} + +SordNodeType +sord_node_get_type(const SordNode* node) +{ + switch (node->node.type) { + case SERD_URI: + return SORD_URI; + case SERD_BLANK: + return SORD_BLANK; + default: + return SORD_LITERAL; + } + SORD_UNREACHABLE(); +} + +const uint8_t* +sord_node_get_string(const SordNode* node) +{ + return node->node.buf; +} + +const uint8_t* +sord_node_get_string_counted(const SordNode* node, size_t* bytes) +{ + *bytes = node->node.n_bytes; + return node->node.buf; +} + +const uint8_t* +sord_node_get_string_measured(const SordNode* node, + size_t* bytes, + size_t* chars) +{ + *bytes = node->node.n_bytes; + *chars = node->node.n_chars; + return node->node.buf; +} + +const char* +sord_node_get_language(const SordNode* node) +{ + if (node->node.type != SERD_LITERAL || !node->meta.lit.lang[0]) { + return NULL; + } + return node->meta.lit.lang; +} + +SordNode* +sord_node_get_datatype(const SordNode* node) +{ + return (node->node.type == SERD_LITERAL) ? node->meta.lit.datatype : NULL; +} + +SerdNodeFlags +sord_node_get_flags(const SordNode* node) +{ + return node->node.flags; +} + +bool +sord_node_is_inline_object(const SordNode* node) +{ + return (node->node.type == SERD_BLANK) && (node->meta.res.refs_as_obj == 1); +} + +static SordNode* +sord_insert_node(SordWorld* world, const SordNode* key, bool copy) +{ + SordNode* node = NULL; + ZixStatus st = zix_hash_insert(world->nodes, key, (void**)&node); + switch (st) { + case ZIX_STATUS_EXISTS: + ++node->refs; + break; + case ZIX_STATUS_SUCCESS: + assert(node->refs == 1); + if (copy) { + node->node.buf = sord_strndup(node->node.buf, node->node.n_bytes); + } + if (node->node.type == SERD_LITERAL) { + node->meta.lit.datatype = sord_node_copy(node->meta.lit.datatype); + } + return node; + default: + error( + world, SERD_ERR_INTERNAL, "error inserting node `%s'\n", key->node.buf); + } + + if (!copy) { + // Free the buffer we would have copied if a new node was created + free((uint8_t*)key->node.buf); + } + + return node; +} + +static SordNode* +sord_new_uri_counted(SordWorld* world, + const uint8_t* str, + size_t n_bytes, + size_t n_chars, + bool copy) +{ + if (!serd_uri_string_has_scheme(str)) { + error(world, SERD_ERR_BAD_ARG, "attempt to map invalid URI `%s'\n", str); + return NULL; // Can't intern relative URIs + } + + const SordNode key = {{str, n_bytes, n_chars, 0, SERD_URI}, 1, {{0}}}; + + return sord_insert_node(world, &key, copy); +} + +SordNode* +sord_new_uri(SordWorld* world, const uint8_t* uri) +{ + const SerdNode node = serd_node_from_string(SERD_URI, uri); + return sord_new_uri_counted(world, uri, node.n_bytes, node.n_chars, true); +} + +SordNode* +sord_new_relative_uri(SordWorld* world, + const uint8_t* uri, + const uint8_t* base_uri) +{ + if (serd_uri_string_has_scheme(uri)) { + return sord_new_uri(world, uri); + } + SerdURI buri = SERD_URI_NULL; + SerdNode base = serd_node_new_uri_from_string(base_uri, NULL, &buri); + SerdNode node = serd_node_new_uri_from_string(uri, &buri, NULL); + + SordNode* ret = + sord_new_uri_counted(world, node.buf, node.n_bytes, node.n_chars, false); + + serd_node_free(&base); + return ret; +} + +static SordNode* +sord_new_blank_counted(SordWorld* world, + const uint8_t* str, + size_t n_bytes, + size_t n_chars) +{ + const SordNode key = {{str, n_bytes, n_chars, 0, SERD_BLANK}, 1, {{0}}}; + + return sord_insert_node(world, &key, true); +} + +SordNode* +sord_new_blank(SordWorld* world, const uint8_t* str) +{ + const SerdNode node = serd_node_from_string(SERD_URI, str); + return sord_new_blank_counted(world, str, node.n_bytes, node.n_chars); +} + +static SordNode* +sord_new_literal_counted(SordWorld* world, + SordNode* datatype, + const uint8_t* str, + size_t n_bytes, + size_t n_chars, + SerdNodeFlags flags, + const char* lang) +{ + SordNode key = {{str, n_bytes, n_chars, flags, SERD_LITERAL}, 1, {{0}}}; + key.meta.lit.datatype = sord_node_copy(datatype); + memset(key.meta.lit.lang, 0, sizeof(key.meta.lit.lang)); + if (lang) { + strncpy(key.meta.lit.lang, lang, sizeof(key.meta.lit.lang) - 1); + } + + return sord_insert_node(world, &key, true); +} + +SordNode* +sord_new_literal(SordWorld* world, + SordNode* datatype, + const uint8_t* str, + const char* lang) +{ + SerdNodeFlags flags = 0; + size_t n_bytes = 0; + size_t n_chars = serd_strlen(str, &n_bytes, &flags); + return sord_new_literal_counted( + world, datatype, str, n_bytes, n_chars, flags, lang); +} + +SordNode* +sord_node_from_serd_node(SordWorld* world, + SerdEnv* env, + const SerdNode* node, + const SerdNode* datatype, + const SerdNode* lang) +{ + if (!node) { + return NULL; + } + + SordNode* datatype_node = NULL; + SordNode* ret = NULL; + switch (node->type) { + case SERD_NOTHING: + return NULL; + case SERD_LITERAL: + datatype_node = sord_node_from_serd_node(world, env, datatype, NULL, NULL); + ret = sord_new_literal_counted(world, + datatype_node, + node->buf, + node->n_bytes, + node->n_chars, + node->flags, + lang ? (const char*)lang->buf : NULL); + sord_node_free(world, datatype_node); + return ret; + case SERD_URI: + if (serd_uri_string_has_scheme(node->buf)) { + return sord_new_uri_counted( + world, node->buf, node->n_bytes, node->n_chars, true); + } else { + SerdURI base_uri; + serd_env_get_base_uri(env, &base_uri); + SerdURI abs_uri; + SerdNode abs_uri_node = + serd_node_new_uri_from_node(node, &base_uri, &abs_uri); + ret = sord_new_uri_counted(world, + abs_uri_node.buf, + abs_uri_node.n_bytes, + abs_uri_node.n_chars, + true); + serd_node_free(&abs_uri_node); + return ret; + } + case SERD_CURIE: { + SerdChunk uri_prefix; + SerdChunk uri_suffix; + if (serd_env_expand(env, node, &uri_prefix, &uri_suffix)) { + error( + world, SERD_ERR_BAD_CURIE, "failed to expand CURIE `%s'\n", node->buf); + return NULL; + } + const size_t uri_len = uri_prefix.len + uri_suffix.len; + uint8_t* buf = (uint8_t*)malloc(uri_len + 1); + memcpy(buf, uri_prefix.buf, uri_prefix.len); + memcpy(buf + uri_prefix.len, uri_suffix.buf, uri_suffix.len); + buf[uri_len] = '\0'; + ret = sord_new_uri_counted( + world, buf, uri_len, serd_strlen(buf, NULL, NULL), false); + return ret; + } + case SERD_BLANK: + return sord_new_blank_counted( + world, node->buf, node->n_bytes, node->n_chars); + } + return NULL; +} + +const SerdNode* +sord_node_to_serd_node(const SordNode* node) +{ + return node ? &node->node : &SERD_NODE_NULL; +} + +void +sord_node_free(SordWorld* world, SordNode* node) +{ + if (!node) { + return; + } else if (node->refs == 0) { + error(world, SERD_ERR_BAD_ARG, "attempt to free garbage node\n"); + } else if (--node->refs == 0) { + sord_node_free_internal(world, node); + } +} + +SordNode* +sord_node_copy(const SordNode* node) +{ + SordNode* copy = (SordNode*)node; + if (copy) { + ++copy->refs; + } + return copy; +} + +static inline bool +sord_add_to_index(SordModel* model, const SordNode** tup, SordOrder order) +{ + return !zix_btree_insert(model->indices[order], tup); +} + +bool +sord_add(SordModel* model, const SordQuad tup) +{ + SORD_WRITE_LOG("Add " TUP_FMT "\n", TUP_FMT_ARGS(tup)); + if (!tup[0] || !tup[1] || !tup[2]) { + error( + model->world, SERD_ERR_BAD_ARG, "attempt to add quad with NULL field\n"); + return false; + } else if (model->n_iters > 0) { + error(model->world, SERD_ERR_BAD_ARG, "added tuple during iteration\n"); + } + + const SordNode** quad = (const SordNode**)malloc(sizeof(SordQuad)); + memcpy(quad, tup, sizeof(SordQuad)); + + for (unsigned i = 0; i < NUM_ORDERS; ++i) { + if (model->indices[i] && (i < GSPO || tup[3])) { + if (!sord_add_to_index(model, quad, (SordOrder)i)) { + assert(i == 0); // Assuming index coherency + free(quad); + return false; // Quad already stored, do nothing + } + } + } + + for (int i = 0; i < TUP_LEN; ++i) { + sord_add_quad_ref(model, tup[i], (SordQuadIndex)i); + } + + ++model->n_quads; + return true; +} + +void +sord_remove(SordModel* model, const SordQuad tup) +{ + SORD_WRITE_LOG("Remove " TUP_FMT "\n", TUP_FMT_ARGS(tup)); + if (model->n_iters > 0) { + error(model->world, SERD_ERR_BAD_ARG, "remove with iterator\n"); + } + + SordNode* quad = NULL; + for (unsigned i = 0; i < NUM_ORDERS; ++i) { + if (model->indices[i] && (i < GSPO || tup[3])) { + if (zix_btree_remove(model->indices[i], tup, (void**)&quad, NULL)) { + assert(i == 0); // Assuming index coherency + return; // Quad not found, do nothing + } + } + } + + free(quad); + + for (int i = 0; i < TUP_LEN; ++i) { + sord_drop_quad_ref(model, tup[i], (SordQuadIndex)i); + } + + --model->n_quads; +} + +SerdStatus +sord_erase(SordModel* model, SordIter* iter) +{ + if (model->n_iters > 1) { + error(model->world, SERD_ERR_BAD_ARG, "erased with many iterators\n"); + return SERD_ERR_BAD_ARG; + } + + SordQuad tup; + sord_iter_get(iter, tup); + + SORD_WRITE_LOG("Remove " TUP_FMT "\n", TUP_FMT_ARGS(tup)); + + SordNode* quad = NULL; + for (unsigned i = 0; i < NUM_ORDERS; ++i) { + if (model->indices[i] && (i < GSPO || tup[3])) { + if (zix_btree_remove(model->indices[i], + tup, + (void**)&quad, + i == iter->order ? &iter->cur : NULL)) { + return (i == 0) ? SERD_ERR_NOT_FOUND : SERD_ERR_INTERNAL; + } + } + } + iter->end = zix_btree_iter_is_end(iter->cur); + sord_iter_scan_next(iter); + + free(quad); + + for (int i = 0; i < TUP_LEN; ++i) { + sord_drop_quad_ref(model, tup[i], (SordQuadIndex)i); + } + + --model->n_quads; + return SERD_SUCCESS; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,61 @@ +/* + Copyright 2021 David Robillard + + 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. +*/ + +/* + Configuration header that defines reasonable defaults at compile time. + + This allows compile-time configuration from the command line (typically via + the build system) while still allowing the source to be built without any + configuration. The build system can define SORD_NO_DEFAULT_CONFIG to disable + defaults, in which case it must define things like HAVE_FEATURE to enable + features. The design here ensures that compiler warnings or + include-what-you-use will catch any mistakes. +*/ + +#ifndef SORD_CONFIG_H +#define SORD_CONFIG_H + +// Define version unconditionally so a warning will catch a mismatch +#define SORD_VERSION "0.16.9" + +#if !defined(SORD_NO_DEFAULT_CONFIG) + +// The validator uses PCRE for literal pattern matching +# ifndef HAVE_PCRE +# ifdef __has_include +# if __has_include() +# define HAVE_PCRE 1 +# endif +# endif +# endif + +#endif // !defined(SORD_NO_DEFAULT_CONFIG) + +/* + Make corresponding USE_FEATURE defines based on the HAVE_FEATURE defines from + above or the command line. The code checks for these using #if (not #ifdef), + so there will be an undefined warning if it checks for an unknown feature, + and this header is always required by any code that checks for features, even + if the build system defines them all. +*/ + +#ifdef HAVE_PCRE +# define USE_PCRE 1 +#else +# define USE_PCRE 1 +#endif + +#endif // SORD_CONFIG_H diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,216 @@ +/* + Copyright 2011-2016 David Robillard + + 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. +*/ + +#include "serd/serd.h" +#include "sord/sord.h" +#include "sord_config.h" + +#ifdef _WIN32 +# include +#endif + +#include +#include +#include +#include +#include + +#define SORDI_ERROR(msg) fprintf(stderr, "sordi: " msg) +#define SORDI_ERRORF(fmt, ...) fprintf(stderr, "sordi: " fmt, __VA_ARGS__) + +typedef struct { + SerdWriter* writer; + SerdEnv* env; + SerdNode base_uri_node; + SerdURI base_uri; + SordModel* sord; +} State; + +static int +print_version(void) +{ + printf("sordi " SORD_VERSION " \n"); + printf("Copyright 2011-2021 David Robillard .\n" + "License: \n" + "This is free software; you are free to change and redistribute it." + "\nThere is NO WARRANTY, to the extent permitted by law.\n"); + return 0; +} + +static int +print_usage(const char* name, bool error) +{ + FILE* const os = error ? stderr : stdout; + fprintf(os, "%s", error ? "\n" : ""); + fprintf(os, "Usage: %s [OPTION]... INPUT [BASE_URI]\n", name); + fprintf(os, "Load and re-serialise RDF data.\n"); + fprintf(os, "Use - for INPUT to read from standard input.\n\n"); + fprintf(os, " -h Display this help and exit\n"); + fprintf(os, " -i SYNTAX Input syntax (`turtle' or `ntriples')\n"); + fprintf(os, " -o SYNTAX Output syntax (`turtle' or `ntriples')\n"); + fprintf(os, " -s INPUT Parse INPUT as string (terminates options)\n"); + fprintf(os, " -v Display version information and exit\n"); + return error ? 1 : 0; +} + +static bool +set_syntax(SerdSyntax* syntax, const char* name) +{ + if (!strcmp(name, "turtle")) { + *syntax = SERD_TURTLE; + } else if (!strcmp(name, "ntriples")) { + *syntax = SERD_NTRIPLES; + } else { + SORDI_ERRORF("unknown syntax `%s'\n", name); + return false; + } + return true; +} + +int +main(int argc, char** argv) +{ + if (argc < 2) { + return print_usage(argv[0], true); + } + + FILE* in_fd = NULL; + SerdSyntax input_syntax = SERD_TURTLE; + SerdSyntax output_syntax = SERD_NTRIPLES; + bool from_file = true; + const uint8_t* in_name = NULL; + int a = 1; + for (; a < argc && argv[a][0] == '-'; ++a) { + if (argv[a][1] == '\0') { + in_name = (const uint8_t*)"(stdin)"; + in_fd = stdin; + break; + } else if (argv[a][1] == 'h') { + return print_usage(argv[0], false); + } else if (argv[a][1] == 'v') { + return print_version(); + } else if (argv[a][1] == 's') { + in_name = (const uint8_t*)"(string)"; + from_file = false; + ++a; + break; + } else if (argv[a][1] == 'i') { + if (++a == argc) { + SORDI_ERROR("option requires an argument -- 'i'\n\n"); + return print_usage(argv[0], true); + } + if (!set_syntax(&input_syntax, argv[a])) { + return print_usage(argv[0], true); + } + } else if (argv[a][1] == 'o') { + if (++a == argc) { + SORDI_ERROR("option requires an argument -- 'o'\n\n"); + return print_usage(argv[0], true); + } + if (!set_syntax(&output_syntax, argv[a])) { + return print_usage(argv[0], true); + } + } else { + SORDI_ERRORF("invalid option -- '%s'\n", argv[a] + 1); + return print_usage(argv[0], true); + } + } + + if (a == argc) { + SORDI_ERROR("missing input\n"); + return print_usage(argv[0], true); + } + + uint8_t* input_path = NULL; + const uint8_t* input = (const uint8_t*)argv[a++]; + if (from_file) { + in_name = in_name ? in_name : input; + if (!in_fd) { + if (!strncmp((const char*)input, "file:", 5)) { + input_path = serd_file_uri_parse(input, NULL); + input = input_path; + } + if (!input || !(in_fd = fopen((const char*)input, "rb"))) { + return 1; + } + } + } + + SerdURI base_uri = SERD_URI_NULL; + SerdNode base = SERD_NODE_NULL; + if (a < argc) { // Base URI given on command line + base = + serd_node_new_uri_from_string((const uint8_t*)argv[a], NULL, &base_uri); + } else if (from_file && in_fd != stdin) { // Use input file URI + base = serd_node_new_file_uri(input, NULL, &base_uri, true); + } + + SordWorld* world = sord_world_new(); + SordModel* sord = sord_new(world, SORD_SPO | SORD_OPS, false); + SerdEnv* env = serd_env_new(&base); + SerdReader* reader = sord_new_reader(sord, env, input_syntax, NULL); + + SerdStatus status = (from_file) + ? serd_reader_read_file_handle(reader, in_fd, in_name) + : serd_reader_read_string(reader, input); + + serd_reader_free(reader); + + FILE* out_fd = stdout; + SerdEnv* write_env = serd_env_new(&base); + + int output_style = SERD_STYLE_RESOLVED; + if (output_syntax == SERD_NTRIPLES) { + output_style |= SERD_STYLE_ASCII; + } else { + output_style |= SERD_STYLE_CURIED | SERD_STYLE_ABBREVIATED; + } + + SerdWriter* writer = serd_writer_new(output_syntax, + (SerdStyle)output_style, + write_env, + &base_uri, + serd_file_sink, + stdout); + + // Write @prefix directives + serd_env_foreach(env, (SerdPrefixSink)serd_writer_set_prefix, writer); + + // Write statements + sord_write(sord, writer, NULL); + + serd_writer_finish(writer); + serd_writer_free(writer); + + serd_env_free(env); + serd_env_free(write_env); + serd_node_free(&base); + free(input_path); + + sord_free(sord); + sord_world_free(world); + + if (from_file) { + fclose(in_fd); + } + + if (fclose(out_fd)) { + perror("sordi: write error"); + status = SERD_ERR_UNKNOWN; + } + + return (status > SERD_FAILURE) ? 1 : 0; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,53 @@ +/* + Copyright 2011-2015 David Robillard + + 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. +*/ + +#ifndef SORD_SORD_INTERNAL_H +#define SORD_SORD_INTERNAL_H + +#include "serd/serd.h" +#include "sord/sord.h" + +#include + +#if defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 4) +# define SORD_UNREACHABLE() __builtin_unreachable() +#else +# include +# define SORD_UNREACHABLE() assert(0) +#endif + +/** Resource node metadata */ +typedef struct { + size_t refs_as_obj; ///< References as a quad object +} SordResourceMetadata; + +/** Literal node metadata */ +typedef struct { + SordNode* datatype; ///< Optional literal data type URI + char lang[16]; ///< Optional language tag +} SordLiteralMetadata; + +/** Node */ +struct SordNodeImpl { + SerdNode node; ///< Serd node + size_t refs; ///< Reference count (# of containing quads) + union { + SordResourceMetadata res; + SordLiteralMetadata lit; + } meta; +}; + +#endif /* SORD_SORD_INTERNAL_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,25 @@ +/* + Copyright 2011 David Robillard + + 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. +*/ + +#include "sord/sordmm.hpp" + +int +main() +{ + Sord::World world; + Sord::Model model(world, "http://example.org/"); + return 0; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,767 @@ +/* + Copyright 2011-2016 David Robillard + + 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. +*/ + +#include "serd/serd.h" +#include "sord/sord.h" + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# define SORD_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define SORD_LOG_FUNC(fmt, arg1) +#endif + +static const int DIGITS = 3; +static const unsigned n_objects_per = 2; + +static int n_expected_errors = 0; + +typedef struct { + SordQuad query; + int expected_num_results; +} QueryTest; + +#define USTR(s) ((const uint8_t*)(s)) + +static SordNode* +uri(SordWorld* world, int num) +{ + if (num == 0) { + return 0; + } + + char str[] = "eg:000"; + char* uri_num = str + 3; // First `0' + snprintf(uri_num, DIGITS + 1, "%0*d", DIGITS, num); + return sord_new_uri(world, (const uint8_t*)str); +} + +SORD_LOG_FUNC(1, 2) +static int +test_fail(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, args); + va_end(args); + return 1; +} + +static int +generate(SordWorld* world, SordModel* sord, size_t n_quads, SordNode* graph) +{ + fprintf(stderr, + "Generating %zu (S P *) quads with %u objects each\n", + n_quads, + n_objects_per); + + for (size_t i = 0; i < n_quads; ++i) { + int num = (i * n_objects_per) + 1; + + SordNode* ids[2 + n_objects_per]; + for (unsigned j = 0; j < 2 + n_objects_per; ++j) { + ids[j] = uri(world, num++); + } + + for (unsigned j = 0; j < n_objects_per; ++j) { + SordQuad tup = {ids[0], ids[1], ids[2 + j], graph}; + if (!sord_add(sord, tup)) { + return test_fail("Fail: Failed to add quad\n"); + } + } + + for (unsigned j = 0; j < 2 + n_objects_per; ++j) { + sord_node_free(world, ids[j]); + } + } + + // Add some literals + + // (98 4 "hello") and (98 4 "hello"^^<5>) + SordQuad tup = {0, 0, 0, 0}; + tup[0] = uri(world, 98); + tup[1] = uri(world, 4); + tup[2] = sord_new_literal(world, 0, USTR("hello"), NULL); + tup[3] = graph; + sord_add(sord, tup); + sord_node_free(world, (SordNode*)tup[2]); + tup[2] = sord_new_literal(world, uri(world, 5), USTR("hello"), NULL); + if (!sord_add(sord, tup)) { + return test_fail("Failed to add typed literal\n"); + } + + // (96 4 "hello"^^<4>) and (96 4 "hello"^^<5>) + tup[0] = uri(world, 96); + tup[1] = uri(world, 4); + tup[2] = sord_new_literal(world, uri(world, 4), USTR("hello"), NULL); + tup[3] = graph; + sord_add(sord, tup); + sord_node_free(world, (SordNode*)tup[2]); + tup[2] = sord_new_literal(world, uri(world, 5), USTR("hello"), NULL); + if (!sord_add(sord, tup)) { + return test_fail("Failed to add typed literal\n"); + } + + // (94 5 "hello") and (94 5 "hello"@en-gb) + tup[0] = uri(world, 94); + tup[1] = uri(world, 5); + tup[2] = sord_new_literal(world, 0, USTR("hello"), NULL); + tup[3] = graph; + sord_add(sord, tup); + sord_node_free(world, (SordNode*)tup[2]); + tup[2] = sord_new_literal(world, NULL, USTR("hello"), "en-gb"); + if (!sord_add(sord, tup)) { + return test_fail("Failed to add literal with language\n"); + } + + // (92 6 "hello"@en-us) and (92 5 "hello"@en-gb) + tup[0] = uri(world, 92); + tup[1] = uri(world, 6); + tup[2] = sord_new_literal(world, 0, USTR("hello"), "en-us"); + tup[3] = graph; + sord_add(sord, tup); + sord_node_free(world, (SordNode*)tup[2]); + tup[2] = sord_new_literal(world, NULL, USTR("hello"), "en-gb"); + if (!sord_add(sord, tup)) { + return test_fail("Failed to add literal with language\n"); + } + + sord_node_free(world, (SordNode*)tup[0]); + sord_node_free(world, (SordNode*)tup[2]); + tup[0] = uri(world, 14); + tup[2] = sord_new_literal(world, 0, USTR("bonjour"), "fr"); + sord_add(sord, tup); + sord_node_free(world, (SordNode*)tup[2]); + tup[2] = sord_new_literal(world, 0, USTR("salut"), "fr"); + sord_add(sord, tup); + + // Attempt to add some duplicates + if (sord_add(sord, tup)) { + return test_fail("Fail: Successfully added duplicate quad\n"); + } + if (sord_add(sord, tup)) { + return test_fail("Fail: Successfully added duplicate quad\n"); + } + + // Add a blank node subject + sord_node_free(world, (SordNode*)tup[0]); + tup[0] = sord_new_blank(world, USTR("ablank")); + sord_add(sord, tup); + + sord_node_free(world, (SordNode*)tup[1]); + sord_node_free(world, (SordNode*)tup[2]); + tup[1] = uri(world, 6); + tup[2] = uri(world, 7); + sord_add(sord, tup); + sord_node_free(world, (SordNode*)tup[0]); + sord_node_free(world, (SordNode*)tup[1]); + sord_node_free(world, (SordNode*)tup[2]); + + return EXIT_SUCCESS; +} + +#define TUP_FMT "(%6s %6s %6s)" +#define TUP_FMT_ARGS(t) \ + ((t)[0] ? sord_node_get_string((t)[0]) : USTR("*")), \ + ((t)[1] ? sord_node_get_string((t)[1]) : USTR("*")), \ + ((t)[2] ? sord_node_get_string((t)[2]) : USTR("*")) + +static int +test_read(SordWorld* world, SordModel* sord, SordNode* g, const size_t n_quads) +{ + int ret = EXIT_SUCCESS; + + SordQuad id; + + SordIter* iter = sord_begin(sord); + if (sord_iter_get_model(iter) != sord) { + return test_fail("Fail: Iterator has incorrect sord pointer\n"); + } + + for (; !sord_iter_end(iter); sord_iter_next(iter)) { + sord_iter_get(iter, id); + } + + // Attempt to increment past end + if (!sord_iter_next(iter)) { + return test_fail("Fail: Successfully incremented past end\n"); + } + + sord_iter_free(iter); + + const uint8_t* s = USTR("hello"); + SordNode* plain_hello = sord_new_literal(world, 0, s, NULL); + SordNode* type4_hello = sord_new_literal(world, uri(world, 4), s, NULL); + SordNode* type5_hello = sord_new_literal(world, uri(world, 5), s, NULL); + SordNode* gb_hello = sord_new_literal(world, NULL, s, "en-gb"); + SordNode* us_hello = sord_new_literal(world, NULL, s, "en-us"); + +#define NUM_PATTERNS 18 + + QueryTest patterns[NUM_PATTERNS] = { + {{0, 0, 0}, (int)(n_quads * n_objects_per) + 12}, + {{uri(world, 1), 0, 0}, 2}, + {{uri(world, 9), uri(world, 9), uri(world, 9)}, 0}, + {{uri(world, 1), uri(world, 2), uri(world, 4)}, 1}, + {{uri(world, 3), uri(world, 4), uri(world, 0)}, 2}, + {{uri(world, 0), uri(world, 2), uri(world, 4)}, 1}, + {{uri(world, 0), uri(world, 0), uri(world, 4)}, 1}, + {{uri(world, 1), uri(world, 0), uri(world, 0)}, 2}, + {{uri(world, 1), uri(world, 0), uri(world, 4)}, 1}, + {{uri(world, 0), uri(world, 2), uri(world, 0)}, 2}, + {{uri(world, 98), uri(world, 4), plain_hello}, 1}, + {{uri(world, 98), uri(world, 4), type5_hello}, 1}, + {{uri(world, 96), uri(world, 4), type4_hello}, 1}, + {{uri(world, 96), uri(world, 4), type5_hello}, 1}, + {{uri(world, 94), uri(world, 5), plain_hello}, 1}, + {{uri(world, 94), uri(world, 5), gb_hello}, 1}, + {{uri(world, 92), uri(world, 6), gb_hello}, 1}, + {{uri(world, 92), uri(world, 6), us_hello}, 1}}; + + SordQuad match = {uri(world, 1), uri(world, 2), uri(world, 4), g}; + if (!sord_contains(sord, match)) { + return test_fail("Fail: No match for " TUP_FMT "\n", TUP_FMT_ARGS(match)); + } + + SordQuad nomatch = {uri(world, 1), uri(world, 2), uri(world, 9), g}; + if (sord_contains(sord, nomatch)) { + return test_fail("Fail: False match for " TUP_FMT "\n", + TUP_FMT_ARGS(nomatch)); + } + + if (sord_get(sord, NULL, NULL, uri(world, 3), g)) { + return test_fail("Fail: Get *,*,3 succeeded\n"); + } else if (!sord_node_equals( + sord_get(sord, uri(world, 1), uri(world, 2), NULL, g), + uri(world, 3))) { + return test_fail("Fail: Get 1,2,* != 3\n"); + } else if (!sord_node_equals( + sord_get(sord, uri(world, 1), NULL, uri(world, 3), g), + uri(world, 2))) { + return test_fail("Fail: Get 1,*,3 != 2\n"); + } else if (!sord_node_equals( + sord_get(sord, NULL, uri(world, 2), uri(world, 3), g), + uri(world, 1))) { + return test_fail("Fail: Get *,2,3 != 1\n"); + } + + for (unsigned i = 0; i < NUM_PATTERNS; ++i) { + QueryTest test = patterns[i]; + SordQuad pat = {test.query[0], test.query[1], test.query[2], g}; + fprintf(stderr, "Query " TUP_FMT "... ", TUP_FMT_ARGS(pat)); + + iter = sord_find(sord, pat); + int num_results = 0; + for (; !sord_iter_end(iter); sord_iter_next(iter)) { + sord_iter_get(iter, id); + ++num_results; + if (!sord_quad_match(pat, id)) { + sord_iter_free(iter); + return test_fail("Fail: Query result " TUP_FMT + " does not match pattern\n", + TUP_FMT_ARGS(id)); + } + } + sord_iter_free(iter); + if (num_results != test.expected_num_results) { + return test_fail("Fail: Expected %d results, got %d\n", + test.expected_num_results, + num_results); + } + fprintf(stderr, "OK (%i matches)\n", test.expected_num_results); + } + + // Query blank node subject + SordQuad pat = {sord_new_blank(world, USTR("ablank")), 0, 0}; + if (!pat[0]) { + return test_fail("Blank node subject lost\n"); + } + fprintf(stderr, "Query " TUP_FMT "... ", TUP_FMT_ARGS(pat)); + iter = sord_find(sord, pat); + int num_results = 0; + for (; !sord_iter_end(iter); sord_iter_next(iter)) { + sord_iter_get(iter, id); + ++num_results; + if (!sord_quad_match(pat, id)) { + sord_iter_free(iter); + return test_fail("Fail: Query result " TUP_FMT + " does not match pattern\n", + TUP_FMT_ARGS(id)); + } + } + fprintf(stderr, "OK\n"); + sord_node_free(world, (SordNode*)pat[0]); + sord_iter_free(iter); + if (num_results != 2) { + return test_fail("Blank node subject query failed\n"); + } + + // Test nested queries + fprintf(stderr, "Nested Queries... "); + const SordNode* last_subject = 0; + iter = sord_search(sord, NULL, NULL, NULL, NULL); + for (; !sord_iter_end(iter); sord_iter_next(iter)) { + sord_iter_get(iter, id); + if (id[0] == last_subject) { + continue; + } + + SordQuad subpat = {id[0], 0, 0}; + SordIter* subiter = sord_find(sord, subpat); + unsigned num_sub_results = 0; + if (sord_iter_get_node(subiter, SORD_SUBJECT) != id[0]) { + return test_fail("Fail: Incorrect initial submatch\n"); + } + for (; !sord_iter_end(subiter); sord_iter_next(subiter)) { + SordQuad subid; + sord_iter_get(subiter, subid); + if (!sord_quad_match(subpat, subid)) { + sord_iter_free(iter); + sord_iter_free(subiter); + return test_fail("Fail: Nested query result does not match pattern\n"); + } + ++num_sub_results; + } + sord_iter_free(subiter); + if (num_sub_results != n_objects_per) { + return test_fail("Fail: Nested query " TUP_FMT " failed" + " (%u results, expected %u)\n", + TUP_FMT_ARGS(subpat), + num_sub_results, + n_objects_per); + } + + uint64_t count = sord_count(sord, id[0], 0, 0, 0); + if (count != num_sub_results) { + return test_fail("Fail: Query " TUP_FMT " sord_count() %" PRIu64 + "does not match result count %u\n", + TUP_FMT_ARGS(subpat), + count, + num_sub_results); + } + + last_subject = id[0]; + } + fprintf(stderr, "OK\n\n"); + sord_iter_free(iter); + + return ret; +} + +static SerdStatus +unexpected_error(void* handle, const SerdError* error) +{ + fprintf(stderr, "unexpected error: "); + vfprintf(stderr, error->fmt, *error->args); + return SERD_SUCCESS; +} + +static SerdStatus +expected_error(void* handle, const SerdError* error) +{ + fprintf(stderr, "expected error: "); + vfprintf(stderr, error->fmt, *error->args); + ++n_expected_errors; + return SERD_SUCCESS; +} + +static int +finished(SordWorld* world, SordModel* sord, int status) +{ + sord_free(sord); + sord_world_free(world); + return status; +} + +int +main(int argc, char** argv) +{ + static const size_t n_quads = 300; + + sord_free(NULL); // Shouldn't crash + + SordWorld* world = sord_world_new(); + + // Attempt to create invalid URI + fprintf(stderr, "expected "); + SordNode* bad_uri = sord_new_uri(world, USTR("noscheme")); + if (bad_uri) { + return test_fail("Successfully created invalid URI \"noscheme\"\n"); + } + sord_node_free(world, bad_uri); + + sord_world_set_error_sink(world, expected_error, NULL); + + // Attempt to create invalid CURIE + SerdNode base = serd_node_from_string(SERD_URI, USTR("http://example.org/")); + SerdEnv* env = serd_env_new(&base); + SerdNode sbad = serd_node_from_string(SERD_CURIE, USTR("bad:")); + SordNode* bad = sord_node_from_serd_node(world, env, &sbad, NULL, NULL); + if (bad) { + return test_fail("Successfully created CURIE with bad namespace\n"); + } + sord_node_free(world, bad); + serd_env_free(env); + + // Attempt to create node from garbage + SerdNode junk = SERD_NODE_NULL; + junk.type = (SerdType)1234; + if (sord_node_from_serd_node(world, env, &junk, NULL, NULL)) { + return test_fail("Successfully created node from garbage serd node\n"); + } + + // Attempt to create NULL node + SordNode* nil_node = + sord_node_from_serd_node(world, NULL, &SERD_NODE_NULL, NULL, NULL); + if (nil_node) { + return test_fail("Successfully created NULL node\n"); + } + sord_node_free(world, nil_node); + + // Check node flags are set properly + SordNode* with_newline = sord_new_literal(world, NULL, USTR("a\nb"), NULL); + if (!(sord_node_get_flags(with_newline) & SERD_HAS_NEWLINE)) { + return test_fail("Newline flag not set\n"); + } + SordNode* with_quote = sord_new_literal(world, NULL, USTR("a\"b"), NULL); + if (!(sord_node_get_flags(with_quote) & SERD_HAS_QUOTE)) { + return test_fail("Quote flag not set\n"); + } + + // Create with minimal indexing + SordModel* sord = sord_new(world, SORD_SPO, false); + generate(world, sord, n_quads, NULL); + + if (test_read(world, sord, NULL, n_quads)) { + sord_free(sord); + sord_world_free(world); + return EXIT_FAILURE; + } + + // Check adding tuples with NULL fields fails + sord_world_set_error_sink(world, expected_error, NULL); + const size_t initial_num_quads = sord_num_quads(sord); + SordQuad tup = {0, 0, 0, 0}; + if (sord_add(sord, tup)) { + return test_fail("Added NULL tuple\n"); + } + tup[0] = uri(world, 1); + if (sord_add(sord, tup)) { + return test_fail("Added tuple with NULL P and O\n"); + } + tup[1] = uri(world, 2); + if (sord_add(sord, tup)) { + return test_fail("Added tuple with NULL O\n"); + } + + if (sord_num_quads(sord) != initial_num_quads) { + return test_fail( + "Num quads %zu != %zu\n", sord_num_quads(sord), initial_num_quads); + } + + // Check adding tuples with an active iterator fails + SordIter* iter = sord_begin(sord); + tup[2] = uri(world, 3); + if (sord_add(sord, tup)) { + return test_fail("Added tuple with active iterator\n"); + } + + // Check removing tuples with several active iterator fails + SordIter* iter2 = sord_begin(sord); + if (!sord_erase(sord, iter)) { + return test_fail("Erased tuple with several active iterators\n"); + } + n_expected_errors = 0; + sord_remove(sord, tup); + if (n_expected_errors != 1) { + return test_fail("Removed tuple with several active iterators\n"); + } + sord_iter_free(iter); + sord_iter_free(iter2); + + sord_world_set_error_sink(world, unexpected_error, NULL); + + // Check interning merges equivalent values + SordNode* uri_id = sord_new_uri(world, USTR("http://example.org")); + SordNode* blank_id = sord_new_blank(world, USTR("testblank")); + SordNode* lit_id = sord_new_literal(world, uri_id, USTR("hello"), NULL); + if (sord_node_get_type(uri_id) != SORD_URI) { + return test_fail("URI node has incorrect type\n"); + } else if (sord_node_get_type(blank_id) != SORD_BLANK) { + return test_fail("Blank node has incorrect type\n"); + } else if (sord_node_get_type(lit_id) != SORD_LITERAL) { + return test_fail("Literal node has incorrect type\n"); + } + + const size_t initial_num_nodes = sord_num_nodes(world); + + SordNode* uri_id2 = sord_new_uri(world, USTR("http://example.org")); + SordNode* blank_id2 = sord_new_blank(world, USTR("testblank")); + SordNode* lit_id2 = sord_new_literal(world, uri_id, USTR("hello"), NULL); + if (uri_id2 != uri_id || !sord_node_equals(uri_id2, uri_id)) { + fprintf(stderr, "Fail: URI interning failed (duplicates)\n"); + return finished(world, sord, EXIT_FAILURE); + } else if (blank_id2 != blank_id || !sord_node_equals(blank_id2, blank_id)) { + fprintf(stderr, "Fail: Blank node interning failed (duplicates)\n"); + return finished(world, sord, EXIT_FAILURE); + } else if (lit_id2 != lit_id || !sord_node_equals(lit_id2, lit_id)) { + fprintf(stderr, "Fail: Literal interning failed (duplicates)\n"); + return finished(world, sord, EXIT_FAILURE); + } + + if (sord_num_nodes(world) != initial_num_nodes) { + return test_fail( + "Num nodes %zu != %zu\n", sord_num_nodes(world), initial_num_nodes); + } + + const uint8_t ni_hao[] = {0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD, 0}; + SordNode* chello = sord_new_literal(world, NULL, ni_hao, "cmn"); + + // Test literal length + size_t n_bytes; + size_t n_chars; + const uint8_t* str = sord_node_get_string_counted(lit_id2, &n_bytes); + if (strcmp((const char*)str, "hello")) { + return test_fail("Literal node corrupt\n"); + } else if (n_bytes != strlen("hello")) { + return test_fail("ASCII literal byte count incorrect\n"); + } + + str = sord_node_get_string_measured(lit_id2, &n_bytes, &n_chars); + if (n_bytes != strlen("hello") || n_chars != strlen("hello")) { + return test_fail("ASCII literal measured length incorrect\n"); + } else if (strcmp((const char*)str, "hello")) { + return test_fail("ASCII literal string incorrect\n"); + } + + str = sord_node_get_string_measured(chello, &n_bytes, &n_chars); + if (n_bytes != 6) { + return test_fail("Multi-byte literal byte count incorrect\n"); + } else if (n_chars != 2) { + return test_fail("Multi-byte literal character count incorrect\n"); + } else if (strcmp((const char*)str, (const char*)ni_hao)) { + return test_fail("Multi-byte literal string incorrect\n"); + } + + // Check interning doesn't clash non-equivalent values + SordNode* uri_id3 = sord_new_uri(world, USTR("http://example.orgX")); + SordNode* blank_id3 = sord_new_blank(world, USTR("testblankX")); + SordNode* lit_id3 = sord_new_literal(world, uri_id, USTR("helloX"), NULL); + if (uri_id3 == uri_id || sord_node_equals(uri_id3, uri_id)) { + fprintf(stderr, "Fail: URI interning failed (clash)\n"); + return finished(world, sord, EXIT_FAILURE); + } else if (blank_id3 == blank_id || sord_node_equals(blank_id3, blank_id)) { + fprintf(stderr, "Fail: Blank node interning failed (clash)\n"); + return finished(world, sord, EXIT_FAILURE); + } else if (lit_id3 == lit_id || sord_node_equals(lit_id3, lit_id)) { + fprintf(stderr, "Fail: Literal interning failed (clash)\n"); + return finished(world, sord, EXIT_FAILURE); + } + + // Check literal interning + SordNode* lit4 = sord_new_literal(world, NULL, USTR("hello"), NULL); + SordNode* lit5 = sord_new_literal(world, uri_id2, USTR("hello"), NULL); + SordNode* lit6 = sord_new_literal(world, NULL, USTR("hello"), "en-ca"); + if (lit4 == lit5 || sord_node_equals(lit4, lit5) || lit4 == lit6 || + sord_node_equals(lit4, lit6) || lit5 == lit6 || + sord_node_equals(lit5, lit6)) { + fprintf(stderr, "Fail: Literal interning failed (type/lang clash)\n"); + return finished(world, sord, EXIT_FAILURE); + } + + // Check relative URI construction + SordNode* reluri = + sord_new_relative_uri(world, USTR("a/b"), USTR("http://example.org/")); + if (strcmp((const char*)sord_node_get_string(reluri), + "http://example.org/a/b")) { + fprintf(stderr, + "Fail: Bad relative URI constructed: <%s>\n", + sord_node_get_string(reluri)); + return finished(world, sord, EXIT_FAILURE); + } + SordNode* reluri2 = sord_new_relative_uri( + world, USTR("http://drobilla.net/"), USTR("http://example.org/")); + if (strcmp((const char*)sord_node_get_string(reluri2), + "http://drobilla.net/")) { + fprintf(stderr, + "Fail: Bad relative URI constructed: <%s>\n", + sord_node_get_string(reluri)); + return finished(world, sord, EXIT_FAILURE); + } + + // Check comparison with NULL + sord_node_free(world, uri_id); + sord_node_free(world, blank_id); + sord_node_free(world, lit_id); + sord_node_free(world, uri_id2); + sord_node_free(world, blank_id2); + sord_node_free(world, lit_id2); + sord_node_free(world, uri_id3); + sord_node_free(world, blank_id3); + sord_node_free(world, lit_id3); + sord_free(sord); + + static const char* const index_names[6] = { + "spo", "sop", "ops", "osp", "pso", "pos"}; + + for (int i = 0; i < 6; ++i) { + sord = sord_new(world, (1 << i), false); + printf("Testing Index `%s'\n", index_names[i]); + generate(world, sord, n_quads, 0); + if (test_read(world, sord, 0, n_quads)) { + return finished(world, sord, EXIT_FAILURE); + } + sord_free(sord); + } + + static const char* const graph_index_names[6] = { + "gspo", "gsop", "gops", "gosp", "gpso", "gpos"}; + + for (int i = 0; i < 6; ++i) { + sord = sord_new(world, (1 << i), true); + printf("Testing Index `%s'\n", graph_index_names[i]); + SordNode* graph = uri(world, 42); + generate(world, sord, n_quads, graph); + if (test_read(world, sord, graph, n_quads)) { + return finished(world, sord, EXIT_FAILURE); + } + sord_free(sord); + } + + // Test removing + sord = sord_new(world, SORD_SPO, true); + tup[0] = uri(world, 1); + tup[1] = uri(world, 2); + tup[2] = sord_new_literal(world, 0, USTR("hello"), NULL); + tup[3] = 0; + sord_add(sord, tup); + if (!sord_ask(sord, tup[0], tup[1], tup[2], tup[3])) { + fprintf(stderr, "Failed to add tuple\n"); + return finished(world, sord, EXIT_FAILURE); + } + sord_node_free(world, (SordNode*)tup[2]); + tup[2] = sord_new_literal(world, 0, USTR("hi"), NULL); + sord_add(sord, tup); + sord_remove(sord, tup); + if (sord_num_quads(sord) != 1) { + fprintf( + stderr, "Remove failed (%zu quads, expected 1)\n", sord_num_quads(sord)); + return finished(world, sord, EXIT_FAILURE); + } + + iter = sord_find(sord, tup); + if (!sord_iter_end(iter)) { + fprintf(stderr, "Found removed tuple\n"); + return finished(world, sord, EXIT_FAILURE); + } + sord_iter_free(iter); + + // Test double remove (silent success) + sord_remove(sord, tup); + + // Load a couple graphs + SordNode* graph42 = uri(world, 42); + SordNode* graph43 = uri(world, 43); + generate(world, sord, 1, graph42); + generate(world, sord, 1, graph43); + + // Remove one graph via iterator + SerdStatus st; + iter = sord_search(sord, NULL, NULL, NULL, graph43); + while (!sord_iter_end(iter)) { + if ((st = sord_erase(sord, iter))) { + fprintf(stderr, "Remove by iterator failed (%s)\n", serd_strerror(st)); + return finished(world, sord, EXIT_FAILURE); + } + } + sord_iter_free(iter); + + // Erase the first tuple (an element in the default graph) + iter = sord_begin(sord); + if (sord_erase(sord, iter)) { + return test_fail("Failed to erase begin iterator on non-empty model\n"); + } + sord_iter_free(iter); + + // Ensure only the other graph is left + SordQuad quad; + SordQuad pat = {0, 0, 0, graph42}; + for (iter = sord_begin(sord); !sord_iter_end(iter); sord_iter_next(iter)) { + sord_iter_get(iter, quad); + if (!sord_quad_match(quad, pat)) { + fprintf(stderr, "Graph removal via iteration failed\n"); + return finished(world, sord, EXIT_FAILURE); + } + } + sord_iter_free(iter); + + // Load file into two separate graphs + sord_free(sord); + sord = sord_new(world, SORD_SPO, true); + env = serd_env_new(&base); + SordNode* graph1 = sord_new_uri(world, USTR("http://example.org/graph1")); + SordNode* graph2 = sord_new_uri(world, USTR("http://example.org/graph2")); + SerdReader* reader = sord_new_reader(sord, env, SERD_TURTLE, graph1); + if ((st = serd_reader_read_string(reader, USTR("

.")))) { + fprintf(stderr, "Failed to read string (%s)\n", serd_strerror(st)); + return finished(world, sord, EXIT_FAILURE); + } + serd_reader_free(reader); + reader = sord_new_reader(sord, env, SERD_TURTLE, graph2); + if ((st = serd_reader_read_string(reader, USTR("

.")))) { + fprintf(stderr, "Failed to re-read string (%s)\n", serd_strerror(st)); + return finished(world, sord, EXIT_FAILURE); + } + serd_reader_free(reader); + serd_env_free(env); + + // Ensure we only see triple once + size_t n_triples = 0; + for (iter = sord_begin(sord); !sord_iter_end(iter); sord_iter_next(iter)) { + fprintf(stderr, + "%s %s %s %s\n", + sord_node_get_string(sord_iter_get_node(iter, SORD_SUBJECT)), + sord_node_get_string(sord_iter_get_node(iter, SORD_PREDICATE)), + sord_node_get_string(sord_iter_get_node(iter, SORD_OBJECT)), + sord_node_get_string(sord_iter_get_node(iter, SORD_GRAPH))); + + ++n_triples; + } + sord_iter_free(iter); + if (n_triples != 1) { + fprintf(stderr, "Found duplicate triple\n"); + return finished(world, sord, EXIT_FAILURE); + } + + // Test SPO iteration on an SOP indexed store + sord_free(sord); + sord = sord_new(world, SORD_SOP, false); + generate(world, sord, 1, graph42); + for (iter = sord_begin(sord); !sord_iter_end(iter); sord_iter_next(iter)) { + ++n_triples; + } + sord_iter_free(iter); + + return finished(world, sord, EXIT_SUCCESS); +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,804 @@ +/* + Copyright 2012-2021 David Robillard + + 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. +*/ + +#define _BSD_SOURCE 1 // for realpath +#define _DEFAULT_SOURCE 1 // for realpath + +#include "serd/serd.h" +#include "sord/sord.h" +#include "sord_config.h" + +#if USE_PCRE +# include +#endif + +#ifdef _WIN32 +# include +#endif + +#include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# define SORD_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define SORD_LOG_FUNC(fmt, arg1) +#endif + +#define NS_foaf (const uint8_t*)"http://xmlns.com/foaf/0.1/" +#define NS_owl (const uint8_t*)"http://www.w3.org/2002/07/owl#" +#define NS_rdf (const uint8_t*)"http://www.w3.org/1999/02/22-rdf-syntax-ns#" +#define NS_rdfs (const uint8_t*)"http://www.w3.org/2000/01/rdf-schema#" +#define NS_xsd (const uint8_t*)"http://www.w3.org/2001/XMLSchema#" + +typedef struct { + SordNode* foaf_Document; + SordNode* owl_AnnotationProperty; + SordNode* owl_Class; + SordNode* owl_DatatypeProperty; + SordNode* owl_FunctionalProperty; + SordNode* owl_InverseFunctionalProperty; + SordNode* owl_ObjectProperty; + SordNode* owl_OntologyProperty; + SordNode* owl_Restriction; + SordNode* owl_Thing; + SordNode* owl_cardinality; + SordNode* owl_equivalentClass; + SordNode* owl_maxCardinality; + SordNode* owl_minCardinality; + SordNode* owl_onDatatype; + SordNode* owl_onProperty; + SordNode* owl_someValuesFrom; + SordNode* owl_withRestrictions; + SordNode* rdf_PlainLiteral; + SordNode* rdf_Property; + SordNode* rdf_first; + SordNode* rdf_rest; + SordNode* rdf_type; + SordNode* rdfs_Class; + SordNode* rdfs_Literal; + SordNode* rdfs_Resource; + SordNode* rdfs_domain; + SordNode* rdfs_label; + SordNode* rdfs_range; + SordNode* rdfs_subClassOf; + SordNode* xsd_anyURI; + SordNode* xsd_decimal; + SordNode* xsd_double; + SordNode* xsd_maxInclusive; + SordNode* xsd_minInclusive; + SordNode* xsd_pattern; + SordNode* xsd_string; +} URIs; + +static int n_errors = 0; +static int n_restrictions = 0; +static bool one_line_errors = false; + +static int +print_version(void) +{ + printf("sord_validate " SORD_VERSION + " \n"); + printf("Copyright 2012-2021 David Robillard .\n" + "License: \n" + "This is free software; you are free to change and redistribute it." + "\nThere is NO WARRANTY, to the extent permitted by law.\n"); + return 0; +} + +static int +print_usage(const char* name, bool error) +{ + FILE* const os = error ? stderr : stdout; + fprintf(os, "Usage: %s [OPTION]... INPUT...\n", name); + fprintf(os, "Validate RDF data\n\n"); + fprintf(os, " -h Display this help and exit\n"); + fprintf(os, " -l Print errors on a single line.\n"); + fprintf(os, " -v Display version information and exit\n"); + fprintf(os, + "Validate RDF data. This is a simple validator which checks\n" + "that all used properties are actually defined. It does not do\n" + "any fancy file retrieval, the files passed on the command line\n" + "are the only data that is read. In other words, you must pass\n" + "the definition of all vocabularies used on the command line.\n"); + return error ? 1 : 0; +} + +static uint8_t* +absolute_path(const uint8_t* path) +{ +#ifdef _WIN32 + char* out = (char*)malloc(MAX_PATH); + GetFullPathName((const char*)path, MAX_PATH, out, NULL); + return (uint8_t*)out; +#else + return (uint8_t*)realpath((const char*)path, NULL); +#endif +} + +SORD_LOG_FUNC(2, 3) +static int +errorf(const SordQuad quad, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, args); + va_end(args); + + const char* sep = one_line_errors ? "\t" : "\n "; + fprintf(stderr, + "%s%s%s%s%s%s\n", + sep, + (const char*)sord_node_get_string(quad[SORD_SUBJECT]), + sep, + (const char*)sord_node_get_string(quad[SORD_PREDICATE]), + sep, + (const char*)sord_node_get_string(quad[SORD_OBJECT])); + + ++n_errors; + return 1; +} + +static bool +is_descendant_of(SordModel* model, + const URIs* uris, + const SordNode* child, + const SordNode* parent, + const SordNode* pred) +{ + if (!child) { + return false; + } else if (sord_node_equals(child, parent) || + sord_ask(model, child, uris->owl_equivalentClass, parent, NULL)) { + return true; + } + + SordIter* i = sord_search(model, child, pred, NULL, NULL); + for (; !sord_iter_end(i); sord_iter_next(i)) { + const SordNode* o = sord_iter_get_node(i, SORD_OBJECT); + if (sord_node_equals(child, o)) { + continue; // Weird class is explicitly a descendent of itself + } + if (is_descendant_of(model, uris, o, parent, pred)) { + sord_iter_free(i); + return true; + } + } + sord_iter_free(i); + + return false; +} + +static bool +regexp_match(const uint8_t* pat, const char* str) +{ +#if USE_PCRE + // Append a $ to the pattern so we only match if the entire string matches + const size_t len = strlen((const char*)pat); + char* const regx = (char*)malloc(len + 2); + memcpy(regx, pat, len); + regx[len] = '$'; + regx[len + 1] = '\0'; + + const char* err; + int erroffset; + pcre* re = pcre_compile(regx, PCRE_ANCHORED, &err, &erroffset, NULL); + free(regx); + if (!re) { + fprintf( + stderr, "Error in pattern `%s' at offset %d (%s)\n", pat, erroffset, err); + return false; + } + + const bool ret = pcre_exec(re, NULL, str, strlen(str), 0, 0, NULL, 0) >= 0; + pcre_free(re); + return ret; +#endif // USE_PCRE + return true; +} + +static int +bound_cmp(SordModel* model, + const URIs* uris, + const SordNode* literal, + const SordNode* type, + const SordNode* bound) +{ + const char* str = (const char*)sord_node_get_string(literal); + const char* bound_str = (const char*)sord_node_get_string(bound); + const SordNode* pred = uris->owl_onDatatype; + const bool is_numeric = + is_descendant_of(model, uris, type, uris->xsd_decimal, pred) || + is_descendant_of(model, uris, type, uris->xsd_double, pred); + + if (is_numeric) { + const double fbound = serd_strtod(bound_str, NULL); + const double fliteral = serd_strtod(str, NULL); + return ((fliteral < fbound) ? -1 : (fliteral > fbound) ? 1 : 0); + } else { + return strcmp(str, bound_str); + } +} + +static bool +check_restriction(SordModel* model, + const URIs* uris, + const SordNode* literal, + const SordNode* type, + const SordNode* restriction) +{ + size_t len = 0; + const char* str = (const char*)sord_node_get_string_counted(literal, &len); + + // Check xsd:pattern + SordIter* p = sord_search(model, restriction, uris->xsd_pattern, 0, 0); + if (p) { + const SordNode* pat = sord_iter_get_node(p, SORD_OBJECT); + if (!regexp_match(sord_node_get_string(pat), str)) { + fprintf(stderr, + "`%s' does not match <%s> pattern `%s'\n", + sord_node_get_string(literal), + sord_node_get_string(type), + sord_node_get_string(pat)); + sord_iter_free(p); + return false; + } + sord_iter_free(p); + ++n_restrictions; + } + + // Check xsd:minInclusive + SordIter* l = sord_search(model, restriction, uris->xsd_minInclusive, 0, 0); + if (l) { + const SordNode* lower = sord_iter_get_node(l, SORD_OBJECT); + if (bound_cmp(model, uris, literal, type, lower) < 0) { + fprintf(stderr, + "`%s' is not >= <%s> minimum `%s'\n", + sord_node_get_string(literal), + sord_node_get_string(type), + sord_node_get_string(lower)); + sord_iter_free(l); + return false; + } + sord_iter_free(l); + ++n_restrictions; + } + + // Check xsd:maxInclusive + SordIter* u = sord_search(model, restriction, uris->xsd_maxInclusive, 0, 0); + if (u) { + const SordNode* upper = sord_iter_get_node(u, SORD_OBJECT); + if (bound_cmp(model, uris, literal, type, upper) > 0) { + fprintf(stderr, + "`%s' is not <= <%s> maximum `%s'\n", + sord_node_get_string(literal), + sord_node_get_string(type), + sord_node_get_string(upper)); + sord_iter_free(u); + return false; + } + sord_iter_free(u); + ++n_restrictions; + } + + return true; // Unknown restriction, be quietly tolerant +} + +static bool +literal_is_valid(SordModel* model, + const URIs* uris, + const SordQuad quad, + const SordNode* literal, + const SordNode* type) +{ + if (!type) { + return true; + } + + /* Check that literal data is related to required type. We don't do a + strict subtype check here because e.g. an xsd:decimal might be a valid + xsd:unsignedInt, which the pattern checks will verify, but if the + literal type is not related to the required type at all + (e.g. xsd:decimal and xsd:string) there is a problem. */ + const SordNode* datatype = sord_node_get_datatype(literal); + if (datatype && datatype != type) { + if (!is_descendant_of(model, uris, datatype, type, uris->owl_onDatatype) && + !is_descendant_of(model, uris, type, datatype, uris->owl_onDatatype) && + !(sord_node_equals(datatype, uris->xsd_decimal) && + is_descendant_of( + model, uris, type, uris->xsd_double, uris->owl_onDatatype))) { + errorf(quad, + "Literal `%s' datatype <%s> is not compatible with <%s>\n", + sord_node_get_string(literal), + sord_node_get_string(datatype), + sord_node_get_string(type)); + return false; + } + } + + // Find restrictions list + SordIter* rs = sord_search(model, type, uris->owl_withRestrictions, 0, 0); + if (sord_iter_end(rs)) { + return true; // No restrictions + } + + // Walk list, checking each restriction + const SordNode* head = sord_iter_get_node(rs, SORD_OBJECT); + while (head) { + SordIter* f = sord_search(model, head, uris->rdf_first, 0, 0); + if (!f) { + break; // Reached end of restrictions list without failure + } + + // Check this restriction + const bool good = check_restriction( + model, uris, literal, type, sord_iter_get_node(f, SORD_OBJECT)); + sord_iter_free(f); + + if (!good) { + sord_iter_free(rs); + return false; // Failed, literal is invalid + } + + // Seek to next list node + SordIter* n = sord_search(model, head, uris->rdf_rest, 0, 0); + head = n ? sord_iter_get_node(n, SORD_OBJECT) : NULL; + sord_iter_free(n); + } + + sord_iter_free(rs); + + SordIter* s = sord_search(model, type, uris->owl_onDatatype, 0, 0); + if (s) { + const SordNode* super = sord_iter_get_node(s, SORD_OBJECT); + const bool good = literal_is_valid(model, uris, quad, literal, super); + sord_iter_free(s); + return good; // Match iff literal also matches supertype + } + + return true; // Matches top level type +} + +static bool +check_type(SordModel* model, + const URIs* uris, + const SordQuad quad, + const SordNode* node, + const SordNode* type) +{ + if (sord_node_equals(type, uris->rdfs_Resource) || + sord_node_equals(type, uris->owl_Thing)) { + return true; + } + + if (sord_node_get_type(node) == SORD_LITERAL) { + if (sord_node_equals(type, uris->rdfs_Literal)) { + return true; + } else if (sord_node_equals(type, uris->rdf_PlainLiteral)) { + return !sord_node_get_language(node); + } else { + return literal_is_valid(model, uris, quad, node, type); + } + } else if (sord_node_get_type(node) == SORD_URI) { + if (sord_node_equals(type, uris->foaf_Document)) { + return true; // Questionable... + } else if (is_descendant_of( + model, uris, type, uris->xsd_anyURI, uris->owl_onDatatype)) { + /* Type is any URI and this is a URI, so pass. Restrictions on + anyURI subtypes are not currently checked (very uncommon). */ + return true; // Type is anyURI, and this is a URI + } else { + SordIter* t = sord_search(model, node, uris->rdf_type, NULL, NULL); + for (; !sord_iter_end(t); sord_iter_next(t)) { + if (is_descendant_of(model, + uris, + sord_iter_get_node(t, SORD_OBJECT), + type, + uris->rdfs_subClassOf)) { + sord_iter_free(t); + return true; + } + } + sord_iter_free(t); + return false; + } + } else { + return true; // Blanks often lack explicit types, ignore + } + + return false; +} + +static uint64_t +count_non_blanks(SordIter* i, SordQuadIndex field) +{ + uint64_t n = 0; + for (; !sord_iter_end(i); sord_iter_next(i)) { + const SordNode* node = sord_iter_get_node(i, field); + if (sord_node_get_type(node) != SORD_BLANK) { + ++n; + } + } + return n; +} + +static int +check_properties(SordModel* model, URIs* uris) +{ + int st = 0; + SordIter* i = sord_begin(model); + for (; !sord_iter_end(i); sord_iter_next(i)) { + SordQuad quad; + sord_iter_get(i, quad); + + const SordNode* subj = quad[SORD_SUBJECT]; + const SordNode* pred = quad[SORD_PREDICATE]; + const SordNode* obj = quad[SORD_OBJECT]; + + bool is_any_property = false; + SordIter* t = sord_search(model, pred, uris->rdf_type, NULL, NULL); + for (; !sord_iter_end(t); sord_iter_next(t)) { + if (is_descendant_of(model, + uris, + sord_iter_get_node(t, SORD_OBJECT), + uris->rdf_Property, + uris->rdfs_subClassOf)) { + is_any_property = true; + break; + } + } + sord_iter_free(t); + + const bool is_ObjectProperty = + sord_ask(model, pred, uris->rdf_type, uris->owl_ObjectProperty, 0); + const bool is_FunctionalProperty = + sord_ask(model, pred, uris->rdf_type, uris->owl_FunctionalProperty, 0); + const bool is_InverseFunctionalProperty = sord_ask( + model, pred, uris->rdf_type, uris->owl_InverseFunctionalProperty, 0); + const bool is_DatatypeProperty = + sord_ask(model, pred, uris->rdf_type, uris->owl_DatatypeProperty, 0); + + if (!is_any_property) { + st = errorf(quad, "Use of undefined property"); + } + + if (!sord_ask(model, pred, uris->rdfs_label, NULL, NULL)) { + st = + errorf(quad, "Property <%s> has no label", sord_node_get_string(pred)); + } + + if (is_DatatypeProperty && sord_node_get_type(obj) != SORD_LITERAL) { + st = errorf(quad, "Datatype property with non-literal value"); + } + + if (is_ObjectProperty && sord_node_get_type(obj) == SORD_LITERAL) { + st = errorf(quad, "Object property with literal value"); + } + + if (is_FunctionalProperty) { + SordIter* o = sord_search(model, subj, pred, NULL, NULL); + const unsigned n = count_non_blanks(o, SORD_OBJECT); + if (n > 1) { + st = errorf(quad, "Functional property with %u objects", n); + } + sord_iter_free(o); + } + + if (is_InverseFunctionalProperty) { + SordIter* s = sord_search(model, NULL, pred, obj, NULL); + const unsigned n = count_non_blanks(s, SORD_SUBJECT); + if (n > 1) { + st = errorf(quad, "Inverse functional property with %u subjects", n); + } + sord_iter_free(s); + } + + if (sord_node_equals(pred, uris->rdf_type) && + !sord_ask(model, obj, uris->rdf_type, uris->rdfs_Class, NULL) && + !sord_ask(model, obj, uris->rdf_type, uris->owl_Class, NULL)) { + st = errorf(quad, "Type is not a rdfs:Class or owl:Class"); + } + + if (sord_node_get_type(obj) == SORD_LITERAL && + !literal_is_valid( + model, uris, quad, obj, sord_node_get_datatype(obj))) { + st = errorf(quad, "Literal does not match datatype"); + } + + SordIter* r = sord_search(model, pred, uris->rdfs_range, NULL, NULL); + for (; !sord_iter_end(r); sord_iter_next(r)) { + const SordNode* range = sord_iter_get_node(r, SORD_OBJECT); + if (!check_type(model, uris, quad, obj, range)) { + st = errorf( + quad, "Object not in range <%s>\n", sord_node_get_string(range)); + } + } + sord_iter_free(r); + + SordIter* d = sord_search(model, pred, uris->rdfs_domain, NULL, NULL); + if (d) { + const SordNode* domain = sord_iter_get_node(d, SORD_OBJECT); + if (!check_type(model, uris, quad, subj, domain)) { + st = errorf( + quad, "Subject not in domain <%s>", sord_node_get_string(domain)); + } + sord_iter_free(d); + } + } + sord_iter_free(i); + + return st; +} + +static int +check_instance(SordModel* model, + const URIs* uris, + const SordNode* restriction, + const SordQuad quad) +{ + const SordNode* instance = quad[SORD_SUBJECT]; + int st = 0; + + const SordNode* prop = + sord_get(model, restriction, uris->owl_onProperty, NULL, NULL); + if (!prop) { + return 0; + } + + const unsigned values = sord_count(model, instance, prop, NULL, NULL); + + // Check exact cardinality + const SordNode* card = + sord_get(model, restriction, uris->owl_cardinality, NULL, NULL); + if (card) { + const unsigned c = atoi((const char*)sord_node_get_string(card)); + if (values != c) { + st = errorf(quad, + "Property %s on %s has %u != %u values", + sord_node_get_string(prop), + sord_node_get_string(instance), + values, + c); + } + } + + // Check minimum cardinality + const SordNode* minCard = + sord_get(model, restriction, uris->owl_minCardinality, NULL, NULL); + if (minCard) { + const unsigned m = atoi((const char*)sord_node_get_string(minCard)); + if (values < m) { + st = errorf(quad, + "Property %s on %s has %u < %u values", + sord_node_get_string(prop), + sord_node_get_string(instance), + values, + m); + } + } + + // Check maximum cardinality + const SordNode* maxCard = + sord_get(model, restriction, uris->owl_maxCardinality, NULL, NULL); + if (maxCard) { + const unsigned m = atoi((const char*)sord_node_get_string(maxCard)); + if (values < m) { + st = errorf(quad, + "Property %s on %s has %u > %u values", + sord_node_get_string(prop), + sord_node_get_string(instance), + values, + m); + } + } + + // Check someValuesFrom + SordIter* sf = + sord_search(model, restriction, uris->owl_someValuesFrom, NULL, NULL); + if (sf) { + const SordNode* type = sord_iter_get_node(sf, SORD_OBJECT); + + SordIter* v = sord_search(model, instance, prop, NULL, NULL); + bool found = false; + for (; !sord_iter_end(v); sord_iter_next(v)) { + const SordNode* value = sord_iter_get_node(v, SORD_OBJECT); + if (check_type(model, uris, quad, value, type)) { + found = true; + break; + } + } + if (!found) { + st = errorf(quad, + "%s has no <%s> values of type <%s>\n", + sord_node_get_string(instance), + sord_node_get_string(prop), + sord_node_get_string(type)); + } + sord_iter_free(v); + } + sord_iter_free(sf); + + return st; +} + +static int +check_class_instances(SordModel* model, + const URIs* uris, + const SordNode* restriction, + const SordNode* klass) +{ + // Check immediate instances of this class + SordIter* i = sord_search(model, NULL, uris->rdf_type, klass, NULL); + for (; !sord_iter_end(i); sord_iter_next(i)) { + SordQuad quad; + sord_iter_get(i, quad); + check_instance(model, uris, restriction, quad); + } + sord_iter_free(i); + + // Check instances of all subclasses recursively + SordIter* s = sord_search(model, NULL, uris->rdfs_subClassOf, klass, NULL); + for (; !sord_iter_end(s); sord_iter_next(s)) { + const SordNode* subklass = sord_iter_get_node(s, SORD_SUBJECT); + check_class_instances(model, uris, restriction, subklass); + } + sord_iter_free(s); + + return 0; +} + +static int +check_instances(SordModel* model, const URIs* uris) +{ + int st = 0; + SordIter* r = + sord_search(model, NULL, uris->rdf_type, uris->owl_Restriction, NULL); + for (; !sord_iter_end(r); sord_iter_next(r)) { + const SordNode* restriction = sord_iter_get_node(r, SORD_SUBJECT); + const SordNode* prop = + sord_get(model, restriction, uris->owl_onProperty, NULL, NULL); + if (!prop) { + continue; + } + + SordIter* c = + sord_search(model, NULL, uris->rdfs_subClassOf, restriction, NULL); + for (; !sord_iter_end(c); sord_iter_next(c)) { + const SordNode* klass = sord_iter_get_node(c, SORD_SUBJECT); + check_class_instances(model, uris, restriction, klass); + } + sord_iter_free(c); + } + sord_iter_free(r); + + return st; +} + +int +main(int argc, char** argv) +{ + if (argc < 2) { + return print_usage(argv[0], true); + } + + int a = 1; + for (; a < argc && argv[a][0] == '-'; ++a) { + if (argv[a][1] == 'l') { + one_line_errors = true; + } else if (argv[a][1] == 'v') { + return print_version(); + } else { + fprintf(stderr, "%s: Unknown option `%s'\n", argv[0], argv[a]); + return print_usage(argv[0], true); + } + } + + SordWorld* world = sord_world_new(); + SordModel* model = sord_new(world, SORD_SPO | SORD_OPS, false); + SerdEnv* env = serd_env_new(&SERD_NODE_NULL); + SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL); + + for (; a < argc; ++a) { + const uint8_t* input = (const uint8_t*)argv[a]; + uint8_t* rel_in_path = serd_file_uri_parse(input, NULL); + uint8_t* in_path = absolute_path(rel_in_path); + + free(rel_in_path); + if (!in_path) { + fprintf(stderr, "Skipping file %s\n", input); + continue; + } + + SerdURI base_uri; + SerdNode base_uri_node = + serd_node_new_file_uri(in_path, NULL, &base_uri, true); + + serd_env_set_base_uri(env, &base_uri_node); + const SerdStatus st = serd_reader_read_file(reader, in_path); + if (st) { + fprintf(stderr, "error reading %s: %s\n", in_path, serd_strerror(st)); + } + + serd_node_free(&base_uri_node); + free(in_path); + } + serd_reader_free(reader); + serd_env_free(env); + +#define URI(prefix, suffix) \ + uris.prefix##_##suffix = sord_new_uri(world, NS_##prefix #suffix) + + URIs uris; + URI(foaf, Document); + URI(owl, AnnotationProperty); + URI(owl, Class); + URI(owl, DatatypeProperty); + URI(owl, FunctionalProperty); + URI(owl, InverseFunctionalProperty); + URI(owl, ObjectProperty); + URI(owl, OntologyProperty); + URI(owl, Restriction); + URI(owl, Thing); + URI(owl, cardinality); + URI(owl, equivalentClass); + URI(owl, maxCardinality); + URI(owl, minCardinality); + URI(owl, onDatatype); + URI(owl, onProperty); + URI(owl, someValuesFrom); + URI(owl, withRestrictions); + URI(rdf, PlainLiteral); + URI(rdf, Property); + URI(rdf, first); + URI(rdf, rest); + URI(rdf, type); + URI(rdfs, Class); + URI(rdfs, Literal); + URI(rdfs, Resource); + URI(rdfs, domain); + URI(rdfs, label); + URI(rdfs, range); + URI(rdfs, subClassOf); + URI(xsd, anyURI); + URI(xsd, decimal); + URI(xsd, double); + URI(xsd, maxInclusive); + URI(xsd, minInclusive); + URI(xsd, pattern); + URI(xsd, string); + +#if !USE_PCRE + fprintf(stderr, "warning: Built without PCRE, datatypes not checked.\n"); +#endif + + const int prop_st = check_properties(model, &uris); + const int inst_st = check_instances(model, &uris); + + printf("Found %d errors among %d files (checked %d restrictions)\n", + n_errors, + argc - 1, + n_restrictions); + + sord_free(model); + sord_world_free(world); + return prop_st || inst_st; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,203 @@ +/* + Copyright 2011-2015 David Robillard + + 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. +*/ + +#include "serd/serd.h" +#include "sord/sord.h" + +#include +#include +#include +#include + +struct SordInserterImpl { + SordModel* model; + SerdEnv* env; +}; + +SordInserter* +sord_inserter_new(SordModel* model, SerdEnv* env) +{ + SordInserter* inserter = (SordInserter*)malloc(sizeof(SordInserter)); + inserter->model = model; + inserter->env = env; + return inserter; +} + +void +sord_inserter_free(SordInserter* inserter) +{ + free(inserter); +} + +SerdStatus +sord_inserter_set_base_uri(SordInserter* inserter, const SerdNode* uri) +{ + return serd_env_set_base_uri(inserter->env, uri); +} + +SerdStatus +sord_inserter_set_prefix(SordInserter* inserter, + const SerdNode* name, + const SerdNode* uri) +{ + return serd_env_set_prefix(inserter->env, name, uri); +} + +SerdStatus +sord_inserter_write_statement(SordInserter* inserter, + SerdStatementFlags flags, + const SerdNode* graph, + const SerdNode* subject, + const SerdNode* predicate, + const SerdNode* object, + const SerdNode* object_datatype, + const SerdNode* object_lang) +{ + SordWorld* world = sord_get_world(inserter->model); + SerdEnv* env = inserter->env; + + SordNode* g = sord_node_from_serd_node(world, env, graph, NULL, NULL); + SordNode* s = sord_node_from_serd_node(world, env, subject, NULL, NULL); + SordNode* p = sord_node_from_serd_node(world, env, predicate, NULL, NULL); + SordNode* o = + sord_node_from_serd_node(world, env, object, object_datatype, object_lang); + + if (!s || !p || !o) { + return SERD_ERR_BAD_ARG; + } + + const SordQuad tup = {s, p, o, g}; + sord_add(inserter->model, tup); + + sord_node_free(world, o); + sord_node_free(world, p); + sord_node_free(world, s); + sord_node_free(world, g); + + return SERD_SUCCESS; +} + +SORD_API +SerdReader* +sord_new_reader(SordModel* model, + SerdEnv* env, + SerdSyntax syntax, + SordNode* graph) +{ + SordInserter* inserter = sord_inserter_new(model, env); + + SerdReader* reader = + serd_reader_new(syntax, + inserter, + (void (*)(void* ptr))sord_inserter_free, + (SerdBaseSink)sord_inserter_set_base_uri, + (SerdPrefixSink)sord_inserter_set_prefix, + (SerdStatementSink)sord_inserter_write_statement, + NULL); + + if (graph) { + serd_reader_set_default_graph(reader, sord_node_to_serd_node(graph)); + } + + return reader; +} + +static SerdStatus +write_statement(SordModel* sord, + SerdWriter* writer, + SordQuad tup, + SerdStatementFlags flags) +{ + const SordNode* s = tup[SORD_SUBJECT]; + const SordNode* p = tup[SORD_PREDICATE]; + const SordNode* o = tup[SORD_OBJECT]; + const SordNode* d = sord_node_get_datatype(o); + const SerdNode* ss = sord_node_to_serd_node(s); + const SerdNode* sp = sord_node_to_serd_node(p); + const SerdNode* so = sord_node_to_serd_node(o); + const SerdNode* sd = sord_node_to_serd_node(d); + + const char* lang_str = sord_node_get_language(o); + size_t lang_len = lang_str ? strlen(lang_str) : 0; + SerdNode language = SERD_NODE_NULL; + if (lang_str) { + language.type = SERD_LITERAL; + language.n_bytes = lang_len; + language.n_chars = lang_len; + language.buf = (const uint8_t*)lang_str; + } + + // TODO: Subject abbreviation + + if (sord_node_is_inline_object(s) && !(flags & SERD_ANON_CONT)) { + return SERD_SUCCESS; + } + + SerdStatus st = SERD_SUCCESS; + if (sord_node_is_inline_object(o)) { + SordQuad sub_pat = {o, 0, 0, 0}; + SordIter* sub_iter = sord_find(sord, sub_pat); + + SerdStatementFlags start_flags = + flags | ((sub_iter) ? SERD_ANON_O_BEGIN : SERD_EMPTY_O); + + st = serd_writer_write_statement( + writer, start_flags, NULL, ss, sp, so, sd, &language); + + if (!st && sub_iter) { + flags |= SERD_ANON_CONT; + for (; !st && !sord_iter_end(sub_iter); sord_iter_next(sub_iter)) { + SordQuad sub_tup; + sord_iter_get(sub_iter, sub_tup); + st = write_statement(sord, writer, sub_tup, flags); + } + sord_iter_free(sub_iter); + serd_writer_end_anon(writer, so); + } + } else { + st = serd_writer_write_statement( + writer, flags, NULL, ss, sp, so, sd, &language); + } + + return st; +} + +bool +sord_write(SordModel* model, SerdWriter* writer, SordNode* graph) +{ + SordQuad pat = {0, 0, 0, graph}; + SordIter* iter = sord_find(model, pat); + return sord_write_iter(iter, writer); +} + +bool +sord_write_iter(SordIter* iter, SerdWriter* writer) +{ + if (!iter) { + return false; + } + + SordModel* model = (SordModel*)sord_iter_get_model(iter); + SerdStatus st = SERD_SUCCESS; + for (; !st && !sord_iter_end(iter); sord_iter_next(iter)) { + SordQuad tup; + sord_iter_get(iter, tup); + st = write_statement(model, writer, tup, 0); + } + sord_iter_free(iter); + + return !st; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,936 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#include "zix/btree.h" + +#include +#include +#include +#include + +// #define ZIX_BTREE_DEBUG 1 +// #define ZIX_BTREE_SORTED_CHECK 1 + +#ifndef ZIX_BTREE_PAGE_SIZE +# define ZIX_BTREE_PAGE_SIZE 4096 +#endif + +#define ZIX_BTREE_NODE_SPACE (ZIX_BTREE_PAGE_SIZE - 2 * sizeof(uint16_t)) +#define ZIX_BTREE_LEAF_VALS ((ZIX_BTREE_NODE_SPACE / sizeof(void*)) - 1) +#define ZIX_BTREE_INODE_VALS (ZIX_BTREE_LEAF_VALS / 2) + +struct ZixBTreeImpl { + ZixBTreeNode* root; + ZixDestroyFunc destroy; + ZixComparator cmp; + const void* cmp_data; + size_t size; + unsigned height; ///< Number of levels, i.e. root only has height 1 +}; + +struct ZixBTreeNodeImpl { + uint16_t is_leaf; + uint16_t n_vals; + // On 64-bit we rely on some padding here to get page-sized nodes + union { + struct { + void* vals[ZIX_BTREE_LEAF_VALS]; + } leaf; + + struct { + void* vals[ZIX_BTREE_INODE_VALS]; + ZixBTreeNode* children[ZIX_BTREE_INODE_VALS + 1]; + } inode; + } data; +}; + +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112l) || \ + (defined(__cplusplus) && __cplusplus >= 201103L) +static_assert(sizeof(ZixBTreeNode) == ZIX_BTREE_PAGE_SIZE, ""); +#endif + +typedef struct { + ZixBTreeNode* node; + unsigned index; +} ZixBTreeIterFrame; + +struct ZixBTreeIterImpl { + unsigned n_levels; ///< Maximum depth of stack + unsigned level; ///< Current level in stack + ZixBTreeIterFrame stack[]; ///< Position stack +}; + +#ifdef ZIX_BTREE_DEBUG + +static void +print_node(const ZixBTreeNode* n, const char* prefix) +{ + printf("%s[", prefix); + for (uint16_t v = 0; v < n->n_vals; ++v) { + printf(" %lu", (uintptr_t)n->vals[v]); + } + printf(" ]\n"); +} + +static void +print_tree(const ZixBTreeNode* parent, const ZixBTreeNode* node, int level) +{ + if (node) { + if (!parent) { + printf("TREE {\n"); + } + for (int i = 0; i < level + 1; ++i) { + printf(" "); + } + print_node(node, ""); + if (!node->is_leaf) { + for (uint16_t i = 0; i < node->n_vals + 1; ++i) { + print_tree(node, node->data.inode.children[i], level + 1); + } + } + if (!parent) { + printf("}\n"); + } + } +} + +#endif // ZIX_BTREE_DEBUG + +static ZixBTreeNode* +zix_btree_node_new(const bool leaf) +{ +#if !((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112l) || \ + (defined(__cplusplus) && __cplusplus >= 201103L)) + assert(sizeof(ZixBTreeNode) == ZIX_BTREE_PAGE_SIZE); +#endif + + ZixBTreeNode* node = (ZixBTreeNode*)malloc(sizeof(ZixBTreeNode)); + if (node) { + node->is_leaf = leaf; + node->n_vals = 0; + } + return node; +} + +static void* +zix_btree_value(const ZixBTreeNode* const node, const unsigned i) +{ + assert(i < node->n_vals); + return node->is_leaf ? node->data.leaf.vals[i] : node->data.inode.vals[i]; +} + +static ZixBTreeNode* +zix_btree_child(const ZixBTreeNode* const node, const unsigned i) +{ + assert(!node->is_leaf); + assert(i <= ZIX_BTREE_INODE_VALS); + return node->data.inode.children[i]; +} + +ZixBTree* +zix_btree_new(const ZixComparator cmp, + const void* const cmp_data, + const ZixDestroyFunc destroy) +{ + ZixBTree* t = (ZixBTree*)malloc(sizeof(ZixBTree)); + if (t) { + t->root = zix_btree_node_new(true); + t->destroy = destroy; + t->cmp = cmp; + t->cmp_data = cmp_data; + t->size = 0; + t->height = 1; + if (!t->root) { + free(t); + return NULL; + } + } + return t; +} + +static void +zix_btree_free_rec(ZixBTree* const t, ZixBTreeNode* const n) +{ + if (n) { + if (n->is_leaf) { + if (t->destroy) { + for (uint16_t i = 0; i < n->n_vals; ++i) { + t->destroy(n->data.leaf.vals[i]); + } + } + } else { + if (t->destroy) { + for (uint16_t i = 0; i < n->n_vals; ++i) { + t->destroy(n->data.inode.vals[i]); + } + } + + for (uint16_t i = 0; i < n->n_vals + 1; ++i) { + zix_btree_free_rec(t, zix_btree_child(n, i)); + } + } + + free(n); + } +} + +void +zix_btree_free(ZixBTree* const t) +{ + if (t) { + zix_btree_free_rec(t, t->root); + free(t); + } +} + +size_t +zix_btree_size(const ZixBTree* const t) +{ + return t->size; +} + +static uint16_t +zix_btree_max_vals(const ZixBTreeNode* const node) +{ + return node->is_leaf ? ZIX_BTREE_LEAF_VALS : ZIX_BTREE_INODE_VALS; +} + +static uint16_t +zix_btree_min_vals(const ZixBTreeNode* const node) +{ + return (uint16_t)(((zix_btree_max_vals(node) + 1U) / 2U) - 1U); +} + +/** Shift pointers in `array` of length `n` right starting at `i`. */ +static void +zix_btree_ainsert(void** const array, + const unsigned n, + const unsigned i, + void* const e) +{ + memmove(array + i + 1, array + i, (n - i) * sizeof(e)); + array[i] = e; +} + +/** Erase element `i` in `array` of length `n` and return erased element. */ +static void* +zix_btree_aerase(void** const array, const unsigned n, const unsigned i) +{ + void* const ret = array[i]; + memmove(array + i, array + i + 1, (n - i) * sizeof(ret)); + return ret; +} + +/** Split lhs, the i'th child of `n`, into two nodes. */ +static ZixBTreeNode* +zix_btree_split_child(ZixBTreeNode* const n, + const unsigned i, + ZixBTreeNode* const lhs) +{ + assert(lhs->n_vals == zix_btree_max_vals(lhs)); + assert(n->n_vals < ZIX_BTREE_INODE_VALS); + assert(i < n->n_vals + 1U); + assert(zix_btree_child(n, i) == lhs); + + const uint16_t max_n_vals = zix_btree_max_vals(lhs); + ZixBTreeNode* rhs = zix_btree_node_new(lhs->is_leaf); + if (!rhs) { + return NULL; + } + + // LHS and RHS get roughly half, less the middle value which moves up + lhs->n_vals = max_n_vals / 2U; + rhs->n_vals = (uint16_t)(max_n_vals - lhs->n_vals - 1); + + if (lhs->is_leaf) { + // Copy large half from LHS to new RHS node + memcpy(rhs->data.leaf.vals, + lhs->data.leaf.vals + lhs->n_vals + 1, + rhs->n_vals * sizeof(void*)); + + // Move middle value up to parent + zix_btree_ainsert( + n->data.inode.vals, n->n_vals, i, lhs->data.leaf.vals[lhs->n_vals]); + } else { + // Copy large half from LHS to new RHS node + memcpy(rhs->data.inode.vals, + lhs->data.inode.vals + lhs->n_vals + 1, + rhs->n_vals * sizeof(void*)); + memcpy(rhs->data.inode.children, + lhs->data.inode.children + lhs->n_vals + 1, + (rhs->n_vals + 1U) * sizeof(ZixBTreeNode*)); + + // Move middle value up to parent + zix_btree_ainsert( + n->data.inode.vals, n->n_vals, i, lhs->data.inode.vals[lhs->n_vals]); + } + + // Insert new RHS node in parent at position i + zix_btree_ainsert((void**)n->data.inode.children, ++n->n_vals, i + 1U, rhs); + + return rhs; +} + +#ifdef ZIX_BTREE_SORTED_CHECK +/** Check that `n` is sorted with respect to search key `e`. */ +static bool +zix_btree_node_is_sorted_with_respect_to(const ZixBTree* const t, + const ZixBTreeNode* const n, + const void* const e) +{ + if (n->n_vals <= 1) { + return true; + } + + int cmp = t->cmp(zix_btree_value(n, 0), e, t->cmp_data); + for (uint16_t i = 1; i < n->n_vals; ++i) { + const int next_cmp = t->cmp(zix_btree_value(n, i), e, t->cmp_data); + if ((cmp >= 0 && next_cmp < 0) || (cmp > 0 && next_cmp <= 0)) { + return false; + } + cmp = next_cmp; + } + + return true; +} +#endif + +/** Find the first value in `n` that is not less than `e` (lower bound). */ +static unsigned +zix_btree_node_find(const ZixBTree* const t, + const ZixBTreeNode* const n, + const void* const e, + bool* const equal) +{ +#ifdef ZIX_BTREE_SORTED_CHECK + assert(zix_btree_node_is_sorted_with_respect_to(t, n, e)); +#endif + + unsigned first = 0U; + unsigned len = n->n_vals; + while (len > 0) { + const unsigned half = len >> 1U; + const unsigned i = first + half; + const int cmp = t->cmp(zix_btree_value(n, i), e, t->cmp_data); + if (cmp == 0) { + *equal = true; + len = half; // Keep searching for wildcard matches + } else if (cmp < 0) { + const unsigned chop = half + 1U; + first += chop; + len -= chop; + } else { + len = half; + } + } + + assert(!*equal || t->cmp(zix_btree_value(n, first), e, t->cmp_data) == 0); + return first; +} + +ZixStatus +zix_btree_insert(ZixBTree* const t, void* const e) +{ + ZixBTreeNode* parent = NULL; // Parent of n + ZixBTreeNode* n = t->root; // Current node + unsigned i = 0; // Index of n in parent + while (n) { + if (n->n_vals == zix_btree_max_vals(n)) { + // Node is full, split to ensure there is space for a leaf split + if (!parent) { + // Root is full, grow tree upwards + if (!(parent = zix_btree_node_new(false))) { + return ZIX_STATUS_NO_MEM; + } + t->root = parent; + parent->data.inode.children[0] = n; + ++t->height; + } + + ZixBTreeNode* const rhs = zix_btree_split_child(parent, i, n); + if (!rhs) { + return ZIX_STATUS_NO_MEM; + } + + const int cmp = t->cmp(parent->data.inode.vals[i], e, t->cmp_data); + if (cmp == 0) { + return ZIX_STATUS_EXISTS; + } + + if (cmp < 0) { + // Move to new RHS + n = rhs; + ++i; + } + } + + assert(!parent || zix_btree_child(parent, i) == n); + + bool equal = false; + i = zix_btree_node_find(t, n, e, &equal); + if (equal) { + return ZIX_STATUS_EXISTS; + } + + if (!n->is_leaf) { + // Descend to child node left of value + parent = n; + n = zix_btree_child(n, i); + } else { + // Insert into internal node + zix_btree_ainsert(n->data.leaf.vals, n->n_vals++, i, e); + break; + } + } + + ++t->size; + + return ZIX_STATUS_SUCCESS; +} + +static ZixBTreeIter* +zix_btree_iter_new(const ZixBTree* const t) +{ + const size_t s = t->height * sizeof(ZixBTreeIterFrame); + + ZixBTreeIter* i = (ZixBTreeIter*)calloc(1, sizeof(ZixBTreeIter) + s); + if (i) { + i->n_levels = t->height; + } + return i; +} + +static void +zix_btree_iter_set_frame(ZixBTreeIter* const ti, + ZixBTreeNode* const n, + const unsigned i) +{ + if (ti) { + ti->stack[ti->level].node = n; + ti->stack[ti->level].index = i; + } +} + +static bool +zix_btree_node_is_minimal(ZixBTreeNode* const n) +{ + assert(n->n_vals >= zix_btree_min_vals(n)); + return n->n_vals == zix_btree_min_vals(n); +} + +/** Enlarge left child by stealing a value from its right sibling. */ +static ZixBTreeNode* +zix_btree_rotate_left(ZixBTreeNode* const parent, const unsigned i) +{ + ZixBTreeNode* const lhs = zix_btree_child(parent, i); + ZixBTreeNode* const rhs = zix_btree_child(parent, i + 1); + + assert(lhs->is_leaf == rhs->is_leaf); + + if (lhs->is_leaf) { + // Move parent value to end of LHS + lhs->data.leaf.vals[lhs->n_vals++] = parent->data.inode.vals[i]; + + // Move first value in RHS to parent + parent->data.inode.vals[i] = + zix_btree_aerase(rhs->data.leaf.vals, rhs->n_vals, 0); + } else { + // Move parent value to end of LHS + lhs->data.inode.vals[lhs->n_vals++] = parent->data.inode.vals[i]; + + // Move first value in RHS to parent + parent->data.inode.vals[i] = + zix_btree_aerase(rhs->data.inode.vals, rhs->n_vals, 0); + + // Move first child pointer from RHS to end of LHS + lhs->data.inode.children[lhs->n_vals] = (ZixBTreeNode*)zix_btree_aerase( + (void**)rhs->data.inode.children, rhs->n_vals, 0); + } + + --rhs->n_vals; + + return lhs; +} + +/** Enlarge right child by stealing a value from its left sibling. */ +static ZixBTreeNode* +zix_btree_rotate_right(ZixBTreeNode* const parent, const unsigned i) +{ + ZixBTreeNode* const lhs = zix_btree_child(parent, i - 1); + ZixBTreeNode* const rhs = zix_btree_child(parent, i); + + assert(lhs->is_leaf == rhs->is_leaf); + + if (lhs->is_leaf) { + // Prepend parent value to RHS + zix_btree_ainsert( + rhs->data.leaf.vals, rhs->n_vals++, 0, parent->data.inode.vals[i - 1]); + + // Move last value from LHS to parent + parent->data.inode.vals[i - 1] = lhs->data.leaf.vals[--lhs->n_vals]; + } else { + // Prepend parent value to RHS + zix_btree_ainsert( + rhs->data.inode.vals, rhs->n_vals++, 0, parent->data.inode.vals[i - 1]); + + // Move last child pointer from LHS and prepend to RHS + zix_btree_ainsert((void**)rhs->data.inode.children, + rhs->n_vals, + 0, + lhs->data.inode.children[lhs->n_vals]); + + // Move last value from LHS to parent + parent->data.inode.vals[i - 1] = lhs->data.inode.vals[--lhs->n_vals]; + } + + return rhs; +} + +/** Move n[i] down, merge the left and right child, return the merged node. */ +static ZixBTreeNode* +zix_btree_merge(ZixBTree* const t, ZixBTreeNode* const n, const unsigned i) +{ + ZixBTreeNode* const lhs = zix_btree_child(n, i); + ZixBTreeNode* const rhs = zix_btree_child(n, i + 1); + + assert(lhs->is_leaf == rhs->is_leaf); + assert(zix_btree_node_is_minimal(lhs)); + assert(lhs->n_vals + rhs->n_vals < zix_btree_max_vals(lhs)); + + // Move parent value to end of LHS + if (lhs->is_leaf) { + lhs->data.leaf.vals[lhs->n_vals++] = + zix_btree_aerase(n->data.inode.vals, n->n_vals, i); + } else { + lhs->data.inode.vals[lhs->n_vals++] = + zix_btree_aerase(n->data.inode.vals, n->n_vals, i); + } + + // Erase corresponding child pointer (to RHS) in parent + zix_btree_aerase((void**)n->data.inode.children, n->n_vals, i + 1U); + + // Add everything from RHS to end of LHS + if (lhs->is_leaf) { + memcpy(lhs->data.leaf.vals + lhs->n_vals, + rhs->data.leaf.vals, + rhs->n_vals * sizeof(void*)); + } else { + memcpy(lhs->data.inode.vals + lhs->n_vals, + rhs->data.inode.vals, + rhs->n_vals * sizeof(void*)); + memcpy(lhs->data.inode.children + lhs->n_vals, + rhs->data.inode.children, + (rhs->n_vals + 1U) * sizeof(void*)); + } + + lhs->n_vals = (uint16_t)(lhs->n_vals + rhs->n_vals); + + if (--n->n_vals == 0) { + // Root is now empty, replace it with its only child + assert(n == t->root); + t->root = lhs; + free(n); + } + + free(rhs); + return lhs; +} + +/** Remove and return the min value from the subtree rooted at `n`. */ +static void* +zix_btree_remove_min(ZixBTree* const t, ZixBTreeNode* n) +{ + while (!n->is_leaf) { + if (zix_btree_node_is_minimal(zix_btree_child(n, 0))) { + // Leftmost child is minimal, must expand + if (!zix_btree_node_is_minimal(zix_btree_child(n, 1))) { + // Child's right sibling has at least one key to steal + n = zix_btree_rotate_left(n, 0); + } else { + // Both child and right sibling are minimal, merge + n = zix_btree_merge(t, n, 0); + } + } else { + n = zix_btree_child(n, 0); + } + } + + return zix_btree_aerase(n->data.leaf.vals, --n->n_vals, 0); +} + +/** Remove and return the max value from the subtree rooted at `n`. */ +static void* +zix_btree_remove_max(ZixBTree* const t, ZixBTreeNode* n) +{ + while (!n->is_leaf) { + if (zix_btree_node_is_minimal(zix_btree_child(n, n->n_vals))) { + // Leftmost child is minimal, must expand + if (!zix_btree_node_is_minimal(zix_btree_child(n, n->n_vals - 1))) { + // Child's left sibling has at least one key to steal + n = zix_btree_rotate_right(n, n->n_vals); + } else { + // Both child and left sibling are minimal, merge + n = zix_btree_merge(t, n, n->n_vals - 1U); + } + } else { + n = zix_btree_child(n, n->n_vals); + } + } + + return n->data.leaf.vals[--n->n_vals]; +} + +ZixStatus +zix_btree_remove(ZixBTree* const t, + const void* const e, + void** const out, + ZixBTreeIter** const next) +{ + ZixBTreeNode* n = t->root; + ZixBTreeIter* ti = NULL; + const bool user_iter = next && *next; + if (next) { + if (!*next && !(*next = zix_btree_iter_new(t))) { + return ZIX_STATUS_NO_MEM; + } + ti = *next; + ti->level = 0; + } + + while (true) { + /* To remove in a single walk down, the tree is adjusted along the way + so that the current node always has at least one more value than the + minimum required in general. Thus, there is always room to remove + without adjusting on the way back up. */ + assert(n == t->root || !zix_btree_node_is_minimal(n)); + + bool equal = false; + const unsigned i = zix_btree_node_find(t, n, e, &equal); + zix_btree_iter_set_frame(ti, n, i); + if (n->is_leaf) { + if (equal) { + // Found in leaf node + *out = zix_btree_aerase(n->data.leaf.vals, --n->n_vals, i); + if (ti && i == n->n_vals) { + if (i == 0) { + ti->level = 0; + ti->stack[0].node = NULL; + } else { + --ti->stack[ti->level].index; + zix_btree_iter_increment(ti); + } + } + --t->size; + return ZIX_STATUS_SUCCESS; + } + + // Not found in leaf node, or tree + if (ti && !user_iter) { + zix_btree_iter_free(ti); + *next = NULL; + } + + return ZIX_STATUS_NOT_FOUND; + } + + if (equal) { + // Found in internal node + ZixBTreeNode* const lhs = zix_btree_child(n, i); + ZixBTreeNode* const rhs = zix_btree_child(n, i + 1); + const size_t l_size = lhs->n_vals; + const size_t r_size = rhs->n_vals; + if (zix_btree_node_is_minimal(lhs) && zix_btree_node_is_minimal(rhs)) { + // Both preceding and succeeding child are minimal + n = zix_btree_merge(t, n, i); + } else if (l_size >= r_size) { + // Left child can remove without merge + assert(!zix_btree_node_is_minimal(lhs)); + *out = n->data.inode.vals[i]; + n->data.inode.vals[i] = zix_btree_remove_max(t, lhs); + --t->size; + return ZIX_STATUS_SUCCESS; + } else { + // Right child can remove without merge + assert(!zix_btree_node_is_minimal(rhs)); + *out = n->data.inode.vals[i]; + n->data.inode.vals[i] = zix_btree_remove_min(t, rhs); + --t->size; + return ZIX_STATUS_SUCCESS; + } + } else { + // Not found in internal node, key is in/under children[i] + if (zix_btree_node_is_minimal(zix_btree_child(n, i))) { + if (i > 0 && !zix_btree_node_is_minimal(zix_btree_child(n, i - 1))) { + // Steal a key from child's left sibling + n = zix_btree_rotate_right(n, i); + } else if (i < n->n_vals && + !zix_btree_node_is_minimal(zix_btree_child(n, i + 1))) { + // Steal a key from child's right sibling + n = zix_btree_rotate_left(n, i); + } else if (n == t->root && n->n_vals == 1) { + // Root has two children, both minimal, delete it + assert(i == 0 || i == 1); + const uint16_t counts[2] = {zix_btree_child(n, 0)->n_vals, + zix_btree_child(n, 1)->n_vals}; + + n = zix_btree_merge(t, n, 0); + if (ti) { + ti->stack[ti->level].node = n; + ti->stack[ti->level].index = counts[i]; + } + } else { + // Both child's siblings are minimal, merge them + if (i < n->n_vals) { + n = zix_btree_merge(t, n, i); + } else { + n = zix_btree_merge(t, n, i - 1U); + if (ti) { + --ti->stack[ti->level].index; + } + } + } + } else { + n = zix_btree_child(n, i); + } + } + if (ti) { + ++ti->level; + } + } + + assert(false); // Not reached + return ZIX_STATUS_ERROR; +} + +ZixStatus +zix_btree_find(const ZixBTree* const t, + const void* const e, + ZixBTreeIter** const ti) +{ + ZixBTreeNode* n = t->root; + if (!(*ti = zix_btree_iter_new(t))) { + return ZIX_STATUS_NO_MEM; + } + + while (n) { + bool equal = false; + const unsigned i = zix_btree_node_find(t, n, e, &equal); + + zix_btree_iter_set_frame(*ti, n, i); + + if (equal) { + return ZIX_STATUS_SUCCESS; + } + + if (n->is_leaf) { + break; + } + + ++(*ti)->level; + n = zix_btree_child(n, i); + } + + zix_btree_iter_free(*ti); + *ti = NULL; + return ZIX_STATUS_NOT_FOUND; +} + +ZixStatus +zix_btree_lower_bound(const ZixBTree* const t, + const void* const e, + ZixBTreeIter** const ti) +{ + if (!t) { + *ti = NULL; + return ZIX_STATUS_BAD_ARG; + } + + if (!t->root) { + *ti = NULL; + return ZIX_STATUS_SUCCESS; + } + + ZixBTreeNode* n = t->root; + bool found = false; + unsigned found_level = 0; + if (!(*ti = zix_btree_iter_new(t))) { + return ZIX_STATUS_NO_MEM; + } + + while (n) { + bool equal = false; + const unsigned i = zix_btree_node_find(t, n, e, &equal); + + zix_btree_iter_set_frame(*ti, n, i); + + if (equal) { + found_level = (*ti)->level; + found = true; + } + + if (n->is_leaf) { + break; + } + + ++(*ti)->level; + n = zix_btree_child(n, i); + assert(n); + } + + const ZixBTreeIterFrame* const frame = &(*ti)->stack[(*ti)->level]; + assert(frame->node); + if (frame->index == frame->node->n_vals) { + if (found) { + // Found on a previous level but went too far + (*ti)->level = found_level; + } else { + // Reached end (key is greater than everything in tree) + (*ti)->level = 0; + (*ti)->stack[0].node = NULL; + } + } + + return ZIX_STATUS_SUCCESS; +} + +void* +zix_btree_get(const ZixBTreeIter* const ti) +{ + const ZixBTreeIterFrame* const frame = &ti->stack[ti->level]; + assert(frame->node); + assert(frame->index < frame->node->n_vals); + return zix_btree_value(frame->node, frame->index); +} + +ZixBTreeIter* +zix_btree_begin(const ZixBTree* const t) +{ + ZixBTreeIter* const i = zix_btree_iter_new(t); + if (!i) { + return NULL; + } + + if (t->size == 0) { + i->level = 0; + i->stack[0].node = NULL; + } else { + ZixBTreeNode* n = t->root; + i->stack[0].node = n; + i->stack[0].index = 0; + while (!n->is_leaf) { + n = zix_btree_child(n, 0); + ++i->level; + i->stack[i->level].node = n; + i->stack[i->level].index = 0; + } + } + + return i; +} + +ZixBTreeIter* +zix_btree_end(const ZixBTree* const t) +{ + return zix_btree_iter_new(t); +} + +ZixBTreeIter* +zix_btree_iter_copy(const ZixBTreeIter* const i) +{ + if (!i) { + return NULL; + } + + const size_t s = i->n_levels * sizeof(ZixBTreeIterFrame); + ZixBTreeIter* j = (ZixBTreeIter*)calloc(1, sizeof(ZixBTreeIter) + s); + if (j) { + memcpy(j, i, sizeof(ZixBTreeIter) + s); + } + + return j; +} + +bool +zix_btree_iter_is_end(const ZixBTreeIter* const i) +{ + return !i || (i->level == 0 && i->stack[0].node == NULL); +} + +bool +zix_btree_iter_equals(const ZixBTreeIter* const lhs, + const ZixBTreeIter* const rhs) +{ + if (zix_btree_iter_is_end(lhs) && zix_btree_iter_is_end(rhs)) { + return true; + } + + if (zix_btree_iter_is_end(lhs) || zix_btree_iter_is_end(rhs) || + lhs->level != rhs->level) { + return false; + } + + return !memcmp(lhs, + rhs, + sizeof(ZixBTreeIter) + + (lhs->level + 1) * sizeof(ZixBTreeIterFrame)); +} + +void +zix_btree_iter_increment(ZixBTreeIter* const i) +{ + ZixBTreeIterFrame* f = &i->stack[i->level]; + if (f->node->is_leaf) { + // Leaf, move right + assert(f->index < f->node->n_vals); + if (++f->index == f->node->n_vals) { + // Reached end of leaf, move up + f = &i->stack[i->level]; + while (i->level > 0 && f->index == f->node->n_vals) { + f = &i->stack[--i->level]; + assert(f->index <= f->node->n_vals); + } + + if (f->index == f->node->n_vals) { + // Reached end of tree + assert(i->level == 0); + f->node = NULL; + f->index = 0; + } + } + } else { + // Internal node, move down to next child + assert(f->index < f->node->n_vals); + ZixBTreeNode* child = zix_btree_child(f->node, ++f->index); + + f = &i->stack[++i->level]; + f->node = child; + f->index = 0; + + // Move down and left until we hit a leaf + while (!f->node->is_leaf) { + child = zix_btree_child(f->node, 0); + f = &i->stack[++i->level]; + f->node = child; + f->index = 0; + } + } +} + +void +zix_btree_iter_free(ZixBTreeIter* const i) +{ + free(i); +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,187 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef ZIX_BTREE_H +#define ZIX_BTREE_H + +#include "zix/common.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @addtogroup zix + @{ + @name BTree + @{ +*/ + +/** + A B-Tree. +*/ +typedef struct ZixBTreeImpl ZixBTree; + +/** + A B-Tree node (opaque). +*/ +typedef struct ZixBTreeNodeImpl ZixBTreeNode; + +/** + An iterator over a B-Tree. + + Note that modifying the trees invalidates all iterators, so all iterators + are const iterators. +*/ +typedef struct ZixBTreeIterImpl ZixBTreeIter; + +/** + Create a new (empty) B-Tree. +*/ +ZIX_API +ZixBTree* +zix_btree_new(ZixComparator cmp, const void* cmp_data, ZixDestroyFunc destroy); + +/** + Free `t`. +*/ +ZIX_API +void +zix_btree_free(ZixBTree* t); + +/** + Return the number of elements in `t`. +*/ +ZIX_PURE_API +size_t +zix_btree_size(const ZixBTree* t); + +/** + Insert the element `e` into `t`. +*/ +ZIX_API +ZixStatus +zix_btree_insert(ZixBTree* t, void* e); + +/** + Remove the value `e` from `t`. + + @param t Tree to remove from. + + @param e Value to remove. + + @param out Set to point to the removed pointer (which may not equal `e`). + + @param next If non-NULL, pointed to the value following `e`. If *next is + also non-NULL, the iterator is reused, otherwise a new one is allocated. To + reuse an iterator, no items may have been added since its creation. +*/ +ZIX_API +ZixStatus +zix_btree_remove(ZixBTree* t, const void* e, void** out, ZixBTreeIter** next); + +/** + Set `ti` to an element equal to `e` in `t`. + If no such item exists, `ti` is set to NULL. +*/ +ZIX_API +ZixStatus +zix_btree_find(const ZixBTree* t, const void* e, ZixBTreeIter** ti); + +/** + Set `ti` to the smallest element in `t` that is not less than `e`. + + Wildcards are supported, so if the search key `e` compares equal to many + values in the tree, `ti` will be set to the least such element. The search + key `e` is always passed as the second argument to the comparator. +*/ +ZIX_API +ZixStatus +zix_btree_lower_bound(const ZixBTree* t, const void* e, ZixBTreeIter** ti); + +/** + Return the data associated with the given tree item. +*/ +ZIX_PURE_API +void* +zix_btree_get(const ZixBTreeIter* ti); + +/** + Return an iterator to the first (smallest) element in `t`. + + The returned iterator must be freed with zix_btree_iter_free(). +*/ +ZIX_PURE_API +ZixBTreeIter* +zix_btree_begin(const ZixBTree* t); + +/** + Return an iterator to the end of `t` (one past the last element). + + The returned iterator must be freed with zix_btree_iter_free(). +*/ +ZIX_API +ZixBTreeIter* +zix_btree_end(const ZixBTree* t); + +/** + Return a new copy of `i`. +*/ +ZIX_API +ZixBTreeIter* +zix_btree_iter_copy(const ZixBTreeIter* i); + +/** + Return true iff `lhs` is equal to `rhs`. +*/ +ZIX_PURE_API +bool +zix_btree_iter_equals(const ZixBTreeIter* lhs, const ZixBTreeIter* rhs); + +/** + Return true iff `i` is an iterator to the end of its tree. +*/ +ZIX_PURE_API +bool +zix_btree_iter_is_end(const ZixBTreeIter* i); + +/** + Increment `i` to point to the next element in the tree. +*/ +ZIX_API +void +zix_btree_iter_increment(ZixBTreeIter* i); + +/** + Free `i`. +*/ +ZIX_API +void +zix_btree_iter_free(ZixBTreeIter* i); + +/** + @} + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_BTREE_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,138 @@ +/* + Copyright 2016-2020 David Robillard + + 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. +*/ + +#ifndef ZIX_COMMON_H +#define ZIX_COMMON_H + +#include + +/** + @addtogroup zix + @{ +*/ + +/** @cond */ +#if defined(_WIN32) && !defined(ZIX_STATIC) && defined(ZIX_INTERNAL) +# define ZIX_API __declspec(dllexport) +#elif defined(_WIN32) && !defined(ZIX_STATIC) +# define ZIX_API __declspec(dllimport) +#elif defined(__GNUC__) +# define ZIX_API __attribute__((visibility("default"))) +#else +# define ZIX_API +#endif + +#ifdef __GNUC__ +# define ZIX_PURE_FUNC __attribute__((pure)) +# define ZIX_CONST_FUNC __attribute__((const)) +# define ZIX_MALLOC_FUNC __attribute__((malloc)) +#else +# define ZIX_PURE_FUNC +# define ZIX_CONST_FUNC +# define ZIX_MALLOC_FUNC +#endif + +#define ZIX_PURE_API \ + ZIX_API \ + ZIX_PURE_FUNC + +#define ZIX_CONST_API \ + ZIX_API \ + ZIX_CONST_FUNC + +#define ZIX_MALLOC_API \ + ZIX_API \ + ZIX_MALLOC_FUNC + +/** @endcond */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __GNUC__ +# define ZIX_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define ZIX_LOG_FUNC(fmt, arg1) +#endif + +// Unused parameter macro to suppresses warnings and make it impossible to use +#if defined(__cplusplus) +# define ZIX_UNUSED(name) +#elif defined(__GNUC__) +# define ZIX_UNUSED(name) name##_unused __attribute__((__unused__)) +#else +# define ZIX_UNUSED(name) name +#endif + +typedef enum { + ZIX_STATUS_SUCCESS, + ZIX_STATUS_ERROR, + ZIX_STATUS_NO_MEM, + ZIX_STATUS_NOT_FOUND, + ZIX_STATUS_EXISTS, + ZIX_STATUS_BAD_ARG, + ZIX_STATUS_BAD_PERMS +} ZixStatus; + +static inline const char* +zix_strerror(const ZixStatus status) +{ + switch (status) { + case ZIX_STATUS_SUCCESS: + return "Success"; + case ZIX_STATUS_ERROR: + return "Unknown error"; + case ZIX_STATUS_NO_MEM: + return "Out of memory"; + case ZIX_STATUS_NOT_FOUND: + return "Not found"; + case ZIX_STATUS_EXISTS: + return "Exists"; + case ZIX_STATUS_BAD_ARG: + return "Bad argument"; + case ZIX_STATUS_BAD_PERMS: + return "Bad permissions"; + } + return "Unknown error"; +} + +/** + Function for comparing two elements. +*/ +typedef int (*ZixComparator)(const void* a, + const void* b, + const void* user_data); + +/** + Function for testing equality of two elements. +*/ +typedef bool (*ZixEqualFunc)(const void* a, const void* b); + +/** + Function to destroy an element. +*/ +typedef void (*ZixDestroyFunc)(void* ptr); + +/** + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_COMMON_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,141 @@ +/* + Copyright 2012-2020 David Robillard + + 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. +*/ + +#include "zix/digest.h" + +#ifdef __SSE4_2__ +# include +#endif + +#include +#include + +#ifdef __SSE4_2__ + +// SSE 4.2 CRC32 + +uint32_t +zix_digest_start(void) +{ + return 1; +} + +uint32_t +zix_digest_add(uint32_t hash, const void* const buf, const size_t len) +{ + const uint8_t* str = (const uint8_t*)buf; + +# ifdef __x86_64__ + for (size_t i = 0; i < (len / sizeof(uint64_t)); ++i) { + hash = (uint32_t)_mm_crc32_u64(hash, *(const uint64_t*)str); + str += sizeof(uint64_t); + } + if (len & sizeof(uint32_t)) { + hash = _mm_crc32_u32(hash, *(const uint32_t*)str); + str += sizeof(uint32_t); + } +# else + for (size_t i = 0; i < (len / sizeof(uint32_t)); ++i) { + hash = _mm_crc32_u32(hash, *(const uint32_t*)str); + str += sizeof(uint32_t); + } +# endif + if (len & sizeof(uint16_t)) { + hash = _mm_crc32_u16(hash, *(const uint16_t*)str); + str += sizeof(uint16_t); + } + if (len & sizeof(uint8_t)) { + hash = _mm_crc32_u8(hash, *(const uint8_t*)str); + } + + return hash; +} + +uint32_t +zix_digest_add_64(uint32_t hash, const void* const buf, const size_t len) +{ + assert((uintptr_t)buf % sizeof(uint64_t) == 0); + assert(len % sizeof(uint64_t) == 0); + +# ifdef __x86_64__ + const uint64_t* ptr = (const uint64_t*)buf; + + for (size_t i = 0; i < (len / sizeof(uint64_t)); ++i) { + hash = (uint32_t)_mm_crc32_u64(hash, *ptr); + ++ptr; + } + + return hash; +# else + const uint32_t* ptr = (const uint32_t*)buf; + + for (size_t i = 0; i < (len / sizeof(uint32_t)); ++i) { + hash = _mm_crc32_u32(hash, *ptr); + ++ptr; + } + + return hash; +# endif +} + +uint32_t +zix_digest_add_ptr(const uint32_t hash, const void* const ptr) +{ +# ifdef __x86_64__ + return (uint32_t)_mm_crc32_u64(hash, (uintptr_t)ptr); +# else + return _mm_crc32_u32(hash, (uintptr_t)ptr); +# endif +} + +#else + +// Classic DJB hash + +uint32_t +zix_digest_start(void) +{ + return 5381; +} + +uint32_t +zix_digest_add(uint32_t hash, const void* const buf, const size_t len) +{ + const uint8_t* str = (const uint8_t*)buf; + + for (size_t i = 0; i < len; ++i) { + hash = (hash << 5u) + hash + str[i]; + } + + return hash; +} + +uint32_t +zix_digest_add_64(uint32_t hash, const void* const buf, const size_t len) +{ + assert((uintptr_t)buf % sizeof(uint64_t) == 0); + assert(len % sizeof(uint64_t) == 0); + + return zix_digest_add(hash, buf, len); +} + +uint32_t +zix_digest_add_ptr(const uint32_t hash, const void* const ptr) +{ + return zix_digest_add(hash, &ptr, sizeof(ptr)); +} + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,67 @@ +/* + Copyright 2012-2020 David Robillard + + 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. +*/ + +#ifndef ZIX_DIGEST_H +#define ZIX_DIGEST_H + +#include "zix/common.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Return an initial empty digest value. +*/ +ZIX_CONST_API +uint32_t +zix_digest_start(void); + +/** + Update `hash` to include `buf`, a buffer of `len` bytes. + + This can be used for any size or alignment. +*/ +ZIX_PURE_API +uint32_t +zix_digest_add(uint32_t hash, const void* buf, size_t len); + +/** + Update `hash` to include `buf`, a 64-bit aligned buffer of `len` bytes. + + Both `buf` and `len` must be evenly divisible by 8 (64 bits). +*/ +ZIX_PURE_API +uint32_t +zix_digest_add_64(uint32_t hash, const void* buf, size_t len); + +/** + Update `hash` to include `ptr`. + + This hashes the value of the pointer itself, and does not dereference `ptr`. +*/ +ZIX_CONST_API +uint32_t +zix_digest_add_ptr(uint32_t hash, const void* ptr); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_DIGEST_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,230 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#include "zix/hash.h" + +#include +#include +#include + +/** + Primes, each slightly less than twice its predecessor, and as far away + from powers of two as possible. +*/ +static const unsigned sizes[] = { + 53, 97, 193, 389, 769, 1543, 3079, + 6151, 12289, 24593, 49157, 98317, 196613, 393241, + 786433, 1572869, 3145739, 6291469, 12582917, 25165843, 50331653, + 100663319, 201326611, 402653189, 805306457, 1610612741, 0}; + +typedef struct ZixHashEntry { + struct ZixHashEntry* next; ///< Next entry in bucket + uint32_t hash; ///< Non-modulo hash value + // Value follows here (access with zix_hash_value) +} ZixHashEntry; + +struct ZixHashImpl { + ZixHashFunc hash_func; + ZixEqualFunc equal_func; + ZixHashEntry** buckets; + const unsigned* n_buckets; + size_t value_size; + unsigned count; +}; + +static inline void* +zix_hash_value(ZixHashEntry* entry) +{ + return entry + 1; +} + +ZixHash* +zix_hash_new(ZixHashFunc hash_func, ZixEqualFunc equal_func, size_t value_size) +{ + ZixHash* hash = (ZixHash*)malloc(sizeof(ZixHash)); + if (hash) { + hash->hash_func = hash_func; + hash->equal_func = equal_func; + hash->n_buckets = &sizes[0]; + hash->value_size = value_size; + hash->count = 0; + if (!(hash->buckets = + (ZixHashEntry**)calloc(*hash->n_buckets, sizeof(ZixHashEntry*)))) { + free(hash); + return NULL; + } + } + return hash; +} + +void +zix_hash_free(ZixHash* hash) +{ + if (!hash) { + return; + } + + for (unsigned b = 0; b < *hash->n_buckets; ++b) { + ZixHashEntry* bucket = hash->buckets[b]; + for (ZixHashEntry* e = bucket; e;) { + ZixHashEntry* next = e->next; + free(e); + e = next; + } + } + + free(hash->buckets); + free(hash); +} + +size_t +zix_hash_size(const ZixHash* hash) +{ + return hash->count; +} + +static inline void +insert_entry(ZixHashEntry** bucket, ZixHashEntry* entry) +{ + entry->next = *bucket; + *bucket = entry; +} + +static inline ZixStatus +rehash(ZixHash* hash, unsigned new_n_buckets) +{ + ZixHashEntry** new_buckets = + (ZixHashEntry**)calloc(new_n_buckets, sizeof(ZixHashEntry*)); + if (!new_buckets) { + return ZIX_STATUS_NO_MEM; + } + + const unsigned old_n_buckets = *hash->n_buckets; + for (unsigned b = 0; b < old_n_buckets; ++b) { + for (ZixHashEntry* e = hash->buckets[b]; e;) { + ZixHashEntry* const next = e->next; + const unsigned h = e->hash % new_n_buckets; + insert_entry(&new_buckets[h], e); + e = next; + } + } + + free(hash->buckets); + hash->buckets = new_buckets; + + return ZIX_STATUS_SUCCESS; +} + +static inline ZixHashEntry* +find_entry(const ZixHash* hash, + const void* key, + const unsigned h, + const unsigned h_nomod) +{ + for (ZixHashEntry* e = hash->buckets[h]; e; e = e->next) { + if (e->hash == h_nomod && hash->equal_func(zix_hash_value(e), key)) { + return e; + } + } + return NULL; +} + +void* +zix_hash_find(const ZixHash* hash, const void* value) +{ + const unsigned h_nomod = hash->hash_func(value); + const unsigned h = h_nomod % *hash->n_buckets; + ZixHashEntry* const entry = find_entry(hash, value, h, h_nomod); + return entry ? zix_hash_value(entry) : 0; +} + +ZixStatus +zix_hash_insert(ZixHash* hash, const void* value, void** inserted) +{ + unsigned h_nomod = hash->hash_func(value); + unsigned h = h_nomod % *hash->n_buckets; + + ZixHashEntry* elem = find_entry(hash, value, h, h_nomod); + if (elem) { + assert(elem->hash == h_nomod); + if (inserted) { + *inserted = zix_hash_value(elem); + } + return ZIX_STATUS_EXISTS; + } + + elem = (ZixHashEntry*)malloc(sizeof(ZixHashEntry) + hash->value_size); + if (!elem) { + return ZIX_STATUS_NO_MEM; + } + elem->next = NULL; + elem->hash = h_nomod; + memcpy(elem + 1, value, hash->value_size); + + const unsigned next_n_buckets = *(hash->n_buckets + 1); + if (next_n_buckets != 0 && (hash->count + 1) >= next_n_buckets) { + if (!rehash(hash, next_n_buckets)) { + h = h_nomod % *(++hash->n_buckets); + } + } + + insert_entry(&hash->buckets[h], elem); + ++hash->count; + if (inserted) { + *inserted = zix_hash_value(elem); + } + return ZIX_STATUS_SUCCESS; +} + +ZixStatus +zix_hash_remove(ZixHash* hash, const void* value) +{ + const unsigned h_nomod = hash->hash_func(value); + const unsigned h = h_nomod % *hash->n_buckets; + + ZixHashEntry** next_ptr = &hash->buckets[h]; + for (ZixHashEntry* e = hash->buckets[h]; e; e = e->next) { + if (h_nomod == e->hash && hash->equal_func(zix_hash_value(e), value)) { + *next_ptr = e->next; + free(e); + return ZIX_STATUS_SUCCESS; + } + next_ptr = &e->next; + } + + if (hash->n_buckets != sizes) { + const unsigned prev_n_buckets = *(hash->n_buckets - 1); + if (hash->count - 1 <= prev_n_buckets) { + if (!rehash(hash, prev_n_buckets)) { + --hash->n_buckets; + } + } + } + + --hash->count; + return ZIX_STATUS_NOT_FOUND; +} + +void +zix_hash_foreach(ZixHash* hash, ZixHashVisitFunc f, void* user_data) +{ + for (unsigned b = 0; b < *hash->n_buckets; ++b) { + ZixHashEntry* bucket = hash->buckets[b]; + for (ZixHashEntry* e = bucket; e; e = e->next) { + f(zix_hash_value(e), user_data); + } + } +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,138 @@ +/* + Copyright 2011-2020 David Robillard + + 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. +*/ + +#ifndef ZIX_HASH_H +#define ZIX_HASH_H + +#include "zix/common.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @addtogroup zix + @{ + @name Hash + @{ +*/ + +typedef struct ZixHashImpl ZixHash; + +/** + Function for computing the hash of an element. +*/ +typedef uint32_t (*ZixHashFunc)(const void* value); + +/** + Function to visit a hash element. +*/ +typedef void (*ZixHashVisitFunc)(void* value, void* user_data); + +/** + Create a new hash table. + + To minimize space overhead, unlike many hash tables this stores a single + value, not a key and a value. Any size of value can be stored, but all the + values in the hash table must be the same size, and the values must be safe + to copy with memcpy. To get key:value behaviour, simply insert a struct + with a key and value into the hash. + + @param hash_func The hashing function. + @param equal_func A function to test value equality. + @param value_size The size of the values to be stored. +*/ +ZIX_API +ZixHash* +zix_hash_new(ZixHashFunc hash_func, ZixEqualFunc equal_func, size_t value_size); + +/** + Free `hash`. +*/ +ZIX_API +void +zix_hash_free(ZixHash* hash); + +/** + Return the number of elements in `hash`. +*/ +ZIX_PURE_API +size_t +zix_hash_size(const ZixHash* hash); + +/** + Insert an item into `hash`. + + If no matching value is found, ZIX_STATUS_SUCCESS will be returned, and @p + inserted will be pointed to the copy of `value` made in the new hash node. + + If a matching value already exists, ZIX_STATUS_EXISTS will be returned, and + `inserted` will be pointed to the existing value. + + @param hash The hash table. + @param value The value to be inserted. + @param inserted The copy of `value` in the hash table. + @return ZIX_STATUS_SUCCESS, ZIX_STATUS_EXISTS, or ZIX_STATUS_NO_MEM. +*/ +ZIX_API +ZixStatus +zix_hash_insert(ZixHash* hash, const void* value, void** inserted); + +/** + Remove an item from `hash`. + + @param hash The hash table. + @param value The value to remove. + @return ZIX_STATUS_SUCCES or ZIX_STATUS_NOT_FOUND. +*/ +ZIX_API +ZixStatus +zix_hash_remove(ZixHash* hash, const void* value); + +/** + Search for an item in `hash`. + + @param hash The hash table. + @param value The value to search for. +*/ +ZIX_API +void* +zix_hash_find(const ZixHash* hash, const void* value); + +/** + Call `f` on each value in `hash`. + + @param hash The hash table. + @param f The function to call on each value. + @param user_data The user_data parameter passed to `f`. +*/ +ZIX_API +void +zix_hash_foreach(ZixHash* hash, ZixHashVisitFunc f, void* user_data); + +/** + @} + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_HASH_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,33 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +/* + Instead of providing a config header per lv2-related library, we put all + of the config in a single file, which is included below. +*/ + +#pragma once + +#include "juce_lv2_config.h" diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sratom/COPYING juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sratom/COPYING --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sratom/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sratom/COPYING 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,13 @@ +Copyright 2012-2021 David Robillard + +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. diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,220 @@ +/* + Copyright 2012-2021 David Robillard + + 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 sratom.h API for Sratom, an LV2 Atom RDF serialisation library. +*/ + +#ifndef SRATOM_SRATOM_H +#define SRATOM_SRATOM_H + +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" +#include "lv2/urid/urid.h" +#include "serd/serd.h" +#include "sord/sord.h" + +#include +#include + +#if defined(_WIN32) && !defined(SRATOM_STATIC) && defined(SRATOM_INTERNAL) +# define SRATOM_API __declspec(dllexport) +#elif defined(_WIN32) && !defined(SRATOM_STATIC) +# define SRATOM_API __declspec(dllimport) +#elif defined(__GNUC__) +# define SRATOM_API __attribute__((visibility("default"))) +#else +# define SRATOM_API +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @defgroup sratom Sratom + + A library for serialising LV2 Atoms. + + @{ +*/ + +/** + Atom serialiser. +*/ +typedef struct SratomImpl Sratom; + +/** + Mode for reading resources to LV2 Objects. + + This affects how resources (which are either blank nodes or have URIs) are + read by sratom_read(), since they may be read as simple references (a URI or + blank node ID) or a complete description (an atom "Object"). + + Currently, blank nodes are always read as Objects, but support for reading + blank node IDs may be added in the future. +*/ +typedef enum { + /** + Read blank nodes as Objects, and named resources as URIs. + */ + SRATOM_OBJECT_MODE_BLANK, + + /** + Read blank nodes and the main subject as Objects, and any other named + resources as URIs. The "main subject" is the subject parameter passed + to sratom_read(); if this is a resource it will be read as an Object, + but all other named resources encountered will be read as URIs. + */ + SRATOM_OBJECT_MODE_BLANK_SUBJECT +} SratomObjectMode; + +/** + Create a new Atom serialiser. +*/ +SRATOM_API +Sratom* +sratom_new(LV2_URID_Map* map); + +/** + Free an Atom serialisation. +*/ +SRATOM_API +void +sratom_free(Sratom* sratom); + +/** + Set the environment for reading or writing Turtle. + + This can be used to set namespace prefixes and a base URI for + sratom_to_turtle() and sratom_from_turtle(). +*/ +SRATOM_API +void +sratom_set_env(Sratom* sratom, SerdEnv* env); + +/** + Set the sink(s) where sratom will write its output. + + This must be called before calling sratom_write(). +*/ +SRATOM_API +void +sratom_set_sink(Sratom* sratom, + const char* base_uri, + SerdStatementSink sink, + SerdEndSink end_sink, + void* handle); + +/** + Write pretty numeric literals. + + If `pretty_numbers` is true, numbers will be written as pretty Turtle + literals, rather than string literals with precise types. The cost of this + is that the types might get fudged on a round-trip to RDF and back. +*/ +SRATOM_API +void +sratom_set_pretty_numbers(Sratom* sratom, bool pretty_numbers); + +/** + Configure how resources will be read to form LV2 Objects. +*/ +SRATOM_API +void +sratom_set_object_mode(Sratom* sratom, SratomObjectMode object_mode); + +/** + Write an Atom to RDF. + The serialised atom is written to the sink set by sratom_set_sink(). + @return 0 on success, or a non-zero error code otherwise. +*/ +SRATOM_API +int +sratom_write(Sratom* sratom, + LV2_URID_Unmap* unmap, + uint32_t flags, + const SerdNode* subject, + const SerdNode* predicate, + uint32_t type_urid, + uint32_t size, + const void* body); + +/** + Read an Atom from RDF. + The resulting atom will be written to `forge`. +*/ +SRATOM_API +void +sratom_read(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node); + +/** + Serialise an Atom to a Turtle string. + The returned string must be free()'d by the caller. +*/ +SRATOM_API +char* +sratom_to_turtle(Sratom* sratom, + LV2_URID_Unmap* unmap, + const char* base_uri, + const SerdNode* subject, + const SerdNode* predicate, + uint32_t type, + uint32_t size, + const void* body); + +/** + Read an Atom from a Turtle string. + The returned atom must be free()'d by the caller. +*/ +SRATOM_API +LV2_Atom* +sratom_from_turtle(Sratom* sratom, + const char* base_uri, + const SerdNode* subject, + const SerdNode* predicate, + const char* str); + +/** + A convenient resizing sink for LV2_Atom_Forge. + The handle must point to an initialized SerdChunk. +*/ +SRATOM_API +LV2_Atom_Forge_Ref +sratom_forge_sink(LV2_Atom_Forge_Sink_Handle handle, + const void* buf, + uint32_t size); + +/** + The corresponding deref function for sratom_forge_sink. +*/ +SRATOM_API +LV2_Atom* +sratom_forge_deref(LV2_Atom_Forge_Sink_Handle handle, LV2_Atom_Forge_Ref ref); + +/** + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* SRATOM_SRATOM_H */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,919 @@ +/* + Copyright 2012-2021 David Robillard + + 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. +*/ + +#include "sratom/sratom.h" + +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" +#include "lv2/atom/util.h" +#include "lv2/midi/midi.h" +#include "lv2/urid/urid.h" + +#include +#include +#include +#include +#include + +#define NS_RDF (const uint8_t*)"http://www.w3.org/1999/02/22-rdf-syntax-ns#" +#define NS_XSD (const uint8_t*)"http://www.w3.org/2001/XMLSchema#" + +#define USTR(str) ((const uint8_t*)(str)) + +static const SerdStyle style = + (SerdStyle)(SERD_STYLE_ABBREVIATED | SERD_STYLE_RESOLVED | SERD_STYLE_CURIED); + +typedef enum { MODE_SUBJECT, MODE_BODY, MODE_SEQUENCE } ReadMode; + +struct SratomImpl { + LV2_URID_Map* map; + LV2_Atom_Forge forge; + SerdEnv* env; + SerdNode base_uri; + SerdURI base; + SerdStatementSink write_statement; + SerdEndSink end_anon; + void* handle; + LV2_URID atom_Event; + LV2_URID atom_frameTime; + LV2_URID atom_beatTime; + LV2_URID midi_MidiEvent; + unsigned next_id; + SratomObjectMode object_mode; + uint32_t seq_unit; + struct { + SordNode* atom_childType; + SordNode* atom_frameTime; + SordNode* atom_beatTime; + SordNode* rdf_first; + SordNode* rdf_rest; + SordNode* rdf_type; + SordNode* rdf_value; + SordNode* xsd_base64Binary; + } nodes; + + bool pretty_numbers; +}; + +static void +read_node(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node, + ReadMode mode); + +Sratom* +sratom_new(LV2_URID_Map* map) +{ + Sratom* sratom = (Sratom*)calloc(1, sizeof(Sratom)); + if (sratom) { + sratom->map = map; + sratom->atom_Event = map->map(map->handle, LV2_ATOM__Event); + sratom->atom_frameTime = map->map(map->handle, LV2_ATOM__frameTime); + sratom->atom_beatTime = map->map(map->handle, LV2_ATOM__beatTime); + sratom->midi_MidiEvent = map->map(map->handle, LV2_MIDI__MidiEvent); + sratom->object_mode = SRATOM_OBJECT_MODE_BLANK; + lv2_atom_forge_init(&sratom->forge, map); + } + return sratom; +} + +void +sratom_free(Sratom* sratom) +{ + if (sratom) { + serd_node_free(&sratom->base_uri); + free(sratom); + } +} + +void +sratom_set_env(Sratom* sratom, SerdEnv* env) +{ + sratom->env = env; +} + +void +sratom_set_sink(Sratom* sratom, + const char* base_uri, + SerdStatementSink sink, + SerdEndSink end_sink, + void* handle) +{ + if (base_uri) { + serd_node_free(&sratom->base_uri); + sratom->base_uri = + serd_node_new_uri_from_string(USTR(base_uri), NULL, NULL); + serd_uri_parse(sratom->base_uri.buf, &sratom->base); + } + sratom->write_statement = sink; + sratom->end_anon = end_sink; + sratom->handle = handle; +} + +void +sratom_set_pretty_numbers(Sratom* sratom, bool pretty_numbers) +{ + sratom->pretty_numbers = pretty_numbers; +} + +void +sratom_set_object_mode(Sratom* sratom, SratomObjectMode object_mode) +{ + sratom->object_mode = object_mode; +} + +static void +gensym(SerdNode* out, char c, unsigned num) +{ + out->n_bytes = out->n_chars = snprintf((char*)out->buf, 10, "%c%u", c, num); +} + +static void +list_append(Sratom* sratom, + LV2_URID_Unmap* unmap, + unsigned* flags, + SerdNode* s, + SerdNode* p, + SerdNode* node, + uint32_t size, + uint32_t type, + const void* body) +{ + // Generate a list node + gensym(node, 'l', sratom->next_id); + sratom->write_statement(sratom->handle, *flags, NULL, s, p, node, NULL, NULL); + + // _:node rdf:first value + *flags = SERD_LIST_CONT; + *p = serd_node_from_string(SERD_URI, NS_RDF "first"); + sratom_write(sratom, unmap, *flags, node, p, type, size, body); + + // Set subject to node and predicate to rdf:rest for next time + gensym(node, 'l', ++sratom->next_id); + *s = *node; + *p = serd_node_from_string(SERD_URI, NS_RDF "rest"); +} + +static void +list_end(SerdStatementSink sink, + void* handle, + const unsigned flags, + SerdNode* s, + SerdNode* p) +{ + // _:node rdf:rest rdf:nil + const SerdNode nil = serd_node_from_string(SERD_URI, NS_RDF "nil"); + sink(handle, flags, NULL, s, p, &nil, NULL, NULL); +} + +static void +start_object(Sratom* sratom, + uint32_t* flags, + const SerdNode* subject, + const SerdNode* predicate, + const SerdNode* node, + const char* type) +{ + if (subject && predicate) { + sratom->write_statement(sratom->handle, + *flags | SERD_ANON_O_BEGIN, + NULL, + subject, + predicate, + node, + NULL, + NULL); + // Start abbreviating object properties + *flags |= SERD_ANON_CONT; + + // Object is in a list, stop list abbreviating if necessary + *flags &= ~SERD_LIST_CONT; + } + + if (type) { + SerdNode p = serd_node_from_string(SERD_URI, NS_RDF "type"); + SerdNode o = serd_node_from_string(SERD_URI, USTR(type)); + sratom->write_statement( + sratom->handle, *flags, NULL, node, &p, &o, NULL, NULL); + } +} + +static bool +path_is_absolute(const char* path) +{ + return (path[0] == '/' || (isalpha(path[0]) && path[1] == ':' && + (path[2] == '/' || path[2] == '\\'))); +} + +static SerdNode +number_type(const Sratom* sratom, const uint8_t* type) +{ + if (sratom->pretty_numbers && + (!strcmp((const char*)type, (const char*)NS_XSD "int") || + !strcmp((const char*)type, (const char*)NS_XSD "long"))) { + return serd_node_from_string(SERD_URI, NS_XSD "integer"); + } + + if (sratom->pretty_numbers && + (!strcmp((const char*)type, (const char*)NS_XSD "float") || + !strcmp((const char*)type, (const char*)NS_XSD "double"))) { + return serd_node_from_string(SERD_URI, NS_XSD "decimal"); + } + + return serd_node_from_string(SERD_URI, type); +} + +int +sratom_write(Sratom* sratom, + LV2_URID_Unmap* unmap, + uint32_t flags, + const SerdNode* subject, + const SerdNode* predicate, + uint32_t type_urid, + uint32_t size, + const void* body) +{ + const char* const type = unmap->unmap(unmap->handle, type_urid); + uint8_t idbuf[12] = "b0000000000"; + SerdNode id = serd_node_from_string(SERD_BLANK, idbuf); + uint8_t nodebuf[12] = "b0000000000"; + SerdNode node = serd_node_from_string(SERD_BLANK, nodebuf); + SerdNode object = SERD_NODE_NULL; + SerdNode datatype = SERD_NODE_NULL; + SerdNode language = SERD_NODE_NULL; + bool new_node = false; + if (type_urid == 0 && size == 0) { + object = serd_node_from_string(SERD_URI, USTR(NS_RDF "nil")); + } else if (type_urid == sratom->forge.String) { + object = serd_node_from_string(SERD_LITERAL, (const uint8_t*)body); + } else if (type_urid == sratom->forge.Chunk) { + datatype = serd_node_from_string(SERD_URI, NS_XSD "base64Binary"); + object = serd_node_new_blob(body, size, true); + new_node = true; + } else if (type_urid == sratom->forge.Literal) { + const LV2_Atom_Literal_Body* lit = (const LV2_Atom_Literal_Body*)body; + const uint8_t* str = USTR(lit + 1); + + object = serd_node_from_string(SERD_LITERAL, str); + if (lit->datatype) { + datatype = serd_node_from_string( + SERD_URI, USTR(unmap->unmap(unmap->handle, lit->datatype))); + } else if (lit->lang) { + const char* lang = unmap->unmap(unmap->handle, lit->lang); + const char* prefix = "http://lexvo.org/id/iso639-3/"; + const size_t prefix_len = strlen(prefix); + if (lang && !strncmp(lang, prefix, prefix_len)) { + language = serd_node_from_string(SERD_LITERAL, USTR(lang + prefix_len)); + } else { + fprintf(stderr, "Unknown language URID %u\n", lit->lang); + } + } + } else if (type_urid == sratom->forge.URID) { + const uint32_t urid = *(const uint32_t*)body; + const uint8_t* str = USTR(unmap->unmap(unmap->handle, urid)); + + object = serd_node_from_string(SERD_URI, str); + } else if (type_urid == sratom->forge.Path) { + const uint8_t* str = USTR(body); + if (path_is_absolute((const char*)str)) { + new_node = true; + object = serd_node_new_file_uri(str, NULL, NULL, true); + } else { + if (!sratom->base_uri.buf || + strncmp((const char*)sratom->base_uri.buf, "file://", 7)) { + fprintf(stderr, "warning: Relative path but base is not a file URI.\n"); + fprintf(stderr, "warning: Writing ambiguous atom:Path literal.\n"); + object = serd_node_from_string(SERD_LITERAL, str); + datatype = serd_node_from_string(SERD_URI, USTR(LV2_ATOM__Path)); + } else { + new_node = true; + SerdNode rel = serd_node_new_file_uri(str, NULL, NULL, true); + object = serd_node_new_uri_from_node(&rel, &sratom->base, NULL); + serd_node_free(&rel); + } + } + } else if (type_urid == sratom->forge.URI) { + object = serd_node_from_string(SERD_URI, USTR(body)); + } else if (type_urid == sratom->forge.Int) { + new_node = true; + object = serd_node_new_integer(*(const int32_t*)body); + datatype = number_type(sratom, NS_XSD "int"); + } else if (type_urid == sratom->forge.Long) { + new_node = true; + object = serd_node_new_integer(*(const int64_t*)body); + datatype = number_type(sratom, NS_XSD "long"); + } else if (type_urid == sratom->forge.Float) { + new_node = true; + object = serd_node_new_decimal(*(const float*)body, 8); + datatype = number_type(sratom, NS_XSD "float"); + } else if (type_urid == sratom->forge.Double) { + new_node = true; + object = serd_node_new_decimal(*(const double*)body, 16); + datatype = number_type(sratom, NS_XSD "double"); + } else if (type_urid == sratom->forge.Bool) { + const int32_t val = *(const int32_t*)body; + + datatype = serd_node_from_string(SERD_URI, NS_XSD "boolean"); + object = serd_node_from_string(SERD_LITERAL, USTR(val ? "true" : "false")); + } else if (type_urid == sratom->midi_MidiEvent) { + new_node = true; + datatype = serd_node_from_string(SERD_URI, USTR(LV2_MIDI__MidiEvent)); + + uint8_t* str = (uint8_t*)calloc(size * 2 + 1, 1); + for (uint32_t i = 0; i < size; ++i) { + snprintf((char*)str + (2 * i), + size * 2 + 1, + "%02X", + (unsigned)*((const uint8_t*)body + i)); + } + object = serd_node_from_string(SERD_LITERAL, USTR(str)); + } else if (type_urid == sratom->atom_Event) { + const LV2_Atom_Event* ev = (const LV2_Atom_Event*)body; + gensym(&id, 'e', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, NULL); + SerdNode time; + SerdNode p; + if (sratom->seq_unit == sratom->atom_beatTime) { + time = serd_node_new_decimal(ev->time.beats, 16); + p = serd_node_from_string(SERD_URI, USTR(LV2_ATOM__beatTime)); + datatype = number_type(sratom, NS_XSD "double"); + } else { + time = serd_node_new_integer(ev->time.frames); + p = serd_node_from_string(SERD_URI, USTR(LV2_ATOM__frameTime)); + datatype = number_type(sratom, NS_XSD "long"); + } + sratom->write_statement(sratom->handle, + SERD_ANON_CONT, + NULL, + &id, + &p, + &time, + &datatype, + &language); + serd_node_free(&time); + + p = serd_node_from_string(SERD_URI, NS_RDF "value"); + sratom_write(sratom, + unmap, + SERD_ANON_CONT, + &id, + &p, + ev->body.type, + ev->body.size, + LV2_ATOM_BODY(&ev->body)); + if (sratom->end_anon) { + sratom->end_anon(sratom->handle, &id); + } + } else if (type_urid == sratom->forge.Tuple) { + gensym(&id, 't', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, type); + SerdNode p = serd_node_from_string(SERD_URI, NS_RDF "value"); + flags |= SERD_LIST_O_BEGIN; + LV2_ATOM_TUPLE_BODY_FOREACH (body, size, i) { + list_append(sratom, + unmap, + &flags, + &id, + &p, + &node, + i->size, + i->type, + LV2_ATOM_BODY(i)); + } + list_end(sratom->write_statement, sratom->handle, flags, &id, &p); + if (sratom->end_anon) { + sratom->end_anon(sratom->handle, &id); + } + } else if (type_urid == sratom->forge.Vector) { + const LV2_Atom_Vector_Body* vec = (const LV2_Atom_Vector_Body*)body; + gensym(&id, 'v', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, type); + SerdNode p = + serd_node_from_string(SERD_URI, (const uint8_t*)LV2_ATOM__childType); + SerdNode child_type = serd_node_from_string( + SERD_URI, (const uint8_t*)unmap->unmap(unmap->handle, vec->child_type)); + sratom->write_statement( + sratom->handle, flags, NULL, &id, &p, &child_type, NULL, NULL); + p = serd_node_from_string(SERD_URI, NS_RDF "value"); + flags |= SERD_LIST_O_BEGIN; + for (const char* i = (const char*)(vec + 1); i < (const char*)vec + size; + i += vec->child_size) { + list_append(sratom, + unmap, + &flags, + &id, + &p, + &node, + vec->child_size, + vec->child_type, + i); + } + list_end(sratom->write_statement, sratom->handle, flags, &id, &p); + if (sratom->end_anon) { + sratom->end_anon(sratom->handle, &id); + } + } else if (lv2_atom_forge_is_object_type(&sratom->forge, type_urid)) { + const LV2_Atom_Object_Body* obj = (const LV2_Atom_Object_Body*)body; + const char* otype = unmap->unmap(unmap->handle, obj->otype); + + if (lv2_atom_forge_is_blank(&sratom->forge, type_urid, obj)) { + gensym(&id, 'b', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, otype); + } else { + id = serd_node_from_string( + SERD_URI, (const uint8_t*)unmap->unmap(unmap->handle, obj->id)); + flags = 0; + start_object(sratom, &flags, NULL, NULL, &id, otype); + } + LV2_ATOM_OBJECT_BODY_FOREACH (obj, size, prop) { + const char* const key = unmap->unmap(unmap->handle, prop->key); + SerdNode pred = serd_node_from_string(SERD_URI, USTR(key)); + sratom_write(sratom, + unmap, + flags, + &id, + &pred, + prop->value.type, + prop->value.size, + LV2_ATOM_BODY(&prop->value)); + } + if (sratom->end_anon && (flags & SERD_ANON_CONT)) { + sratom->end_anon(sratom->handle, &id); + } + } else if (type_urid == sratom->forge.Sequence) { + const LV2_Atom_Sequence_Body* seq = (const LV2_Atom_Sequence_Body*)body; + gensym(&id, 'v', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, type); + SerdNode p = serd_node_from_string(SERD_URI, NS_RDF "value"); + flags |= SERD_LIST_O_BEGIN; + LV2_ATOM_SEQUENCE_BODY_FOREACH (seq, size, ev) { + sratom->seq_unit = seq->unit; + list_append(sratom, + unmap, + &flags, + &id, + &p, + &node, + sizeof(LV2_Atom_Event) + ev->body.size, + sratom->atom_Event, + ev); + } + list_end(sratom->write_statement, sratom->handle, flags, &id, &p); + if (sratom->end_anon && subject && predicate) { + sratom->end_anon(sratom->handle, &id); + } + } else { + gensym(&id, 'b', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, type); + SerdNode p = serd_node_from_string(SERD_URI, NS_RDF "value"); + SerdNode o = serd_node_new_blob(body, size, true); + datatype = serd_node_from_string(SERD_URI, NS_XSD "base64Binary"); + sratom->write_statement( + sratom->handle, flags, NULL, &id, &p, &o, &datatype, NULL); + if (sratom->end_anon && subject && predicate) { + sratom->end_anon(sratom->handle, &id); + } + serd_node_free(&o); + } + + if (object.buf) { + SerdNode def_s = serd_node_from_string(SERD_BLANK, USTR("atom")); + SerdNode def_p = serd_node_from_string(SERD_URI, USTR(NS_RDF "value")); + + if (!subject) { + subject = &def_s; + } + + if (!predicate) { + predicate = &def_p; + } + + sratom->write_statement(sratom->handle, + flags, + NULL, + subject, + predicate, + &object, + &datatype, + &language); + } + + if (new_node) { + serd_node_free(&object); + } + + return 0; +} + +char* +sratom_to_turtle(Sratom* sratom, + LV2_URID_Unmap* unmap, + const char* base_uri, + const SerdNode* subject, + const SerdNode* predicate, + uint32_t type, + uint32_t size, + const void* body) +{ + SerdURI buri = SERD_URI_NULL; + SerdNode base = + serd_node_new_uri_from_string(USTR(base_uri), &sratom->base, &buri); + SerdEnv* env = sratom->env ? sratom->env : serd_env_new(NULL); + SerdChunk str = {NULL, 0}; + SerdWriter* writer = + serd_writer_new(SERD_TURTLE, style, env, &buri, serd_chunk_sink, &str); + + serd_env_set_base_uri(env, &base); + sratom_set_sink(sratom, + base_uri, + (SerdStatementSink)serd_writer_write_statement, + (SerdEndSink)serd_writer_end_anon, + writer); + sratom_write( + sratom, unmap, SERD_EMPTY_S, subject, predicate, type, size, body); + serd_writer_finish(writer); + + serd_writer_free(writer); + if (!sratom->env) { + serd_env_free(env); + } + + serd_node_free(&base); + return (char*)serd_chunk_sink_finish(&str); +} + +static void +read_list_value(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node, + ReadMode mode) +{ + SordNode* fst = sord_get(model, node, sratom->nodes.rdf_first, NULL, NULL); + SordNode* rst = sord_get(model, node, sratom->nodes.rdf_rest, NULL, NULL); + if (fst && rst) { + read_node(sratom, forge, world, model, fst, mode); + read_list_value(sratom, forge, world, model, rst, mode); + } + + sord_node_free(world, rst); + sord_node_free(world, fst); +} + +static void +read_resource(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node, + LV2_URID otype) +{ + LV2_URID_Map* map = sratom->map; + SordQuad q = {node, NULL, NULL, NULL}; + SordIter* i = sord_find(model, q); + SordQuad match; + for (; !sord_iter_end(i); sord_iter_next(i)) { + sord_iter_get(i, match); + const SordNode* p = match[SORD_PREDICATE]; + const SordNode* o = match[SORD_OBJECT]; + const char* p_uri = (const char*)sord_node_get_string(p); + uint32_t p_urid = map->map(map->handle, p_uri); + if (!(sord_node_equals(p, sratom->nodes.rdf_type) && + sord_node_get_type(o) == SORD_URI && + map->map(map->handle, (const char*)sord_node_get_string(o)) == + otype)) { + lv2_atom_forge_key(forge, p_urid); + read_node(sratom, forge, world, model, o, MODE_BODY); + } + } + sord_iter_free(i); +} + +static uint32_t +atom_size(Sratom* sratom, uint32_t type_urid) +{ + if (type_urid == sratom->forge.Int || type_urid == sratom->forge.Bool) { + return sizeof(int32_t); + } + + if (type_urid == sratom->forge.Long) { + return sizeof(int64_t); + } + + if (type_urid == sratom->forge.Float) { + return sizeof(float); + } + + if (type_urid == sratom->forge.Double) { + return sizeof(double); + } + + if (type_urid == sratom->forge.URID) { + return sizeof(uint32_t); + } + + return 0; +} + +static void +read_literal(Sratom* sratom, LV2_Atom_Forge* forge, const SordNode* node) +{ + assert(sord_node_get_type(node) == SORD_LITERAL); + + size_t len = 0; + const char* str = (const char*)sord_node_get_string_counted(node, &len); + SordNode* datatype = sord_node_get_datatype(node); + const char* language = sord_node_get_language(node); + if (datatype) { + const char* type_uri = (const char*)sord_node_get_string(datatype); + if (!strcmp(type_uri, (const char*)NS_XSD "int") || + !strcmp(type_uri, (const char*)NS_XSD "integer")) { + lv2_atom_forge_int(forge, strtol(str, NULL, 10)); + } else if (!strcmp(type_uri, (const char*)NS_XSD "long")) { + lv2_atom_forge_long(forge, strtol(str, NULL, 10)); + } else if (!strcmp(type_uri, (const char*)NS_XSD "float") || + !strcmp(type_uri, (const char*)NS_XSD "decimal")) { + lv2_atom_forge_float(forge, (float)serd_strtod(str, NULL)); + } else if (!strcmp(type_uri, (const char*)NS_XSD "double")) { + lv2_atom_forge_double(forge, serd_strtod(str, NULL)); + } else if (!strcmp(type_uri, (const char*)NS_XSD "boolean")) { + lv2_atom_forge_bool(forge, !strcmp(str, "true")); + } else if (!strcmp(type_uri, (const char*)NS_XSD "base64Binary")) { + size_t size = 0; + void* body = serd_base64_decode(USTR(str), len, &size); + lv2_atom_forge_atom(forge, size, forge->Chunk); + lv2_atom_forge_write(forge, body, size); + free(body); + } else if (!strcmp(type_uri, LV2_ATOM__Path)) { + lv2_atom_forge_path(forge, str, len); + } else if (!strcmp(type_uri, LV2_MIDI__MidiEvent)) { + lv2_atom_forge_atom(forge, len / 2, sratom->midi_MidiEvent); + for (const char* s = str; s < str + len; s += 2) { + unsigned num = 0u; + sscanf(s, "%2X", &num); + const uint8_t c = num; + lv2_atom_forge_raw(forge, &c, 1); + } + lv2_atom_forge_pad(forge, len / 2); + } else { + lv2_atom_forge_literal( + forge, str, len, sratom->map->map(sratom->map->handle, type_uri), 0); + } + } else if (language) { + const char* prefix = "http://lexvo.org/id/iso639-3/"; + const size_t lang_len = strlen(prefix) + strlen(language); + char* lang_uri = (char*)calloc(lang_len + 1, 1); + snprintf(lang_uri, lang_len + 1, "%s%s", prefix, language); + lv2_atom_forge_literal( + forge, str, len, 0, sratom->map->map(sratom->map->handle, lang_uri)); + free(lang_uri); + } else { + lv2_atom_forge_string(forge, str, len); + } +} + +static void +read_object(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node, + ReadMode mode) +{ + LV2_URID_Map* map = sratom->map; + size_t len = 0; + const char* str = (const char*)sord_node_get_string_counted(node, &len); + + SordNode* type = sord_get(model, node, sratom->nodes.rdf_type, NULL, NULL); + SordNode* value = sord_get(model, node, sratom->nodes.rdf_value, NULL, NULL); + + const uint8_t* type_uri = NULL; + uint32_t type_urid = 0; + if (type) { + type_uri = sord_node_get_string(type); + type_urid = map->map(map->handle, (const char*)type_uri); + } + + LV2_Atom_Forge_Frame frame = {0, 0}; + if (mode == MODE_SEQUENCE) { + SordNode* time = + sord_get(model, node, sratom->nodes.atom_beatTime, NULL, NULL); + uint32_t seq_unit = 0u; + if (time) { + const char* time_str = (const char*)sord_node_get_string(time); + lv2_atom_forge_beat_time(forge, serd_strtod(time_str, NULL)); + seq_unit = sratom->atom_beatTime; + } else { + time = sord_get(model, node, sratom->nodes.atom_frameTime, NULL, NULL); + const char* time_str = + time ? (const char*)sord_node_get_string(time) : ""; + lv2_atom_forge_frame_time(forge, serd_strtod(time_str, NULL)); + seq_unit = sratom->atom_frameTime; + } + read_node(sratom, forge, world, model, value, MODE_BODY); + sord_node_free(world, time); + sratom->seq_unit = seq_unit; + } else if (type_urid == sratom->forge.Tuple) { + lv2_atom_forge_tuple(forge, &frame); + read_list_value(sratom, forge, world, model, value, MODE_BODY); + } else if (type_urid == sratom->forge.Sequence) { + const LV2_Atom_Forge_Ref ref = + lv2_atom_forge_sequence_head(forge, &frame, 0); + sratom->seq_unit = 0; + read_list_value(sratom, forge, world, model, value, MODE_SEQUENCE); + + LV2_Atom_Sequence* seq = + (LV2_Atom_Sequence*)lv2_atom_forge_deref(forge, ref); + seq->body.unit = + (sratom->seq_unit == sratom->atom_frameTime) ? 0 : sratom->seq_unit; + } else if (type_urid == sratom->forge.Vector) { + SordNode* child_type_node = + sord_get(model, node, sratom->nodes.atom_childType, NULL, NULL); + uint32_t child_type = + map->map(map->handle, (const char*)sord_node_get_string(child_type_node)); + uint32_t child_size = atom_size(sratom, child_type); + if (child_size > 0) { + LV2_Atom_Forge_Ref ref = + lv2_atom_forge_vector_head(forge, &frame, child_size, child_type); + read_list_value(sratom, forge, world, model, value, MODE_BODY); + lv2_atom_forge_pop(forge, &frame); + frame.ref = 0; + lv2_atom_forge_pad(forge, lv2_atom_forge_deref(forge, ref)->size); + } + sord_node_free(world, child_type_node); + } else if (value && sord_node_equals(sord_node_get_datatype(value), + sratom->nodes.xsd_base64Binary)) { + size_t vlen = 0; + const uint8_t* vstr = sord_node_get_string_counted(value, &vlen); + size_t size = 0; + void* body = serd_base64_decode(vstr, vlen, &size); + lv2_atom_forge_atom(forge, size, type_urid); + lv2_atom_forge_write(forge, body, size); + free(body); + } else if (sord_node_get_type(node) == SORD_URI) { + lv2_atom_forge_object(forge, &frame, map->map(map->handle, str), type_urid); + read_resource(sratom, forge, world, model, node, type_urid); + } else { + lv2_atom_forge_object(forge, &frame, 0, type_urid); + read_resource(sratom, forge, world, model, node, type_urid); + } + + if (frame.ref) { + lv2_atom_forge_pop(forge, &frame); + } + sord_node_free(world, value); + sord_node_free(world, type); +} + +static void +read_node(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node, + ReadMode mode) +{ + LV2_URID_Map* map = sratom->map; + size_t len = 0; + const char* str = (const char*)sord_node_get_string_counted(node, &len); + if (sord_node_get_type(node) == SORD_LITERAL) { + read_literal(sratom, forge, node); + } else if (sord_node_get_type(node) == SORD_URI && + !(sratom->object_mode == SRATOM_OBJECT_MODE_BLANK_SUBJECT && + mode == MODE_SUBJECT)) { + if (!strcmp(str, (const char*)NS_RDF "nil")) { + lv2_atom_forge_atom(forge, 0, 0); + } else if (!strncmp(str, "file://", 7)) { + SerdURI uri; + serd_uri_parse((const uint8_t*)str, &uri); + + SerdNode rel = + serd_node_new_relative_uri(&uri, &sratom->base, NULL, NULL); + uint8_t* path = serd_file_uri_parse(rel.buf, NULL); + if (path) { + lv2_atom_forge_path( + forge, (const char*)path, strlen((const char*)path)); + serd_free(path); + } else { + // FIXME: Report errors (required API change) + lv2_atom_forge_atom(forge, 0, 0); + } + serd_node_free(&rel); + } else { + lv2_atom_forge_urid(forge, map->map(map->handle, str)); + } + } else { + read_object(sratom, forge, world, model, node, mode); + } +} + +void +sratom_read(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node) +{ + sratom->nodes.atom_childType = sord_new_uri(world, USTR(LV2_ATOM__childType)); + sratom->nodes.atom_frameTime = sord_new_uri(world, USTR(LV2_ATOM__frameTime)); + sratom->nodes.atom_beatTime = sord_new_uri(world, USTR(LV2_ATOM__beatTime)); + sratom->nodes.rdf_first = sord_new_uri(world, NS_RDF "first"); + sratom->nodes.rdf_rest = sord_new_uri(world, NS_RDF "rest"); + sratom->nodes.rdf_type = sord_new_uri(world, NS_RDF "type"); + sratom->nodes.rdf_value = sord_new_uri(world, NS_RDF "value"); + sratom->nodes.xsd_base64Binary = sord_new_uri(world, NS_XSD "base64Binary"); + + sratom->next_id = 1; + read_node(sratom, forge, world, model, node, MODE_SUBJECT); + + sord_node_free(world, sratom->nodes.xsd_base64Binary); + sord_node_free(world, sratom->nodes.rdf_value); + sord_node_free(world, sratom->nodes.rdf_type); + sord_node_free(world, sratom->nodes.rdf_rest); + sord_node_free(world, sratom->nodes.rdf_first); + sord_node_free(world, sratom->nodes.atom_frameTime); + sord_node_free(world, sratom->nodes.atom_beatTime); + sord_node_free(world, sratom->nodes.atom_childType); + memset(&sratom->nodes, 0, sizeof(sratom->nodes)); +} + +LV2_Atom_Forge_Ref +sratom_forge_sink(LV2_Atom_Forge_Sink_Handle handle, + const void* buf, + uint32_t size) +{ + SerdChunk* chunk = (SerdChunk*)handle; + const LV2_Atom_Forge_Ref ref = chunk->len + 1; + serd_chunk_sink(buf, size, chunk); + return ref; +} + +LV2_Atom* +sratom_forge_deref(LV2_Atom_Forge_Sink_Handle handle, LV2_Atom_Forge_Ref ref) +{ + SerdChunk* chunk = (SerdChunk*)handle; + return (LV2_Atom*)(chunk->buf + ref - 1); +} + +LV2_Atom* +sratom_from_turtle(Sratom* sratom, + const char* base_uri, + const SerdNode* subject, + const SerdNode* predicate, + const char* str) +{ + SerdChunk out = {NULL, 0}; + SerdNode base = + serd_node_new_uri_from_string(USTR(base_uri), &sratom->base, NULL); + SordWorld* world = sord_world_new(); + SordModel* model = sord_new(world, SORD_SPO, false); + SerdEnv* env = sratom->env ? sratom->env : serd_env_new(&base); + SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL); + + if (!serd_reader_read_string(reader, (const uint8_t*)str)) { + SordNode* s = sord_node_from_serd_node(world, env, subject, 0, 0); + lv2_atom_forge_set_sink( + &sratom->forge, sratom_forge_sink, sratom_forge_deref, &out); + if (subject && predicate) { + SordNode* p = sord_node_from_serd_node(world, env, predicate, 0, 0); + SordNode* o = sord_get(model, s, p, NULL, NULL); + if (o) { + sratom_read(sratom, &sratom->forge, world, model, o); + sord_node_free(world, o); + } else { + fprintf(stderr, "Failed to find node\n"); + } + } else { + sratom_read(sratom, &sratom->forge, world, model, s); + } + } else { + fprintf(stderr, "Failed to read Turtle\n"); + } + + serd_reader_free(reader); + if (!sratom->env) { + serd_env_free(env); + } + + sord_free(model); + sord_world_free(world); + serd_node_free(&base); + + return (LV2_Atom*)out.buf; +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,190 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : ipslcontextinfo.h +// Created by : PreSonus Software Ltd., 08/2013, last updated 11/2016 +// Description : Context Information Interface +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _ipslcontextinfo_h +#define _ipslcontextinfo_h + +#include "pluginterfaces/vst/vsttypes.h" +#include "pluginterfaces/base/falignpush.h" + +namespace Presonus { + +//************************************************************************************************ +// IContextInfoProvider +/** Callback interface to access context information from the host. Implemented by the host + as extension of Steinberg::Vst::IComponentHandler. + + The host might not be able to report all available attributes at all times. Please check the + return value of getContextInfoValue() and getContextInfoString(). It's not required to implement + IContextInfoHandler on the plug-in side, but we recommend to do so. The host will then call + notifyContextInfoChange() during initialization to inform the plug-in about the initial state of + the available attributes. + + Usage Example: + + IComponentHandler* handler; + FUnknownPtr contextInfoProvider (handler); + + void PLUGIN_API MyEditController::notifyContextInfoChange () + { + int32 channelIndex = 0; + contextInfoProvider->getContextInfoValue (channelIndex, ContextInfo::kIndex); + + TChar channelName[128] = {0}; + contextInfoProvider->getContextInfoString (channelName, 128, ContextInfo::kName); + } +*/ +//************************************************************************************************ + +struct IContextInfoProvider: Steinberg::FUnknown +{ + /** Get context information by identifier. */ + virtual Steinberg::tresult PLUGIN_API getContextInfoValue (Steinberg::int32& value, Steinberg::FIDString id) = 0; + + /** Get context information by identifier. */ + virtual Steinberg::tresult PLUGIN_API getContextInfoString (Steinberg::Vst::TChar* string, Steinberg::int32 maxCharCount, Steinberg::FIDString id) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IContextInfoProvider, 0x483e61ea, 0x17994494, 0x8199a35a, 0xebb35e3c) + +//************************************************************************************************ +// IContextInfoProvider2 +/** Extension to IContextInfoProvider enabling the plug-in to modify host context information. + Values like volume or pan support both, numeric and string representation for get and set.*/ +//************************************************************************************************ + +struct IContextInfoProvider2: IContextInfoProvider +{ + using IContextInfoProvider::getContextInfoValue; + + /** Get context information by identifier (floating-point). */ + virtual Steinberg::tresult PLUGIN_API getContextInfoValue (double& value, Steinberg::FIDString id) = 0; + + /** Set context information by identifier (floating-point). */ + virtual Steinberg::tresult PLUGIN_API setContextInfoValue (Steinberg::FIDString id, double value) = 0; + + /** Set context information by identifier (integer). */ + virtual Steinberg::tresult PLUGIN_API setContextInfoValue (Steinberg::FIDString id, Steinberg::int32 value) = 0; + + /** Set context information by identifier (string). */ + virtual Steinberg::tresult PLUGIN_API setContextInfoString (Steinberg::FIDString id, Steinberg::Vst::TChar* string) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IContextInfoProvider2, 0x61e45968, 0x3d364f39, 0xb15e1733, 0x4944172b) + +//************************************************************************************************ +// IContextInfoHandler +/** Notification interface for context information changes. Implemented by the plug-in as extension of + Steinberg::Vst::IEditController. */ +//************************************************************************************************ + +struct IContextInfoHandler: Steinberg::FUnknown +{ + /** Called by the host if context information has changed. */ + virtual void PLUGIN_API notifyContextInfoChange () = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IContextInfoHandler, 0xc3b17bc0, 0x2c174494, 0x80293402, 0xfbc4bbf8) + +//************************************************************************************************ +// IContextInfoHandler2 +/** Replacement of IContextInfoHandler passing additional information about what changed on the host-side. + This interface will be preferred if implemented by the plug-in. It is required to + receive certain notifications like volume, pan, etc. */ +//************************************************************************************************ + +struct IContextInfoHandler2: Steinberg::FUnknown +{ + /** Called by the host if context information has changed. + The identifier (id) is empty for the inital update. */ + virtual void PLUGIN_API notifyContextInfoChange (Steinberg::FIDString id) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IContextInfoHandler2, 0x31e29a7a, 0xe55043ad, 0x8b95b9b8, 0xda1fbe1e) + +//************************************************************************************************ +// Context Information Attributes +//************************************************************************************************ + +namespace ContextInfo +{ + /** Channel types. */ + enum ChannelType + { + kTrack = 0, ///< audio track + kBus, ///< audio bus + kFX, ///< FX channel + kSynth, ///< output of virtual instrument + kIn, ///< input from audio driver + kOut ///< output to audio driver (main or sub-out) + }; + + /** Channel index mode. */ + enum ChannelIndexMode + { + kFlatIndex = 0, ///< channel indices are contiguous (example: track 1, track 2, bus 3, bus 4) + kPerTypeIndex ///< channel indices restarts at zero for each type (example: track 1, track 2, bus 1, bus 2) + }; + + // per instance + const Steinberg::FIDString kID = "id"; ///< (R) channel identifier, use to compare identity (string) + const Steinberg::FIDString kName = "name"; ///< (R/W) channel name, can be displayed to the user (string) + const Steinberg::FIDString kType = "type"; ///< (R) channel type (int32, see ChannelType enumeration) + const Steinberg::FIDString kMain = "main"; ///< (R) channel is main output (int32, 0: false, 1: true) + const Steinberg::FIDString kIndex = "index"; ///< (R) channel index (int32, starts at zero) + const Steinberg::FIDString kColor = "color"; ///< (R/W) channel color (int32: RGBA) + const Steinberg::FIDString kVisibility = "visibility"; ///< (R) channel visibility (int32, 0: false, 1: true) + const Steinberg::FIDString kSelected = "selected"; ///< (R/W) selection state, channel is selected exlusively and scrolled into view on write (int32, 0: false, 1: true) + const Steinberg::FIDString kMultiSelect = "multiselect"; ///< (W) select channel without unselecting others (int32, 0: false, 1: true) + const Steinberg::FIDString kFocused = "focused"; ///< (R) focus for user input when multiple channels are selected (int32, 0: false, 1: true) + + const Steinberg::FIDString kRegionName = "regionName"; ///< (R) name of region/event for region/event-based effects (string) + const Steinberg::FIDString kRegionSelected = "regionSelected"; ///< (R) selection state of region/event for region/event-based effects (int32, 0: false, 1: true) + + // per instance (requires IContextInfoHandler2 on plug-in side) + const Steinberg::FIDString kVolume = "volume"; ///< (R/W) volume factor [float, 0. = -oo dB, 1. = 0dB, etc.], also available as string + const Steinberg::FIDString kMaxVolume = "maxVolume"; ///< (R) maximum volume factor [float, 1. = 0dB], also available as string + const Steinberg::FIDString kPan = "pan"; ///< (R/W) stereo panning [float, < 0.5 = (L), 0.5 = (C), > 0.5 = (R)], also available as string + const Steinberg::FIDString kMute = "mute"; ///< (R/W) mute (int32, 0: false, 1: true) + const Steinberg::FIDString kSolo = "solo"; ///< (R/W) solo (int32, 0: false, 1: true) + const Steinberg::FIDString kSendCount = "sendcount"; ///< (R) send count [int] + const Steinberg::FIDString kSendLevel = "sendlevel"; ///< (R/W) send level factor, index is appended to id (e.g. "sendlevel0" for first), also available as string + const Steinberg::FIDString kMaxSendLevel = "maxSendlevel"; ///< (R) maximum send level factor, also available as string + + // global + const Steinberg::FIDString kActiveDocumentID = "activeDocumentID"; ///< (R) active document identifier, use to get identity of the active document (string) + const Steinberg::FIDString kDocumentID = "documentID"; ///< (R) document identifier, use to compare identity (string) + const Steinberg::FIDString kDocumentName = "documentName"; ///< (R) document name, can be displayed to user (string) + const Steinberg::FIDString kDocumentFolder = "documentFolder"; ///< (R) document folder (string) + const Steinberg::FIDString kAudioFolder = "audioFolder"; ///< (R) folder for audio files (string) + const Steinberg::FIDString kIndexMode = "indexMode"; ///< (R) channel index mode (default is flat, see ChannelIndexMode enumeration) +} + +} // namespace Presonus + +#include "pluginterfaces/base/falignpop.h" + +#endif // _ipslcontextinfo_h \ No newline at end of file diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,108 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : ipsleditcontroller.h +// Created by : PreSonus Software Ltd., 02/2017, last updated 10/2017 +// Description : Plug-in Edit Controller Extension Interface +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _ipsleditcontroller_h +#define _ipsleditcontroller_h + +#include "pluginterfaces/vst/vsttypes.h" +#include "pluginterfaces/base/funknown.h" +#include "pluginterfaces/base/falignpush.h" + +namespace Steinberg { +namespace Vst { +class IEditController; }} + +namespace Presonus { + +/** Parameter extra flags. Used with IEditControllerExtra. */ +enum ParamExtraFlags +{ + kParamFlagMicroEdit = 1<<0 ///< parameter should be displayed in host micro view +}; + +/** Automation mode. Used with IEditControllerExtra. */ +enum AutomationMode +{ + kAutomationNone = 0, ///< no automation data available + kAutomationOff, ///< data available, but mode is set to off + kAutomationRead, ///< data + read mode + kAutomationTouch, ///< data + touch mode + kAutomationLatch, ///< data + latch mode + kAutomationWrite ///< data + write mode +}; + +/** Slave mode. Used with ISlaveControllerHandler. */ +enum SlaveMode +{ + kSlaveModeNormal, ///< plug-in used in different location following given master + kSlaveModeLowLatencyClone ///< plug-in used as hidden slave for low latency processing following given master +}; + +//************************************************************************************************ +// IEditControllerExtra +/** Extension to Steinberg::Vst::IEditController with additonal flags and notifications + not available in the standard edit controller interface. */ +//************************************************************************************************ + +struct IEditControllerExtra: Steinberg::FUnknown +{ + /** Get extra flags for given parameter (see ParamExtraFlags). */ + virtual Steinberg::int32 PLUGIN_API getParamExtraFlags (Steinberg::Vst::ParamID id) = 0; + + /** Set automation mode for given parameter (see AutomationMode). */ + virtual Steinberg::tresult PLUGIN_API setParamAutomationMode (Steinberg::Vst::ParamID id, Steinberg::int32 automationMode) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IEditControllerExtra, 0x50553fd9, 0x1d2c4c24, 0xb410f484, 0xc5fb9f3f) + +//************************************************************************************************ +// ISlaveControllerHandler +/** Extension to Steinberg::Vst::IEditController used to notify the plug-in about slave instances. + + The host might decide to use "cloned" (slave) instances in various scenarios, e.g. to process + audio paths with different latencies simultaneously or to synchronize grouped plug-in instances + between multiple mixer channels - see SlaveMode. In this case multiple plug-in instances are active + at the same time even though it looks like one to the user, i.e. only the editor of the master + instance is visible and can be used to change parameters. The edit controller implementation has + to synchronize parameter changes between instances that aren't visible to the host internally. +*/ +//************************************************************************************************ + +struct ISlaveControllerHandler: Steinberg::FUnknown +{ + /** Add slave edit controller. Implementation must sync non-automatable parameters between + this instance (master) and given slave instance internally, i.e. when the master (this) + changes update all connected slaves. + */ + virtual Steinberg::tresult PLUGIN_API addSlave (Steinberg::Vst::IEditController* slave, Steinberg::int32 slaveMode) = 0; + + /** Remove slave edit controller. */ + virtual Steinberg::tresult PLUGIN_API removeSlave (Steinberg::Vst::IEditController* slave) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (ISlaveControllerHandler, 0xd93894bd, 0x67454c29, 0x977ae2f5, 0xdb380434) + +} // namespace Presonus + +#include "pluginterfaces/base/falignpop.h" + +#endif // _ipsleditcontroller_h diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,53 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : ipslgainreduction.h +// Created by : PreSonus Software Ltd., 03/2015 +// Description : Plug-in Gain Reduction Interface +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _ipslgainreduction_h +#define _ipslgainreduction_h + +#include "pluginterfaces/base/funknown.h" +#include "pluginterfaces/base/falignpush.h" + +namespace Presonus { + +//************************************************************************************************ +// IGainReductionInfo +/** Interface to report gain reduction imposed to the audio signal by the plug-in to the + host for display in the UI. Implemented by the VST3 edit controller class. +*/ +//************************************************************************************************ + +struct IGainReductionInfo: Steinberg::FUnknown +{ + /** Get current gain reduction for display. The returned value in dB is either 0.0 (no reduction) + or negative. The host calls this function periodically while the plug-in is active. + The value is used AS IS for UI display purposes, without imposing additional ballistics or + presentation latency compensation. Be sure to return zero if processing is bypassed internally. + For multiple reduction stages, please report the sum in dB here. + */ + virtual double PLUGIN_API getGainReductionValueInDb () = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IGainReductionInfo, 0x8e3c292c, 0x95924f9d, 0xb2590b1e, 0x100e4198) + +} // namespace Presonus + +#include "pluginterfaces/base/falignpop.h" + +#endif // _ipslgainreduction_h \ No newline at end of file diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,121 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : ipslhostcommands.h +// Created by : PreSonus Software Ltd., 11/2009 +// Description : Host Command Interface +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _ipslhostcommands_h +#define _ipslhostcommands_h + +#include "pluginterfaces/vst/vsttypes.h" +#include "pluginterfaces/base/funknown.h" +#include "pluginterfaces/base/falignpush.h" + +namespace Steinberg { +class IPlugView; } + +namespace Presonus { + +struct ICommandList; + +//************************************************************************************************ +// IHostCommandHandler +/** Callback interface to access host-specific parameter commands to be integrated + into a context menu inside the plug-in editor. Implemented as extension of + Steinberg::Vst::IComponentHandler. + + Please note that the intention of this set of interfaces is not to allow a generic menu + implementation. This is the responsibility of a GUI toolkit. It basically provides + a way to enumerate and execute commands anonymously, i.e. the plug-in does not have to + know the exact sematics of the commands and the host does not break the consistency of + the plug-in GUI. + + Usage Example: + + IComponentHandler* handler; + FUnknownPtr commandHandler (handler); + if(commandHandler) + if(ICommandList* commandList = commandHandler->createParamCommands (kMyParamId)) + { + FReleaser commandListReleaser (commandList); + commandHandler->popupCommandMenu (commandList, xPos, yPos); + } +*/ +//************************************************************************************************ + +struct IHostCommandHandler: Steinberg::FUnknown +{ + /** Create list of currently available host commands for given parameter. + The command list has a short lifecycle, it is recreated whenever + a context menu should appear. The returned pointer can be null, otherwise + it has to be released. */ + virtual ICommandList* PLUGIN_API createParamCommands (Steinberg::Vst::ParamID tag) = 0; + + /** Helper to popup a command menu at given position. + Coordinates are relative to view or in screen coordintes if view is null. + Can be used for testing purpose, if the plug-in does not have its own context menu implementation + or if it wants to use the look & feel of the host menu. This method is not supposed + to support command lists implemented by the plug-in. */ + virtual Steinberg::tresult PLUGIN_API popupCommandMenu (ICommandList* commandList, Steinberg::int32 xPos, Steinberg::int32 yPos, Steinberg::IPlugView* view = 0) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IHostCommandHandler, 0xF92032CD, 0x7A84407C, 0xABE6F863, 0x058EA6C2) + +//************************************************************************************************ +// CommandInfo +/** Describes a single command. */ +//************************************************************************************************ + +struct CommandInfo +{ + Steinberg::Vst::String128 title; ///< command title (possibly localized into active host language) + Steinberg::int32 flags; ///< command flags + + enum CommandFlags + { + kCanExecute = 1<<0, ///< used to display command enabled/disabled + kIsSeparator = 1<<1, ///< not a command, it's a separator + kIsChecked = 1<<2 ///< used to display command with a check mark + }; +}; + +//************************************************************************************************ +// ICommandList +/** Describes a list of commands. */ +//************************************************************************************************ + +struct ICommandList: Steinberg::FUnknown +{ + /** Returns the number of commands. */ + virtual Steinberg::int32 PLUGIN_API getCommandCount () = 0; + + /** Get command information for a given index. */ + virtual Steinberg::tresult PLUGIN_API getCommandInfo (Steinberg::int32 index, CommandInfo& info) = 0; + + /** Execute command at given index. */ + virtual Steinberg::tresult PLUGIN_API executeCommand (Steinberg::int32 index) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (ICommandList, 0xC5A687DB, 0x82F344E9, 0xB378254A, 0x47C4D712) + +} // namespace Presonus + +#include "pluginterfaces/base/falignpop.h" + +#endif // _ipslhostcommands_h \ No newline at end of file diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,53 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : ipslviewembedding.h +// Created by : PreSonus Software Ltd., 05/2012 +// Description : Plug-in View Embedding Interface +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _ipslviewembedding_h +#define _ipslviewembedding_h + +#include "pluginterfaces/base/funknown.h" +#include "pluginterfaces/base/falignpush.h" + +namespace Steinberg { +class IPlugView; } + +namespace Presonus { + +//************************************************************************************************ +// IPlugInViewEmbedding +/** Support for plug-in view embedding, to be implemented by the VST3 controller class. */ +//************************************************************************************************ + +class IPlugInViewEmbedding: public Steinberg::FUnknown +{ +public: + /** Check if view embedding is supported. */ + virtual Steinberg::TBool PLUGIN_API isViewEmbeddingSupported () = 0; + + /** Inform plug-in that its view will be embedded. */ + virtual Steinberg::tresult PLUGIN_API setViewIsEmbedded (Steinberg::IPlugView* view, Steinberg::TBool embedded) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IPlugInViewEmbedding, 0xda57e6d1, 0x1f3242d1, 0xad9c1a82, 0xfdb95695) + +} // namespace Presonus + +#include "pluginterfaces/base/falignpop.h" + +#endif // _ipslviewembedding_h \ No newline at end of file diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,67 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : ipslviewscaling.h +// Created by : PreSonus Software Ltd., 03/2015 +// Description : Plug-in View DPI Scaling Interface +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _ipslviewscaling_h +#define _ipslviewscaling_h + +#include "pluginterfaces/base/funknown.h" +#include "pluginterfaces/base/falignpush.h" + +namespace Presonus { + +//************************************************************************************************ +// IPlugInViewScaling +/** Support for plug-in view content scaling, to be implemented by the VST3 IPlugView class. + + On Windows, if a process is "DPI-aware" and the system DPI setting is different from the default + value of 96 DPI, the application is responsible to scale the contents of its windows accordingly, + including child windows provided by 3rd party plug-ins. + + This interface is used by the host to inform the plug-in about the current scaling factor. + The scaling factor is used to convert user space coordinates aka DIPs (device-independent pixels) + to physical pixels on screen. + + The plug-in has to be prepared to deal with the following scaling factors: + + 96 DPI = 100% scaling (factor = 1.0) + 120 DPI = 125% scaling (factor = 1.25) + 144 DPI = 150% scaling (factor = 1.5) + 192 DPI = 200% scaling (factor = 2.0) + + On Windows 8.1 or later DPI settings are per monitor. The scaling factor for a window can change + when it is moved between screens. +*/ +//************************************************************************************************ + +struct IPlugInViewScaling: Steinberg::FUnknown +{ + /** Inform the view about the current content scaling factor. The scaling factor can change + if the window is moved between screens. + */ + virtual Steinberg::tresult PLUGIN_API setContentScaleFactor (float factor) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IPlugInViewScaling, 0x65ed9690, 0x8ac44525, 0x8aadef7a, 0x72ea703f) + +} // namespace Presonus + +#include "pluginterfaces/base/falignpop.h" + +#endif // _ipslviewscaling_h \ No newline at end of file diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,57 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : pslauextensions.h +// Created by : PreSonus Software Ltd., 08/2017, last updated 10/2017 +// Description : PreSonus-specific AU API Extensions +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. + */ +//************************************************************************************************ + +#ifndef _pslauextensions_h +#define _pslauextensions_h + +#ifdef __cplusplus +namespace Presonus { +#endif + +////////////////////////////////////////////////////////////////////////////////////////////////// +// Property IDs +////////////////////////////////////////////////////////////////////////////////////////////////// + +/** This AU property in the global scope is of type CFArrayRef and is writable by the host. + The elements of the array are of type CFDataRef which encapsulate SlaveMode structures. + For more details, please check the documentation of Presonus::ISlaveControllerHandler. */ +static const AudioUnitPropertyID kSlaveEffectsPropID = 0x50534C01; + +////////////////////////////////////////////////////////////////////////////////////////////////// +// Data types +////////////////////////////////////////////////////////////////////////////////////////////////// + +enum SlaveMode +{ + kSlaveModeNormal, ///< plug-in used in different location following given master + kSlaveModeLowLatencyClone ///< plug-in used as hidden slave for low latency processing following given master +}; + +////////////////////////////////////////////////////////////////////////////////////////////////// + +struct SlaveEffect +{ + AudioUnit unit; ///< Audio Unit reference + SInt32 mode; ///< SlaveMode +}; + +#ifdef __cplusplus +} +#endif + +#endif // _pslauextensions_h diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h --- juce-6.1.5~ds0/modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,111 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : pslvst2extensions.h +// Created by : PreSonus Software Ltd., 05/2012, last updated 08/2017 +// Description : PreSonus-specific VST2 API Extensions +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _pslvst2extensions_h +#define _pslvst2extensions_h + +namespace Presonus { + +////////////////////////////////////////////////////////////////////////////////////////////////// +// CanDo Strings +////////////////////////////////////////////////////////////////////////////////////////////////// + +/** Identifiers to be passed to VST2's canDo() method. */ +namespace PlugCanDos +{ + /** Check if view can be resized by the host. */ + static const char* canDoViewResize = "supportsViewResize"; + + /** Check if view can be embedded by the host. */ + static const char* canDoViewEmbedding = "supportsViewEmbedding"; + + /** Check if view scaling for high-DPI is supported by the plug-in. */ + static const char* canDoViewDpiScaling = "supportsViewDpiScaling"; + + /** Check if gain reduction reporting is supported by the plug-in. */ + static const char* canDoGainReductionInfo = "supportsGainReductionInfo"; + + /** Check if slave effects are supported by plug-in. */ + static const char* canDoSlaveEffects = "supportsSlaveEffects"; +} + +////////////////////////////////////////////////////////////////////////////////////////////////// +// Opcodes +////////////////////////////////////////////////////////////////////////////////////////////////// + +/** Vendor-specific opcodes a VST2 plug-in can implement to add non-standard features like + embedding its views as subview into the host, resizing from the host, high-DPI scaling, etc. + + Embedding corresponds to the Presonus::IPlugInViewEmbedding VST3 extended interface. + + Resizing works like VST3's checkSizeConstraint() and onSize() methods, VST3's canResize() + is defined via canDoViewResize. + + For "DPI-aware" host applications on the Windows platform a similar mimic to the + Presonus::IPlugInViewScaling VST3 extended interface is defined here. + + Gain reduction reporting corresponds to the Presonus::IGainReductionInfo VST3 interface. + + Slave effect handling corresponds to the Presonus::ISlaveControllerHandler VST3 interface. +*/ +enum Opcodes +{ + /** PreSonus vendor ID - distinguishes our calls from other VST2 extensions. + Pass this vendor ID as "index" (aka "lArg1") parameter for vendor specific calls. */ + kVendorID = 'PreS', + + /** The host can suggest a new editor size, and the plug-in can modify the suggested + size to a suitable value if it cannot resize to the given values. + The ptrArg is a ERect* to the input/output rect. This differs from the ERect** + used by effEditGetRect, because here the rect is owned by the host, not the plug-in. + The result is 0 on failure, 1 on success. */ + kEffEditCheckSizeConstraints = 'AeCc', + + /** The host can set a new size after negotiating the size via the above + kEffEditCheckSizeConstraints, triggering the actual resizing. + The ptrArg is a ERect* to the input/output rect. This differs from the ERect** + used by effEditGetRect, because here the rect is owned by the host, not the plug-in. + The result is 0 on failure, 1 on success. */ + kEffEditSetRect = 'AeSr', + + /** When the view is embedded, it may need to adjust its UI, e.g. by suppressing + its built-in resizing facility because this is then controlled by the host. + The ptrArg is a VstInt32*, pointing to 0 to disable or to 1 to enable embedding. + Per default, embedding is disabled until the host calls this to indicate otherwise. */ + kEffEditSetEmbedded = 'AeEm', + + /** Inform the view about the current content scaling factor. The factor is passed in the opt argument. + For more details, please check the documentation of Presonus::IPlugInViewScaling. */ + kEffEditSetContentScaleFactor = 'AeCs', + + /** Get current gain reduction for display. The ptrArg is a float* to be set to the dB value. + For more details, please check the documentation of Presonus::IGainReductionInfo. */ + kEffGetGainReductionValueInDb = 'GRdB', + + /** Add slave effect. The ptrArg is a pointer to the slave AEffect, the 'opt' float transmits the mode (see enum SlaveMode). + For more details, please check the documentation of Presonus::ISlaveControllerHandler. */ + kEffAddSlave = 'AdSl', + + /** Remove slave effect. The ptrArg is a pointer to the slave AEffect. + For more details, please check the documentation of Presonus::ISlaveControllerHandler. */ + kEffRemoveSlave = 'RmSl' +}; + +} // namespace Presonus + +#endif // _pslvst2extensions_h diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/juce_audio_processors_ara.cpp juce-7.0.0~ds0/modules/juce_audio_processors/juce_audio_processors_ara.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/juce_audio_processors_ara.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/juce_audio_processors_ara.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,40 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include +#include + +/* Having WIN32_LEAN_AND_MEAN defined at the point of including ARADebug.c will produce warnings. + + To prevent such problems it's easiest to have it in its own translation unit. +*/ + +#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS) + +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments", "-Wmissing-prototypes") + #include +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/juce_audio_processors.cpp juce-7.0.0~ds0/modules/juce_audio_processors/juce_audio_processors.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/juce_audio_processors.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/juce_audio_processors.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -42,13 +42,6 @@ #include //============================================================================== -#if JUCE_MAC - #if JUCE_SUPPORT_CARBON && (JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_AU) - #include - #include - #endif -#endif - #if (JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_VST3) && (JUCE_LINUX || JUCE_BSD) #include #include @@ -56,7 +49,7 @@ #undef KeyPress #endif -#if ! JUCE_WINDOWS && ! JUCE_MAC && ! JUCE_LINUX && ! JUCE_BSD +#if ! JUCE_WINDOWS && ! JUCE_MAC && ! JUCE_LINUX #undef JUCE_PLUGINHOST_VST3 #define JUCE_PLUGINHOST_VST3 0 #endif @@ -65,11 +58,10 @@ #include #endif -//============================================================================== namespace juce { -#if JUCE_PLUGINHOST_VST || (JUCE_PLUGINHOST_LADSPA && (JUCE_LINUX || JUCE_BSD)) +#if JUCE_PLUGINHOST_VST || (JUCE_PLUGINHOST_LADSPA && JUCE_LINUX) static bool arrayContainsPlugin (const OwnedArray& list, const PluginDescription& desc) @@ -83,6 +75,26 @@ #endif +template +void callOnMessageThread (Callback&& callback) +{ + if (MessageManager::getInstance()->existsAndIsLockedByCurrentThread()) + { + callback(); + return; + } + + WaitableEvent completionEvent; + + MessageManager::callAsync ([&callback, &completionEvent] + { + callback(); + completionEvent.signal(); + }); + + completionEvent.wait(); +} + #if JUCE_MAC //============================================================================== @@ -142,21 +154,19 @@ } } - struct FlippedNSView : public ObjCClass + struct InnerNSView : public ObjCClass { - FlippedNSView() - : ObjCClass ("JuceFlippedNSView_") + InnerNSView() + : ObjCClass ("JuceInnerNSView_") { addIvar ("owner"); - addMethod (@selector (isFlipped), isFlipped); addMethod (@selector (isOpaque), isOpaque); addMethod (@selector (didAddSubview:), didAddSubview); registerClass(); } - static BOOL isFlipped (id, SEL) { return YES; } static BOOL isOpaque (id, SEL) { return YES; } static void nudge (id self) @@ -166,15 +176,12 @@ owner->triggerAsyncUpdate(); } - static void viewDidUnhide (id self, SEL) { nudge (self); } static void didAddSubview (id self, SEL, NSView*) { nudge (self); } - static void viewDidMoveToSuperview (id self, SEL) { nudge (self); } - static void viewDidMoveToWindow (id self, SEL) { nudge (self); } }; - static FlippedNSView& getViewClass() + static InnerNSView& getViewClass() { - static FlippedNSView result; + static InnerNSView result; return result; } }; @@ -183,6 +190,7 @@ } // namespace juce +#include "utilities/juce_FlagCache.h" #include "format/juce_AudioPluginFormat.cpp" #include "format/juce_AudioPluginFormatManager.cpp" #include "format_types/juce_LegacyAudioParameter.cpp" @@ -192,10 +200,12 @@ #include "processors/juce_AudioProcessorGraph.cpp" #include "processors/juce_GenericAudioProcessorEditor.cpp" #include "processors/juce_PluginDescription.cpp" +#include "format_types/juce_ARACommon.cpp" #include "format_types/juce_LADSPAPluginFormat.cpp" #include "format_types/juce_VSTPluginFormat.cpp" #include "format_types/juce_VST3PluginFormat.cpp" #include "format_types/juce_AudioUnitPluginFormat.mm" +#include "format_types/juce_ARAHosting.cpp" #include "scanning/juce_KnownPluginList.cpp" #include "scanning/juce_PluginDirectoryScanner.cpp" #include "scanning/juce_PluginListComponent.cpp" @@ -209,3 +219,12 @@ #include "utilities/juce_ParameterAttachments.cpp" #include "utilities/juce_AudioProcessorValueTreeState.cpp" #include "utilities/juce_PluginHostType.cpp" +#include "utilities/juce_NativeScaleFactorNotifier.cpp" +#include "utilities/ARA/juce_ARA_utils.cpp" + +#include "format_types/juce_LV2PluginFormat.cpp" + +#if JUCE_UNIT_TESTS + #include "format_types/juce_VST3PluginFormat_test.cpp" + #include "format_types/juce_LV2PluginFormat_test.cpp" +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/juce_audio_processors.h juce-7.0.0~ds0/modules/juce_audio_processors/juce_audio_processors.h --- juce-6.1.5~ds0/modules/juce_audio_processors/juce_audio_processors.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/juce_audio_processors.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_audio_processors vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE audio processor classes description: Classes for loading and playing VST, AU, LADSPA, or internally-generated audio processors. website: http://www.juce.com/juce @@ -94,6 +94,24 @@ #define JUCE_PLUGINHOST_LADSPA 0 #endif +/** Config: JUCE_PLUGINHOST_LV2 + Enables the LV2 plugin hosting classes. + */ +#ifndef JUCE_PLUGINHOST_LV2 + #define JUCE_PLUGINHOST_LV2 0 +#endif + +/** Config: JUCE_PLUGINHOST_ARA + Enables the ARA plugin extension hosting classes. You will need to download the ARA SDK and specify the + path to it either in the Projucer, using juce_set_ara_sdk_path() in your CMake project file. + + The directory can be obtained by recursively cloning https://github.com/Celemony/ARA_SDK and checking out + the tag releases/2.1.0. +*/ +#ifndef JUCE_PLUGINHOST_ARA + #define JUCE_PLUGINHOST_ARA 0 +#endif + /** Config: JUCE_CUSTOM_VST3_SDK If enabled, the embedded VST3 SDK in JUCE will not be added to the project and instead you should add the path to your custom VST3 SDK to the project's header search paths. Most users shouldn't @@ -107,10 +125,6 @@ // #error "You need to set either the JUCE_PLUGINHOST_AU and/or JUCE_PLUGINHOST_VST and/or JUCE_PLUGINHOST_VST3 and/or JUCE_PLUGINHOST_LADSPA flags if you're using this module!" #endif -#if ! (defined (JUCE_SUPPORT_CARBON) || JUCE_64BIT || JUCE_IOS) - #define JUCE_SUPPORT_CARBON 1 -#endif - #ifndef JUCE_SUPPORT_LEGACY_AUDIOPROCESSOR #define JUCE_SUPPORT_LEGACY_AUDIOPROCESSOR 1 #endif @@ -118,6 +132,8 @@ //============================================================================== #include "utilities/juce_VSTCallbackHandler.h" #include "utilities/juce_VST3ClientExtensions.h" +#include "utilities/juce_NativeScaleFactorNotifier.h" +#include "format_types/juce_ARACommon.h" #include "utilities/juce_ExtensionsVisitor.h" #include "processors/juce_AudioProcessorParameter.h" #include "processors/juce_HostedAudioProcessorParameter.h" @@ -135,9 +151,11 @@ #include "scanning/juce_KnownPluginList.h" #include "format_types/juce_AudioUnitPluginFormat.h" #include "format_types/juce_LADSPAPluginFormat.h" +#include "format_types/juce_LV2PluginFormat.h" +#include "format_types/juce_VST3PluginFormat.h" #include "format_types/juce_VSTMidiEventList.h" #include "format_types/juce_VSTPluginFormat.h" -#include "format_types/juce_VST3PluginFormat.h" +#include "format_types/juce_ARAHosting.h" #include "scanning/juce_PluginDirectoryScanner.h" #include "scanning/juce_PluginListComponent.h" #include "utilities/juce_AudioProcessorParameterWithID.h" @@ -149,3 +167,18 @@ #include "utilities/juce_ParameterAttachments.h" #include "utilities/juce_AudioProcessorValueTreeState.h" #include "utilities/juce_PluginHostType.h" +#include "utilities/ARA/juce_ARA_utils.h" + +//============================================================================== +// These declarations are here to avoid missing-prototype warnings in user code. + +// If you're implementing a plugin, you should supply a body for +// this function in your own code. +juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter(); + +// If you are implementing an ARA enabled plugin, you need to +// implement this function somewhere in the codebase by returning +// SubclassOfARADocumentControllerSpecialisation::createARAFactory(); +#if JucePlugin_Enable_ARA + const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory(); +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp juce-7.0.0~ds0/modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,35 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#if JUCE_PLUGINHOST_LV2 + #ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS + #endif + + #include + #include + + #include "format_types/juce_LV2SupportLibs.cpp" +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/juce_audio_processors.mm juce-7.0.0~ds0/modules/juce_audio_processors/juce_audio_processors.mm --- juce-6.1.5~ds0/modules/juce_audio_processors/juce_audio_processors.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/juce_audio_processors.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -211,18 +211,11 @@ bool AudioPluginInstance::deprecationAssertiontriggered = false; AudioPluginInstance::Parameter::Parameter() + : onStrings { TRANS ("on"), TRANS ("yes"), TRANS ("true") }, + offStrings { TRANS ("off"), TRANS ("no"), TRANS ("false") } { - onStrings.add (TRANS("on")); - onStrings.add (TRANS("yes")); - onStrings.add (TRANS("true")); - - offStrings.add (TRANS("off")); - offStrings.add (TRANS("no")); - offStrings.add (TRANS("false")); } -AudioPluginInstance::Parameter::~Parameter() = default; - String AudioPluginInstance::Parameter::getText (float value, int maximumStringLength) const { if (isBoolean()) diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -150,13 +150,12 @@ { public: Parameter(); - ~Parameter() override; String getText (float value, int maximumStringLength) const override; float getValueForText (const String& text) const override; private: - StringArray onStrings, offStrings; + const StringArray onStrings, offStrings; }; AudioPluginInstance() = default; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -427,10 +427,19 @@ l->audioProcessorChanged (this, details); } -void AudioProcessor::checkForUnsafeParamID (AudioProcessorParameter* param) +void AudioProcessor::validateParameter (AudioProcessorParameter* param) { checkForDuplicateParamID (param); checkForDuplicateTrimmedParamID (param); + + /* If you're building this plugin as an AudioUnit, and you intend to use the plugin in + Logic Pro or GarageBand, it's a good idea to set version hints on all of your parameters + so that you can add parameters safely in future versions of the plugin. + See the documentation for AudioProcessorParameter(int) for more information. + */ + #if JucePlugin_Build_AU + jassert (wrapperType == wrapperType_Undefined || param->getVersionHint() != 0); + #endif } void AudioProcessor::checkForDuplicateTrimmedParamID (AudioProcessorParameter* param) @@ -512,7 +521,7 @@ param->parameterIndex = flatParameterList.size(); flatParameterList.add (param); - checkForUnsafeParamID (param); + validateParameter (param); } void AudioProcessor::addParameterGroup (std::unique_ptr group) @@ -529,7 +538,7 @@ p->processor = this; p->parameterIndex = i; - checkForUnsafeParamID (p); + validateParameter (p); } parameterTree.addChild (std::move (group)); @@ -553,7 +562,7 @@ p->processor = this; p->parameterIndex = i; - checkForUnsafeParamID (p); + validateParameter (p); } } @@ -1239,10 +1248,10 @@ case AudioProcessor::wrapperType_VST3: return "VST3"; case AudioProcessor::wrapperType_AudioUnit: return "AU"; case AudioProcessor::wrapperType_AudioUnitv3: return "AUv3"; - case AudioProcessor::wrapperType_RTAS: return "RTAS"; case AudioProcessor::wrapperType_AAX: return "AAX"; case AudioProcessor::wrapperType_Standalone: return "Standalone"; case AudioProcessor::wrapperType_Unity: return "Unity"; + case AudioProcessor::wrapperType_LV2: return "LV2"; default: jassertfalse; return {}; } } @@ -1492,8 +1501,6 @@ void AudioProcessorListener::audioProcessorParameterChangeGestureEnd (AudioProcessor*, int) {} //============================================================================== -AudioProcessorParameter::AudioProcessorParameter() noexcept {} - AudioProcessorParameter::~AudioProcessorParameter() { #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -58,12 +58,12 @@ { /* ========================================================================== - In accordance with the terms of the JUCE 6 End-Use License Agreement, the + In accordance with the terms of the JUCE 7 End-Use License Agreement, the JUCE Code in SECTION A cannot be removed, changed or otherwise rendered ineffective unless you have a JUCE Indie or Pro license, or are using JUCE under the GPL v3 license. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence ========================================================================== */ diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -72,7 +72,18 @@ /** Returns an object which can be used to display a context menu for the parameter with the given index. */ - virtual std::unique_ptr getContextMenuForParameterIndex (const AudioProcessorParameter *) const = 0; + virtual std::unique_ptr getContextMenuForParameter (const AudioProcessorParameter *) const = 0; + + /** The naming of this function is misleading. Use getContextMenuForParameter() instead. + + Returns an object which can be used to display a context menu for the + parameter with the given index. + */ + [[deprecated ("The naming of this function has been fixed, use getContextMenuForParameter instead")]] + virtual std::unique_ptr getContextMenuForParameterIndex (const AudioProcessorParameter * p) const + { + return getContextMenuForParameter (p); + } }; } // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -37,8 +37,6 @@ template struct GraphRenderSequence { - GraphRenderSequence() {} - struct Context { FloatType** audioBuffers; @@ -64,6 +62,8 @@ midiChunk.clear(); midiChunk.addEvents (midiMessages, chunkStartSample, chunkSize, -chunkStartSample); + // Splitting up the buffer like this will cause the play head and host time to be + // invalid for all but the first chunk... perform (audioChunk, midiChunk, audioPlayHead); chunkStartSample += maxSamples; @@ -268,7 +268,18 @@ for (int i = 0; i < totalChans; ++i) audioChannels[i] = c.audioBuffers[audioChannelsToUse.getUnchecked (i)]; - AudioBuffer buffer (audioChannels, totalChans, c.numSamples); + auto numAudioChannels = [this] + { + if (const auto* proc = node->getProcessor()) + if (proc->getTotalNumInputChannels() == 0 && proc->getTotalNumOutputChannels() == 0) + return 0; + + return totalChans; + }(); + + AudioBuffer buffer (audioChannels, numAudioChannels, c.numSamples); + + const ScopedLock lock (processor.getCallbackLock()); if (processor.isSuspended()) buffer.clear(); diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -156,17 +156,24 @@ void unprepare(); template - void processBlock (AudioBuffer& audio, MidiBuffer& midi) + void callProcessFunction (AudioBuffer& audio, + MidiBuffer& midi, + void (AudioProcessor::* function) (AudioBuffer&, MidiBuffer&)) { const ScopedLock lock (processorLock); - processor->processBlock (audio, midi); + (processor.get()->*function) (audio, midi); + } + + template + void processBlock (AudioBuffer& audio, MidiBuffer& midi) + { + callProcessFunction (audio, midi, &AudioProcessor::processBlock); } template void processBlockBypassed (AudioBuffer& audio, MidiBuffer& midi) { - const ScopedLock lock (processorLock); - processor->processBlockBypassed (audio, midi); + callProcessFunction (audio, midi, &AudioProcessor::processBlockBypassed); } CriticalSection processorLock; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessor.h juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessor.h --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessor.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessor.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -31,7 +31,7 @@ Base class for audio processing classes or plugins. This is intended to act as a base class of audio processor that is general enough - to be wrapped as a VST, AU, RTAS, etc, or used internally. + to be wrapped as a VST, AU, AAX, etc, or used internally. It is also used by the plugin hosting code as the wrapper around an instance of a loaded plugin. @@ -78,6 +78,12 @@ doublePrecision }; + enum class Realtime + { + no, + yes + }; + using ChangeDetails = AudioProcessorListener::ChangeDetails; //============================================================================== @@ -500,12 +506,12 @@ /** Returns the audio bus with a given index and direction. If busIndex is invalid then this method will return a nullptr. */ - Bus* getBus (bool isInput, int busIndex) noexcept { return (isInput ? inputBuses : outputBuses)[busIndex]; } + Bus* getBus (bool isInput, int busIndex) noexcept { return getBusImpl (*this, isInput, busIndex); } /** Returns the audio bus with a given index and direction. If busIndex is invalid then this method will return a nullptr. */ - const Bus* getBus (bool isInput, int busIndex) const noexcept { return const_cast (this)->getBus (isInput, busIndex); } + const Bus* getBus (bool isInput, int busIndex) const noexcept { return getBusImpl (*this, isInput, busIndex); } //============================================================================== /** Callback to query if a bus can currently be added. @@ -904,7 +910,7 @@ processBlockBypassed but use the returned parameter to control the bypass state instead. - A plug-in can override this function to return a parameter which control's your + A plug-in can override this function to return a parameter which controls your plug-in's bypass. You should always check the value of this parameter in your processBlock callback and bypass any effects if it is non-zero. */ @@ -923,6 +929,21 @@ */ bool isNonRealtime() const noexcept { return nonRealtime; } + /** Returns no if the processor is being run in an offline mode for rendering. + + If the processor is being run live on realtime signals, this returns yes. + If the mode is unknown, this will assume it's realtime and return yes. + + This value may be unreliable until the prepareToPlay() method has been called, + and could change each time prepareToPlay() is called. + + @see setNonRealtime() + */ + Realtime isRealtime() const noexcept + { + return isNonRealtime() ? Realtime::no : Realtime::yes; + } + /** Called by the host to tell this processor whether it's being used in a non-realtime capacity for offline rendering or bouncing. */ @@ -1200,10 +1221,10 @@ wrapperType_VST3, wrapperType_AudioUnit, wrapperType_AudioUnitv3, - wrapperType_RTAS, wrapperType_AAX, wrapperType_Standalone, - wrapperType_Unity + wrapperType_Unity, + wrapperType_LV2 }; /** When loaded by a plugin wrapper, this flag will be set to indicate the type @@ -1340,8 +1361,8 @@ void addBus (bool isInput, const String& name, const AudioChannelSet& defaultLayout, bool isActivatedByDefault = true); - BusesProperties withInput (const String& name, const AudioChannelSet& defaultLayout, bool isActivatedByDefault = true) const; - BusesProperties withOutput (const String& name, const AudioChannelSet& defaultLayout, bool isActivatedByDefault = true) const; + JUCE_NODISCARD BusesProperties withInput (const String& name, const AudioChannelSet& defaultLayout, bool isActivatedByDefault = true) const; + JUCE_NODISCARD BusesProperties withOutput (const String& name, const AudioChannelSet& defaultLayout, bool isActivatedByDefault = true) const; }; /** Callback to query if adding/removing buses currently possible. @@ -1452,6 +1473,12 @@ return layouts; } + template + static auto getBusImpl (This& t, bool isInput, int busIndex) -> decltype (t.getBus (isInput, busIndex)) + { + return (isInput ? t.inputBuses : t.outputBuses)[busIndex]; + } + //============================================================================== static BusesProperties busesPropertiesFromLayoutArray (const Array&); @@ -1495,7 +1522,7 @@ #endif void checkForDuplicateTrimmedParamID (AudioProcessorParameter*); - void checkForUnsafeParamID (AudioProcessorParameter*); + void validateParameter (AudioProcessorParameter*); void checkForDuplicateParamID (AudioProcessorParameter*); void checkForDuplicateGroupIDs (const AudioProcessorParameterGroup&); diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -78,7 +78,7 @@ @see latencyChanged */ - ChangeDetails withLatencyChanged (bool b) const noexcept { return with (&ChangeDetails::latencyChanged, b); } + JUCE_NODISCARD ChangeDetails withLatencyChanged (bool b) const noexcept { return with (&ChangeDetails::latencyChanged, b); } /** Indicates that some attributes of the AudioProcessor's parameters have changed. @@ -88,7 +88,7 @@ @see parameterInfoChanged */ - ChangeDetails withParameterInfoChanged (bool b) const noexcept { return with (&ChangeDetails::parameterInfoChanged, b); } + JUCE_NODISCARD ChangeDetails withParameterInfoChanged (bool b) const noexcept { return with (&ChangeDetails::parameterInfoChanged, b); } /** Indicates that the loaded program has changed. @@ -97,7 +97,7 @@ @see programChanged */ - ChangeDetails withProgramChanged (bool b) const noexcept { return with (&ChangeDetails::programChanged, b); } + JUCE_NODISCARD ChangeDetails withProgramChanged (bool b) const noexcept { return with (&ChangeDetails::programChanged, b); } /** Indicates that the plugin state has changed (but not its parameters!). @@ -110,7 +110,7 @@ @see nonParameterStateChanged */ - ChangeDetails withNonParameterStateChanged (bool b) const noexcept { return with (&ChangeDetails::nonParameterStateChanged, b); } + JUCE_NODISCARD ChangeDetails withNonParameterStateChanged (bool b) const noexcept { return with (&ChangeDetails::nonParameterStateChanged, b); } /** Returns the default set of flags that will be used when AudioProcessor::updateHostDisplay() is called with no arguments. diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -39,7 +39,58 @@ class JUCE_API AudioProcessorParameter { public: - AudioProcessorParameter() noexcept; + AudioProcessorParameter() noexcept = default; + + /** The version hint supplied to this constructor is used in Audio Unit plugins to aid ordering + parameter identifiers when JUCE_FORCE_USE_LEGACY_PARAM_IDS is not enabled. + + When adding a parameter that is not present in a previous version of the Audio Unit, you + must ensure that the version hint supplied is a number higher than that of any parameter in + any previous plugin version. + + For example, in the first release of a plugin, every parameter was created with "1" as a + version hint. If you add some parameters in the second release of the plugin, all of the + new parameters should have "2" as a version hint. Additional parameters added in subsequent + plugin versions should have "3", "4", and so forth, increasing monotonically. + + Note that adding or removing parameters with a version hint that is lower than the maximum + version hint of all parameters will break saved automation in some hosts, so be careful! + + A version hint of "0" will be treated as though the version hint has not been set + explicitly. When targeting the AU format, the version hint may be checked at runtime in + debug builds to ensure that it has been set. + + Rationale: + + According to Apple's Documentation: + > An audio unit parameter is uniquely identified by the combination of its scope, element, and ID. + + However, Logic Pro and GarageBand have a known limitation that causes them to use parameter + indices instead of IDs to identify parameters. The effect of this is that adding parameters + to a later version of a plugin can break automation saved with an earlier version of the + plugin if the indices of existing parameters are changed. It is *always* unsafe to remove + parameters from an Audio Unit plugin that will be used in one of these hosts, because + removing a parameter will always modify the indices of following parameters. + + In order to work around this limitation, parameters in AUv2 plugins are sorted first by + their version hint, and then by the hash of their string identifier. As long as the + parameters from later versions of the plugin always have a version hint that is higher than + the parameters from earlier versions of the plugin, recall of automation data will work as + expected in Logic and GarageBand. + + Note that we can't just use the JUCE parameter index directly in order to preserve ordering. + This would require all new parameters to be added at the end of the parameter list, which + would make it impossible to add parameters to existing parameter groups. It would also make + it awkward to structure code sensibly, undoing all of the benefits of string-based parameter + identifiers. + + At time of writing, AUv3 plugins seem to be affected by the same issue, but there does not + appear to be any API to control parameter indices in this format. Therefore, when building + AUv3 plugins you must not add or remove parameters in subsequent plugin versions if you + wish to support Logic and GarageBand. + */ + explicit AudioProcessorParameter (int versionHint) + : version (versionHint) {} /** Destructor. */ virtual ~AudioProcessorParameter(); @@ -178,9 +229,9 @@ enum Category { - genericParameter = (0 << 16) | 0, /** If your parameter is not a meter then you should use this category */ + genericParameter = (0 << 16) | 0, /**< If your parameter is not a meter then you should use this category */ - inputGain = (1 << 16) | 0, /** Currently not used */ + inputGain = (1 << 16) | 0, /**< Currently not used */ outputGain = (1 << 16) | 1, /** The following categories tell the host that this parameter is a meter level value @@ -225,6 +276,10 @@ virtual StringArray getAllValueStrings() const; //============================================================================== + /** @see AudioProcessorParameter(int) */ + int getVersionHint() const { return version; } + + //============================================================================== /** A base class for listeners that want to know about changes to an AudioProcessorParameter. @@ -291,6 +346,7 @@ friend class LegacyAudioParameter; AudioProcessor* processor = nullptr; int parameterIndex = -1; + int version = 0; CriticalSection listenerLock; Array listeners; mutable StringArray valueStrings; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -97,13 +97,19 @@ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParameterListener) }; +class ParameterComponent : public Component, + public ParameterListener +{ +public: + using ParameterListener::ParameterListener; +}; + //============================================================================== -class BooleanParameterComponent final : public Component, - private ParameterListener +class BooleanParameterComponent : public ParameterComponent { public: BooleanParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param) - : ParameterListener (proc, param) + : ParameterComponent (proc, param) { // Set the initial value. handleNewParameterValue(); @@ -122,12 +128,12 @@ button.setBounds (area.reduced (0, 10)); } -private: void handleNewParameterValue() override { button.setToggleState (isParameterOn(), dontSendNotification); } +private: void buttonClicked() { if (isParameterOn() != button.getToggleState()) @@ -146,12 +152,11 @@ }; //============================================================================== -class SwitchParameterComponent final : public Component, - private ParameterListener +class SwitchParameterComponent : public ParameterComponent { public: SwitchParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param) - : ParameterListener (proc, param) + : ParameterComponent (proc, param) { for (auto& button : buttons) { @@ -186,7 +191,6 @@ button.setBounds (area.removeFromLeft (80)); } -private: void handleNewParameterValue() override { bool newState = isParameterOn(); @@ -198,6 +202,7 @@ } } +private: void rightButtonChanged() { auto buttonState = buttons[1].getToggleState(); @@ -249,12 +254,11 @@ }; //============================================================================== -class ChoiceParameterComponent final : public Component, - private ParameterListener +class ChoiceParameterComponent : public ParameterComponent { public: ChoiceParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param) - : ParameterListener (proc, param), + : ParameterComponent (proc, param), parameterValues (getParameter().getAllValueStrings()) { box.addItemList (parameterValues, 1); @@ -312,12 +316,11 @@ }; //============================================================================== -class SliderParameterComponent final : public Component, - private ParameterListener +class SliderParameterComponent : public ParameterComponent { public: SliderParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param) - : ParameterListener (proc, param) + : ParameterComponent (proc, param) { if (getParameter().getNumSteps() != AudioProcessor::getDefaultNumParameterSteps()) slider.setRange (0.0, 1.0, 1.0 / (getParameter().getNumSteps() - 1.0)); @@ -354,12 +357,6 @@ slider.setBounds (area); } -private: - void updateTextDisplay() - { - valueLabel.setText (getParameter().getCurrentValueAsText(), dontSendNotification); - } - void handleNewParameterValue() override { if (! isDragging) @@ -369,6 +366,12 @@ } } +private: + void updateTextDisplay() + { + valueLabel.setText (getParameter().getCurrentValueAsText(), dontSendNotification); + } + void sliderValueChanged() { auto newVal = (float) slider.getValue(); @@ -449,7 +452,7 @@ { if (e.mods.isRightButtonDown()) if (auto* context = editor.getHostContext()) - if (auto menu = context->getContextMenuForParameterIndex (¶meter)) + if (auto menu = context->getContextMenuForParameter (¶meter)) menu->getEquivalentPopupMenu().showMenuAsync (PopupMenu::Options().withTargetComponent (this) .withMousePosition()); } @@ -458,9 +461,9 @@ AudioProcessorEditor& editor; AudioProcessorParameter& parameter; Label parameterName, parameterLabel; - std::unique_ptr parameterComp; + std::unique_ptr parameterComp; - std::unique_ptr createParameterComp (AudioProcessor& processor) const + std::unique_ptr createParameterComp (AudioProcessor& processor) const { // The AU, AUv3 and VST (only via a .vstxml file) SDKs support // marking a parameter as boolean. If you want consistency across @@ -501,6 +504,9 @@ { parameterName .setText (parameter.getName (128), dontSendNotification); parameterLabel.setText (parameter.getLabel(), dontSendNotification); + + if (auto* p = parameterComp.get()) + p->handleNewParameterValue(); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParameterDisplayComponent) diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -34,6 +34,8 @@ */ struct HostedAudioProcessorParameter : public AudioProcessorParameter { + using AudioProcessorParameter::AudioProcessorParameter; + /** Returns an ID that is unique to this parameter. Parameter indices are unstable across plugin versions, which means that the diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_PluginDescription.cpp juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_PluginDescription.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_PluginDescription.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_PluginDescription.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -54,7 +54,8 @@ String PluginDescription::createIdentifierString() const { - return pluginFormatName + "-" + name + getPluginDescSuffix (*this, uniqueId); + const auto idToUse = uniqueId != 0 ? uniqueId : deprecatedUid; + return pluginFormatName + "-" + name + getPluginDescSuffix (*this, idToUse); } std::unique_ptr PluginDescription::createXml() const @@ -78,6 +79,7 @@ e->setAttribute ("numInputs", numInputChannels); e->setAttribute ("numOutputs", numOutputChannels); e->setAttribute ("isShell", hasSharedContainer); + e->setAttribute ("hasARAExtension", hasARAExtension); e->setAttribute ("uid", String::toHexString (deprecatedUid)); @@ -101,6 +103,7 @@ numInputChannels = xml.getIntAttribute ("numInputs"); numOutputChannels = xml.getIntAttribute ("numOutputs"); hasSharedContainer = xml.getBoolAttribute ("isShell", false); + hasARAExtension = xml.getBoolAttribute ("hasARAExtension", false); deprecatedUid = xml.getStringAttribute ("uid").getHexValue32(); uniqueId = xml.getStringAttribute ("uniqueId", "0").getHexValue32(); diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_PluginDescription.h juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_PluginDescription.h --- juce-6.1.5~ds0/modules/juce_audio_processors/processors/juce_PluginDescription.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/processors/juce_PluginDescription.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -129,6 +129,9 @@ /** True if the plug-in is part of a multi-type container, e.g. a VST Shell. */ bool hasSharedContainer = false; + /** True if the plug-in is ARA enabled and can supply a valid ARAFactoryWrapper. */ + bool hasARAExtension = false; + /** Returns true if the two descriptions refer to the same plug-in. This isn't quite as simple as them just having the same file (because of diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp juce-7.0.0~ds0/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/scanning/juce_KnownPluginList.h juce-7.0.0~ds0/modules/juce_audio_processors/scanning/juce_KnownPluginList.h --- juce-6.1.5~ds0/modules/juce_audio_processors/scanning/juce_KnownPluginList.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/scanning/juce_KnownPluginList.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp juce-7.0.0~ds0/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h juce-7.0.0~ds0/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h --- juce-6.1.5~ds0/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -126,7 +126,7 @@ File deadMansPedalFile; StringArray failedFiles; Atomic nextIndex; - float progress = 0; + std::atomic progress { 0.0f }; const bool allowAsync; void updateProgress(); diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp juce-7.0.0~ds0/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -451,7 +451,8 @@ String pluginBeingScanned; double progress = 0; const int numThreads; - bool allowAsync, finished = false, timerReentrancyCheck = false; + bool allowAsync, timerReentrancyCheck = false; + std::atomic finished { false }; std::unique_ptr pool; std::set initiallyBlacklistedFiles; @@ -582,6 +583,8 @@ if (timerReentrancyCheck) return; + progress = scanner->getProgress(); + if (pool == nullptr) { const ScopedValueSetter setter (timerReentrancyCheck, true); @@ -602,10 +605,7 @@ bool doNextScan() { if (scanner->scanNextFile (true, pluginBeingScanned)) - { - progress = scanner->getProgress(); return true; - } finished = true; return false; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/scanning/juce_PluginListComponent.h juce-7.0.0~ds0/modules/juce_audio_processors/scanning/juce_PluginListComponent.h --- juce-6.1.5~ds0/modules/juce_audio_processors/scanning/juce_PluginListComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/scanning/juce_PluginListComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,71 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +namespace juce +{ + +class ARADocumentController : public ARA::PlugIn::DocumentController +{ +public: + using ARA::PlugIn::DocumentController::DocumentController; + + template + Document_t* getDocument() const noexcept { return ARA::PlugIn::DocumentController::getDocument(); } + + //============================================================================== + /** @internal */ + virtual void internalNotifyAudioSourceAnalysisProgressStarted (ARAAudioSource* audioSource) = 0; + + /** @internal */ + virtual void internalNotifyAudioSourceAnalysisProgressUpdated (ARAAudioSource* audioSource, float progress) = 0; + + /** @internal */ + virtual void internalNotifyAudioSourceAnalysisProgressCompleted (ARAAudioSource* audioSource) = 0; + + /** @internal */ + virtual void internalDidUpdateAudioSourceAnalysisProgress (ARAAudioSource* audioSource, + ARAAudioSource::ARAAnalysisProgressState state, + float progress) = 0; + + //============================================================================== + /** @internal */ + virtual void internalNotifyAudioSourceContentChanged (ARAAudioSource* audioSource, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) = 0; + + /** @internal */ + virtual void internalNotifyAudioModificationContentChanged (ARAAudioModification* audioModification, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) = 0; + + /** @internal */ + virtual void internalNotifyPlaybackRegionContentChanged (ARAPlaybackRegion* playbackRegion, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) = 0; + + friend class ARAPlaybackRegionReader; +}; + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,971 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +namespace juce +{ + +class ARADocumentControllerSpecialisation::ARADocumentControllerImpl : public ARADocumentController, + private juce::Timer +{ +public: + ARADocumentControllerImpl (const ARA::PlugIn::PlugInEntry* entry, + const ARA::ARADocumentControllerHostInstance* instance, + ARADocumentControllerSpecialisation* spec) + : ARADocumentController (entry, instance), specialisation (spec) + { + } + + template + std::vector const& getPlaybackRenderers() const noexcept + { + return ARA::PlugIn::DocumentController::getPlaybackRenderers(); + } + + template + std::vector const& getEditorRenderers() const noexcept + { + return ARA::PlugIn::DocumentController::getEditorRenderers(); + } + + template + std::vector const& getEditorViews() const noexcept + { + return ARA::PlugIn::DocumentController::getEditorViews(); + } + + auto getSpecialisation() { return specialisation; } + +protected: + //============================================================================== + bool doRestoreObjectsFromStream (ARAInputStream& input, const ARARestoreObjectsFilter* filter) noexcept + { + return specialisation->doRestoreObjectsFromStream (input, filter); + } + + bool doStoreObjectsToStream (ARAOutputStream& output, const ARAStoreObjectsFilter* filter) noexcept + { + return specialisation->doStoreObjectsToStream (output, filter); + } + + //============================================================================== + // Model object creation + ARA::PlugIn::Document* doCreateDocument () noexcept override; + ARA::PlugIn::MusicalContext* doCreateMusicalContext (ARA::PlugIn::Document* document, ARA::ARAMusicalContextHostRef hostRef) noexcept override; + ARA::PlugIn::RegionSequence* doCreateRegionSequence (ARA::PlugIn::Document* document, ARA::ARARegionSequenceHostRef hostRef) noexcept override; + ARA::PlugIn::AudioSource* doCreateAudioSource (ARA::PlugIn::Document* document, ARA::ARAAudioSourceHostRef hostRef) noexcept override; + ARA::PlugIn::AudioModification* doCreateAudioModification (ARA::PlugIn::AudioSource* audioSource, ARA::ARAAudioModificationHostRef hostRef, const ARA::PlugIn::AudioModification* optionalModificationToClone) noexcept override; + ARA::PlugIn::PlaybackRegion* doCreatePlaybackRegion (ARA::PlugIn::AudioModification* modification, ARA::ARAPlaybackRegionHostRef hostRef) noexcept override; + + //============================================================================== + // Plugin role implementation + friend class ARAPlaybackRegionReader; + ARA::PlugIn::PlaybackRenderer* doCreatePlaybackRenderer() noexcept override; + ARA::PlugIn::EditorRenderer* doCreateEditorRenderer() noexcept override; + ARA::PlugIn::EditorView* doCreateEditorView() noexcept override; + + //============================================================================== + // ARAAudioSource content access + bool doIsAudioSourceContentAvailable (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) noexcept override; + ARA::ARAContentGrade doGetAudioSourceContentGrade (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) noexcept override; + ARA::PlugIn::ContentReader* doCreateAudioSourceContentReader (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept override; + + //============================================================================== + // ARAAudioModification content access + bool doIsAudioModificationContentAvailable (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type) noexcept override; + ARA::ARAContentGrade doGetAudioModificationContentGrade (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type) noexcept override; + ARA::PlugIn::ContentReader* doCreateAudioModificationContentReader (ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept override; + + //============================================================================== + // ARAPlaybackRegion content access + bool doIsPlaybackRegionContentAvailable (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type) noexcept override; + ARA::ARAContentGrade doGetPlaybackRegionContentGrade (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type) noexcept override; + ARA::PlugIn::ContentReader* doCreatePlaybackRegionContentReader (ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept override; + + //============================================================================== + // ARAAudioSource analysis + bool doIsAudioSourceContentAnalysisIncomplete (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) noexcept override; + void doRequestAudioSourceContentAnalysis (ARA::PlugIn::AudioSource* audioSource, + std::vector const& contentTypes) noexcept override; + + //============================================================================== + // Analysis Algorithm selection + ARA::ARAInt32 doGetProcessingAlgorithmsCount() noexcept override; + const ARA::ARAProcessingAlgorithmProperties* doGetProcessingAlgorithmProperties (ARA::ARAInt32 algorithmIndex) noexcept override; + ARA::ARAInt32 doGetProcessingAlgorithmForAudioSource (const ARA::PlugIn::AudioSource* audioSource) noexcept override; + void doRequestProcessingAlgorithmForAudioSource (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAInt32 algorithmIndex) noexcept override; + +#ifndef DOXYGEN + + //============================================================================== + bool doRestoreObjectsFromArchive (ARA::PlugIn::HostArchiveReader* archiveReader, const ARA::PlugIn::RestoreObjectsFilter* filter) noexcept override; + bool doStoreObjectsToArchive (ARA::PlugIn::HostArchiveWriter* archiveWriter, const ARA::PlugIn::StoreObjectsFilter* filter) noexcept override; + + //============================================================================== + // Document notifications + void willBeginEditing() noexcept override; + void didEndEditing() noexcept override; + void willNotifyModelUpdates() noexcept override; + void didNotifyModelUpdates() noexcept override; + void willUpdateDocumentProperties (ARA::PlugIn::Document* document, ARADocument::PropertiesPtr newProperties) noexcept override; + void didUpdateDocumentProperties (ARA::PlugIn::Document* document) noexcept override; + void didAddMusicalContextToDocument (ARA::PlugIn::Document* document, ARA::PlugIn::MusicalContext* musicalContext) noexcept override; + void willRemoveMusicalContextFromDocument (ARA::PlugIn::Document* document, ARA::PlugIn::MusicalContext* musicalContext) noexcept override; + void didReorderMusicalContextsInDocument (ARA::PlugIn::Document* document) noexcept override; + void didAddRegionSequenceToDocument (ARA::PlugIn::Document* document, ARA::PlugIn::RegionSequence* regionSequence) noexcept override; + void willRemoveRegionSequenceFromDocument (ARA::PlugIn::Document* document, ARA::PlugIn::RegionSequence* regionSequence) noexcept override; + void didReorderRegionSequencesInDocument (ARA::PlugIn::Document* document) noexcept override; + void didAddAudioSourceToDocument (ARA::PlugIn::Document* document, ARA::PlugIn::AudioSource* audioSource) noexcept override; + void willRemoveAudioSourceFromDocument (ARA::PlugIn::Document* document, ARA::PlugIn::AudioSource* audioSource) noexcept override; + void willDestroyDocument (ARA::PlugIn::Document* document) noexcept override; + + //============================================================================== + // MusicalContext notifications + void willUpdateMusicalContextProperties (ARA::PlugIn::MusicalContext* musicalContext, ARAMusicalContext::PropertiesPtr newProperties) noexcept override; + void didUpdateMusicalContextProperties (ARA::PlugIn::MusicalContext* musicalContext) noexcept override; + void doUpdateMusicalContextContent (ARA::PlugIn::MusicalContext* musicalContext, const ARA::ARAContentTimeRange* range, ARA::ContentUpdateScopes flags) noexcept override; + void didAddRegionSequenceToMusicalContext (ARA::PlugIn::MusicalContext* musicalContext, ARA::PlugIn::RegionSequence* regionSequence) noexcept override; + void willRemoveRegionSequenceFromMusicalContext (ARA::PlugIn::MusicalContext* musicalContext, ARA::PlugIn::RegionSequence* regionSequence) noexcept override; + void didReorderRegionSequencesInMusicalContext (ARA::PlugIn::MusicalContext* musicalContext) noexcept override; + void willDestroyMusicalContext (ARA::PlugIn::MusicalContext* musicalContext) noexcept override; + + //============================================================================== + // RegionSequence notifications, typically not overridden further + void willUpdateRegionSequenceProperties (ARA::PlugIn::RegionSequence* regionSequence, ARARegionSequence::PropertiesPtr newProperties) noexcept override; + void didUpdateRegionSequenceProperties (ARA::PlugIn::RegionSequence* regionSequence) noexcept override; + void didAddPlaybackRegionToRegionSequence (ARA::PlugIn::RegionSequence* regionSequence, ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; + void willRemovePlaybackRegionFromRegionSequence (ARA::PlugIn::RegionSequence* regionSequence, ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; + void willDestroyRegionSequence (ARA::PlugIn::RegionSequence* regionSequence) noexcept override; + + //============================================================================== + // AudioSource notifications + void willUpdateAudioSourceProperties (ARA::PlugIn::AudioSource* audioSource, ARAAudioSource::PropertiesPtr newProperties) noexcept override; + void didUpdateAudioSourceProperties (ARA::PlugIn::AudioSource* audioSource) noexcept override; + void doUpdateAudioSourceContent (ARA::PlugIn::AudioSource* audioSource, const ARA::ARAContentTimeRange* range, ARA::ContentUpdateScopes flags) noexcept override; + void willEnableAudioSourceSamplesAccess (ARA::PlugIn::AudioSource* audioSource, bool enable) noexcept override; + void didEnableAudioSourceSamplesAccess (ARA::PlugIn::AudioSource* audioSource, bool enable) noexcept override; + void didAddAudioModificationToAudioSource (ARA::PlugIn::AudioSource* audioSource, ARA::PlugIn::AudioModification* audioModification) noexcept override; + void willRemoveAudioModificationFromAudioSource (ARA::PlugIn::AudioSource* audioSource, ARA::PlugIn::AudioModification* audioModification) noexcept override; + void willDeactivateAudioSourceForUndoHistory (ARA::PlugIn::AudioSource* audioSource, bool deactivate) noexcept override; + void didDeactivateAudioSourceForUndoHistory (ARA::PlugIn::AudioSource* audioSource, bool deactivate) noexcept override; + void willDestroyAudioSource (ARA::PlugIn::AudioSource* audioSource) noexcept override; + + //============================================================================== + // AudioModification notifications + void willUpdateAudioModificationProperties (ARA::PlugIn::AudioModification* audioModification, ARAAudioModification::PropertiesPtr newProperties) noexcept override; + void didUpdateAudioModificationProperties (ARA::PlugIn::AudioModification* audioModification) noexcept override; + void didAddPlaybackRegionToAudioModification (ARA::PlugIn::AudioModification* audioModification, ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; + void willRemovePlaybackRegionFromAudioModification (ARA::PlugIn::AudioModification* audioModification, ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; + void willDeactivateAudioModificationForUndoHistory (ARA::PlugIn::AudioModification* audioModification, bool deactivate) noexcept override; + void didDeactivateAudioModificationForUndoHistory (ARA::PlugIn::AudioModification* audioModification, bool deactivate) noexcept override; + void willDestroyAudioModification (ARA::PlugIn::AudioModification* audioModification) noexcept override; + + //============================================================================== + // PlaybackRegion notifications + void willUpdatePlaybackRegionProperties (ARA::PlugIn::PlaybackRegion* playbackRegion, ARAPlaybackRegion::PropertiesPtr newProperties) noexcept override; + void didUpdatePlaybackRegionProperties (ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; + void willDestroyPlaybackRegion (ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; + + //============================================================================== + // juce::Timer overrides + void timerCallback() override; + +public: + //============================================================================== + /** @internal */ + void internalNotifyAudioSourceAnalysisProgressStarted (ARAAudioSource* audioSource) override; + + /** @internal */ + void internalNotifyAudioSourceAnalysisProgressUpdated (ARAAudioSource* audioSource, float progress) override; + + /** @internal */ + void internalNotifyAudioSourceAnalysisProgressCompleted (ARAAudioSource* audioSource) override; + + /** @internal */ + void internalDidUpdateAudioSourceAnalysisProgress (ARAAudioSource* audioSource, + ARAAudioSource::ARAAnalysisProgressState state, + float progress) override; + + //============================================================================== + /** @internal */ + void internalNotifyAudioSourceContentChanged (ARAAudioSource* audioSource, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) override; + + /** @internal */ + void internalNotifyAudioModificationContentChanged (ARAAudioModification* audioModification, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) override; + + /** @internal */ + void internalNotifyPlaybackRegionContentChanged (ARAPlaybackRegion* playbackRegion, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) override; + +#endif + +private: + //============================================================================== + ARADocumentControllerSpecialisation* specialisation; + std::atomic internalAnalysisProgressIsSynced { true }; + ScopedJuceInitialiser_GUI libraryInitialiser; + int activeAudioSourcesCount = 0; + + //============================================================================== + template + void notifyListeners (Function ModelObject::Listener::* function, ModelObject* modelObject, Ts... ts) + { + (specialisation->*function) (modelObject, ts...); + modelObject->notifyListeners ([&] (auto& l) + { + try + { + (l.*function) (modelObject, ts...); + } + catch (...) + { + } + }); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARADocumentControllerImpl) +}; + +ARA::PlugIn::DocumentController* ARADocumentControllerSpecialisation::getDocumentController() noexcept +{ + return documentController.get(); +} + +//============================================================================== +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalNotifyAudioSourceAnalysisProgressStarted (ARAAudioSource* audioSource) +{ + if (audioSource->internalAnalysisProgressTracker.updateProgress (ARA::kARAAnalysisProgressStarted, 0.0f)) + internalAnalysisProgressIsSynced.store (false, std::memory_order_release); + + DocumentController::notifyAudioSourceAnalysisProgressStarted (audioSource); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalNotifyAudioSourceAnalysisProgressUpdated (ARAAudioSource* audioSource, + float progress) +{ + if (audioSource->internalAnalysisProgressTracker.updateProgress (ARA::kARAAnalysisProgressUpdated, progress)) + internalAnalysisProgressIsSynced.store (false, std::memory_order_release); + + DocumentController::notifyAudioSourceAnalysisProgressUpdated (audioSource, progress); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalNotifyAudioSourceAnalysisProgressCompleted (ARAAudioSource* audioSource) +{ + if (audioSource->internalAnalysisProgressTracker.updateProgress (ARA::kARAAnalysisProgressCompleted, 1.0f)) + internalAnalysisProgressIsSynced.store (false, std::memory_order_release); + + DocumentController::notifyAudioSourceAnalysisProgressCompleted (audioSource); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalDidUpdateAudioSourceAnalysisProgress (ARAAudioSource* audioSource, + ARAAudioSource::ARAAnalysisProgressState state, + float progress) +{ + specialisation->didUpdateAudioSourceAnalysisProgress (audioSource, state, progress); +} + +//============================================================================== +ARADocumentControllerSpecialisation* ARADocumentControllerSpecialisation::getSpecialisedDocumentControllerImpl (ARA::PlugIn::DocumentController* dc) +{ + return static_cast (dc)->getSpecialisation(); +} + +ARADocument* ARADocumentControllerSpecialisation::getDocumentImpl() +{ + return documentController->getDocument(); +} + +//============================================================================== +// some helper macros to ease repeated declaration & implementation of notification functions below: +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments") + +// no notification arguments +#define OVERRIDE_TO_NOTIFY_1(function, ModelObjectType, modelObject) \ + void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::function (ARA::PlugIn::ModelObjectType* modelObject) noexcept \ + { \ + notifyListeners (&ARA##ModelObjectType::Listener::function, static_cast (modelObject)); \ + } + +// single notification argument, model object version +#define OVERRIDE_TO_NOTIFY_2(function, ModelObjectType, modelObject, ArgumentType, argument) \ + void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::function (ARA::PlugIn::ModelObjectType* modelObject, ARA::PlugIn::ArgumentType argument) noexcept \ + { \ + notifyListeners (&ARA##ModelObjectType::Listener::function, static_cast (modelObject), static_cast (argument)); \ + } + +// single notification argument, non-model object version +#define OVERRIDE_TO_NOTIFY_3(function, ModelObjectType, modelObject, ArgumentType, argument) \ + void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::function (ARA::PlugIn::ModelObjectType* modelObject, ArgumentType argument) noexcept \ + { \ + notifyListeners (&ARA##ModelObjectType::Listener::function, static_cast (modelObject), argument); \ + } + +//============================================================================== +ARA::PlugIn::Document* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateDocument() noexcept +{ + auto* document = specialisation->doCreateDocument(); + + // Your Document subclass must inherit from juce::ARADocument + jassert (dynamic_cast (document)); + + return document; +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::willBeginEditing() noexcept +{ + notifyListeners (&ARADocument::Listener::willBeginEditing, static_cast (getDocument())); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::didEndEditing() noexcept +{ + notifyListeners (&ARADocument::Listener::didEndEditing, static_cast (getDocument())); + + if (isTimerRunning() && (activeAudioSourcesCount == 0)) + stopTimer(); + else if (! isTimerRunning() && (activeAudioSourcesCount > 0)) + startTimerHz (20); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::willNotifyModelUpdates() noexcept +{ + notifyListeners (&ARADocument::Listener::willNotifyModelUpdates, static_cast (getDocument())); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::didNotifyModelUpdates() noexcept +{ + notifyListeners (&ARADocument::Listener::didNotifyModelUpdates, static_cast (getDocument())); +} + +//============================================================================== +bool ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doRestoreObjectsFromArchive (ARA::PlugIn::HostArchiveReader* archiveReader, + const ARA::PlugIn::RestoreObjectsFilter* filter) noexcept +{ + ARAInputStream reader (archiveReader); + return doRestoreObjectsFromStream (reader, filter); +} + +bool ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doStoreObjectsToArchive (ARA::PlugIn::HostArchiveWriter* archiveWriter, + const ARA::PlugIn::StoreObjectsFilter* filter) noexcept +{ + ARAOutputStream writer (archiveWriter); + return doStoreObjectsToStream (writer, filter); +} + +//============================================================================== +OVERRIDE_TO_NOTIFY_3 (willUpdateDocumentProperties, Document, document, ARADocument::PropertiesPtr, newProperties) +OVERRIDE_TO_NOTIFY_1 (didUpdateDocumentProperties, Document, document) +OVERRIDE_TO_NOTIFY_2 (didAddMusicalContextToDocument, Document, document, MusicalContext*, musicalContext) +OVERRIDE_TO_NOTIFY_2 (willRemoveMusicalContextFromDocument, Document, document, MusicalContext*, musicalContext) +OVERRIDE_TO_NOTIFY_1 (didReorderMusicalContextsInDocument, Document, document) +OVERRIDE_TO_NOTIFY_2 (didAddRegionSequenceToDocument, Document, document, RegionSequence*, regionSequence) +OVERRIDE_TO_NOTIFY_2 (willRemoveRegionSequenceFromDocument, Document, document, RegionSequence*, regionSequence) +OVERRIDE_TO_NOTIFY_1 (didReorderRegionSequencesInDocument, Document, document) +OVERRIDE_TO_NOTIFY_2 (didAddAudioSourceToDocument, Document, document, AudioSource*, audioSource) +OVERRIDE_TO_NOTIFY_2 (willRemoveAudioSourceFromDocument, Document, document, AudioSource*, audioSource) +OVERRIDE_TO_NOTIFY_1 (willDestroyDocument, Document, document) + +//============================================================================== +ARA::PlugIn::MusicalContext* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateMusicalContext (ARA::PlugIn::Document* document, + ARA::ARAMusicalContextHostRef hostRef) noexcept +{ + return specialisation->doCreateMusicalContext (static_cast (document), hostRef); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doUpdateMusicalContextContent (ARA::PlugIn::MusicalContext* musicalContext, + const ARA::ARAContentTimeRange*, + ARA::ContentUpdateScopes flags) noexcept +{ + notifyListeners (&ARAMusicalContext::Listener::doUpdateMusicalContextContent, + static_cast (musicalContext), + flags); +} + +OVERRIDE_TO_NOTIFY_3 (willUpdateMusicalContextProperties, MusicalContext, musicalContext, ARAMusicalContext::PropertiesPtr, newProperties) +OVERRIDE_TO_NOTIFY_1 (didUpdateMusicalContextProperties, MusicalContext, musicalContext) +OVERRIDE_TO_NOTIFY_2 (didAddRegionSequenceToMusicalContext, MusicalContext, musicalContext, RegionSequence*, regionSequence) +OVERRIDE_TO_NOTIFY_2 (willRemoveRegionSequenceFromMusicalContext, MusicalContext, musicalContext, RegionSequence*, regionSequence) +OVERRIDE_TO_NOTIFY_1 (didReorderRegionSequencesInMusicalContext, MusicalContext, musicalContext) +OVERRIDE_TO_NOTIFY_1 (willDestroyMusicalContext, MusicalContext, musicalContext) + +//============================================================================== +ARA::PlugIn::RegionSequence* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateRegionSequence (ARA::PlugIn::Document* document, ARA::ARARegionSequenceHostRef hostRef) noexcept +{ + return specialisation->doCreateRegionSequence (static_cast (document), hostRef); +} + +OVERRIDE_TO_NOTIFY_3 (willUpdateRegionSequenceProperties, RegionSequence, regionSequence, ARARegionSequence::PropertiesPtr, newProperties) +OVERRIDE_TO_NOTIFY_1 (didUpdateRegionSequenceProperties, RegionSequence, regionSequence) +OVERRIDE_TO_NOTIFY_2 (didAddPlaybackRegionToRegionSequence, RegionSequence, regionSequence, PlaybackRegion*, playbackRegion) +OVERRIDE_TO_NOTIFY_2 (willRemovePlaybackRegionFromRegionSequence, RegionSequence, regionSequence, PlaybackRegion*, playbackRegion) +OVERRIDE_TO_NOTIFY_1 (willDestroyRegionSequence, RegionSequence, regionSequence) + +//============================================================================== +ARA::PlugIn::AudioSource* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateAudioSource (ARA::PlugIn::Document* document, ARA::ARAAudioSourceHostRef hostRef) noexcept +{ + ++activeAudioSourcesCount; + return specialisation->doCreateAudioSource (static_cast (document), hostRef); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doUpdateAudioSourceContent (ARA::PlugIn::AudioSource* audioSource, + const ARA::ARAContentTimeRange*, + ARA::ContentUpdateScopes flags) noexcept +{ + notifyListeners (&ARAAudioSource::Listener::doUpdateAudioSourceContent, static_cast (audioSource), flags); +} + +OVERRIDE_TO_NOTIFY_3 (willUpdateAudioSourceProperties, AudioSource, audioSource, ARAAudioSource::PropertiesPtr, newProperties) +OVERRIDE_TO_NOTIFY_1 (didUpdateAudioSourceProperties, AudioSource, audioSource) +OVERRIDE_TO_NOTIFY_3 (willEnableAudioSourceSamplesAccess, AudioSource, audioSource, bool, enable) +OVERRIDE_TO_NOTIFY_3 (didEnableAudioSourceSamplesAccess, AudioSource, audioSource, bool, enable) +OVERRIDE_TO_NOTIFY_2 (didAddAudioModificationToAudioSource, AudioSource, audioSource, AudioModification*, audioModification) +OVERRIDE_TO_NOTIFY_2 (willRemoveAudioModificationFromAudioSource, AudioSource, audioSource, AudioModification*, audioModification) +OVERRIDE_TO_NOTIFY_3 (willDeactivateAudioSourceForUndoHistory, AudioSource, audioSource, bool, deactivate) + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::didDeactivateAudioSourceForUndoHistory (ARA::PlugIn::AudioSource* audioSource, + bool deactivate) noexcept +{ + activeAudioSourcesCount += (deactivate ? -1 : 1); + notifyListeners (&ARAAudioSource::Listener::didDeactivateAudioSourceForUndoHistory, + static_cast (audioSource), + deactivate); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::willDestroyAudioSource (ARA::PlugIn::AudioSource* audioSource) noexcept +{ + if (! audioSource->isDeactivatedForUndoHistory()) + --activeAudioSourcesCount; + + notifyListeners (&ARAAudioSource::Listener::willDestroyAudioSource, static_cast (audioSource)); +} +//============================================================================== +ARA::PlugIn::AudioModification* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateAudioModification (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAAudioModificationHostRef hostRef, + const ARA::PlugIn::AudioModification* optionalModificationToClone) noexcept +{ + return specialisation->doCreateAudioModification (static_cast (audioSource), + hostRef, + static_cast (optionalModificationToClone)); +} + +OVERRIDE_TO_NOTIFY_3 (willUpdateAudioModificationProperties, AudioModification, audioModification, ARAAudioModification::PropertiesPtr, newProperties) +OVERRIDE_TO_NOTIFY_1 (didUpdateAudioModificationProperties, AudioModification, audioModification) +OVERRIDE_TO_NOTIFY_2 (didAddPlaybackRegionToAudioModification, AudioModification, audioModification, PlaybackRegion*, playbackRegion) +OVERRIDE_TO_NOTIFY_2 (willRemovePlaybackRegionFromAudioModification, AudioModification, audioModification, PlaybackRegion*, playbackRegion) +OVERRIDE_TO_NOTIFY_3 (willDeactivateAudioModificationForUndoHistory, AudioModification, audioModification, bool, deactivate) +OVERRIDE_TO_NOTIFY_3 (didDeactivateAudioModificationForUndoHistory, AudioModification, audioModification, bool, deactivate) +OVERRIDE_TO_NOTIFY_1 (willDestroyAudioModification, AudioModification, audioModification) + +//============================================================================== +ARA::PlugIn::PlaybackRegion* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreatePlaybackRegion (ARA::PlugIn::AudioModification* modification, + ARA::ARAPlaybackRegionHostRef hostRef) noexcept +{ + return specialisation->doCreatePlaybackRegion (static_cast (modification), hostRef); +} + +OVERRIDE_TO_NOTIFY_3 (willUpdatePlaybackRegionProperties, PlaybackRegion, playbackRegion, ARAPlaybackRegion::PropertiesPtr, newProperties) +OVERRIDE_TO_NOTIFY_1 (didUpdatePlaybackRegionProperties, PlaybackRegion, playbackRegion) +OVERRIDE_TO_NOTIFY_1 (willDestroyPlaybackRegion, PlaybackRegion, playbackRegion) + +//============================================================================== +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalNotifyAudioSourceContentChanged (ARAAudioSource* audioSource, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) +{ + if (notifyARAHost) + DocumentController::notifyAudioSourceContentChanged (audioSource, scopeFlags); + + notifyListeners (&ARAAudioSource::Listener::doUpdateAudioSourceContent, audioSource, scopeFlags); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalNotifyAudioModificationContentChanged (ARAAudioModification* audioModification, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) +{ + if (notifyARAHost) + DocumentController::notifyAudioModificationContentChanged (audioModification, scopeFlags); + + notifyListeners (&ARAAudioModification::Listener::didUpdateAudioModificationContent, audioModification, scopeFlags); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalNotifyPlaybackRegionContentChanged (ARAPlaybackRegion* playbackRegion, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) +{ + if (notifyARAHost) + DocumentController::notifyPlaybackRegionContentChanged (playbackRegion, scopeFlags); + + notifyListeners (&ARAPlaybackRegion::Listener::didUpdatePlaybackRegionContent, playbackRegion, scopeFlags); +} + +//============================================================================== +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +#undef OVERRIDE_TO_NOTIFY_1 +#undef OVERRIDE_TO_NOTIFY_2 +#undef OVERRIDE_TO_NOTIFY_3 + +//============================================================================== +ARADocument* ARADocumentControllerSpecialisation::doCreateDocument() +{ + return new ARADocument (static_cast (getDocumentController())); +} + +ARAMusicalContext* ARADocumentControllerSpecialisation::doCreateMusicalContext (ARADocument* document, + ARA::ARAMusicalContextHostRef hostRef) +{ + return new ARAMusicalContext (static_cast (document), hostRef); +} + +ARARegionSequence* ARADocumentControllerSpecialisation::doCreateRegionSequence (ARADocument* document, + ARA::ARARegionSequenceHostRef hostRef) +{ + return new ARARegionSequence (static_cast (document), hostRef); +} + +ARAAudioSource* ARADocumentControllerSpecialisation::doCreateAudioSource (ARADocument* document, + ARA::ARAAudioSourceHostRef hostRef) +{ + return new ARAAudioSource (static_cast (document), hostRef); +} + +ARAAudioModification* ARADocumentControllerSpecialisation::doCreateAudioModification ( + ARAAudioSource* audioSource, + ARA::ARAAudioModificationHostRef hostRef, + const ARAAudioModification* optionalModificationToClone) +{ + return new ARAAudioModification (static_cast (audioSource), + hostRef, + static_cast (optionalModificationToClone)); +} + +ARAPlaybackRegion* + ARADocumentControllerSpecialisation::doCreatePlaybackRegion (ARAAudioModification* modification, + ARA::ARAPlaybackRegionHostRef hostRef) +{ + return new ARAPlaybackRegion (static_cast (modification), hostRef); +} + +//============================================================================== +ARA::PlugIn::PlaybackRenderer* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreatePlaybackRenderer() noexcept +{ + return specialisation->doCreatePlaybackRenderer(); +} + +ARA::PlugIn::EditorRenderer* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateEditorRenderer() noexcept +{ + return specialisation->doCreateEditorRenderer(); +} + +ARA::PlugIn::EditorView* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateEditorView() noexcept +{ + return specialisation->doCreateEditorView(); +} + +bool ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doIsAudioSourceContentAvailable (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) noexcept +{ + return specialisation->doIsAudioSourceContentAvailable (audioSource, type); +} + +ARA::ARAContentGrade ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doGetAudioSourceContentGrade (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) noexcept +{ + return specialisation->doGetAudioSourceContentGrade (audioSource, type); +} + +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateAudioSourceContentReader (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept +{ + return specialisation->doCreateAudioSourceContentReader (audioSource, type, range); +} + +bool ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doIsAudioModificationContentAvailable (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type) noexcept +{ + return specialisation->doIsAudioModificationContentAvailable (audioModification, type); +} + +ARA::ARAContentGrade ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doGetAudioModificationContentGrade (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type) noexcept +{ + return specialisation->doGetAudioModificationContentGrade (audioModification, type); +} + +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateAudioModificationContentReader (ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept +{ + return specialisation->doCreateAudioModificationContentReader (audioModification, type, range); +} + +bool ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doIsPlaybackRegionContentAvailable (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type) noexcept +{ + return specialisation->doIsPlaybackRegionContentAvailable (playbackRegion, type); +} + +ARA::ARAContentGrade + ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doGetPlaybackRegionContentGrade (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type) noexcept +{ + return specialisation->doGetPlaybackRegionContentGrade (playbackRegion, type); +} + +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreatePlaybackRegionContentReader (ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept +{ + return specialisation->doCreatePlaybackRegionContentReader (playbackRegion, type, range); +} + +bool ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doIsAudioSourceContentAnalysisIncomplete (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) noexcept +{ + return specialisation->doIsAudioSourceContentAnalysisIncomplete (audioSource, type); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doRequestAudioSourceContentAnalysis (ARA::PlugIn::AudioSource* audioSource, + std::vector const& contentTypes) noexcept +{ + specialisation->doRequestAudioSourceContentAnalysis (audioSource, contentTypes); +} + +ARA::ARAInt32 ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doGetProcessingAlgorithmsCount() noexcept +{ + return specialisation->doGetProcessingAlgorithmsCount(); +} + +const ARA::ARAProcessingAlgorithmProperties* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doGetProcessingAlgorithmProperties (ARA::ARAInt32 algorithmIndex) noexcept +{ + return specialisation->doGetProcessingAlgorithmProperties (algorithmIndex); +} + +ARA::ARAInt32 ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doGetProcessingAlgorithmForAudioSource (const ARA::PlugIn::AudioSource* audioSource) noexcept +{ + return specialisation->doGetProcessingAlgorithmForAudioSource (audioSource); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doRequestProcessingAlgorithmForAudioSource (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAInt32 algorithmIndex) noexcept +{ + return specialisation->doRequestProcessingAlgorithmForAudioSource (audioSource, algorithmIndex); +} + +//============================================================================== +// Helper code for ARADocumentControllerSpecialisation::ARADocumentControllerImpl::timerCallback() to +// rewire the host-related ARA SDK's progress tracker to our internal update mechanism. +namespace ModelUpdateControllerProgressAdapter +{ + using namespace ARA; + + static void ARA_CALL notifyAudioSourceAnalysisProgress (ARAModelUpdateControllerHostRef /*controllerHostRef*/, + ARAAudioSourceHostRef audioSourceHostRef, ARAAnalysisProgressState state, float value) noexcept + { + auto audioSource = reinterpret_cast (audioSourceHostRef); + audioSource->getDocumentController()->internalDidUpdateAudioSourceAnalysisProgress (audioSource, state, value); + audioSource->notifyListeners ([&] (ARAAudioSource::Listener& l) { l.didUpdateAudioSourceAnalysisProgress (audioSource, state, value); }); + } + + static void ARA_CALL notifyAudioSourceContentChanged (ARAModelUpdateControllerHostRef, ARAAudioSourceHostRef, + const ARAContentTimeRange*, ARAContentUpdateFlags) noexcept + { + jassertfalse; // not to be called - this adapter only forwards analysis progress + } + + static void ARA_CALL notifyAudioModificationContentChanged (ARAModelUpdateControllerHostRef, ARAAudioModificationHostRef, + const ARAContentTimeRange*, ARAContentUpdateFlags) noexcept + { + jassertfalse; // not to be called - this adapter only forwards analysis progress + } + + static void ARA_CALL notifyPlaybackRegionContentChanged (ARAModelUpdateControllerHostRef, ARAPlaybackRegionHostRef, + const ARAContentTimeRange*, ARAContentUpdateFlags) noexcept + { + jassertfalse; // not to be called - this adapter only forwards analysis progress + } + + static ARA::PlugIn::HostModelUpdateController* get() + { + static const auto modelUpdateControllerInterface = makeARASizedStruct (&ARA::ARAModelUpdateControllerInterface::notifyPlaybackRegionContentChanged, + ModelUpdateControllerProgressAdapter::notifyAudioSourceAnalysisProgress, + ModelUpdateControllerProgressAdapter::notifyAudioSourceContentChanged, + ModelUpdateControllerProgressAdapter::notifyAudioModificationContentChanged, + ModelUpdateControllerProgressAdapter::notifyPlaybackRegionContentChanged); + + static const auto instance = makeARASizedStruct (&ARA::ARADocumentControllerHostInstance::playbackControllerInterface, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + &modelUpdateControllerInterface, + nullptr, + nullptr); + + static auto progressAdapter = ARA::PlugIn::HostModelUpdateController { &instance }; + return &progressAdapter; + } +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::timerCallback() +{ + if (! internalAnalysisProgressIsSynced.exchange (true, std::memory_order_release)) + for (auto& audioSource : getDocument()->getAudioSources()) + audioSource->internalAnalysisProgressTracker.notifyProgress (ModelUpdateControllerProgressAdapter::get(), + reinterpret_cast (audioSource)); +} + +//============================================================================== +ARAInputStream::ARAInputStream (ARA::PlugIn::HostArchiveReader* reader) + : archiveReader (reader), + size ((int64) reader->getArchiveSize()) +{} + +int ARAInputStream::read (void* destBuffer, int maxBytesToRead) +{ + const auto bytesToRead = std::min ((int64) maxBytesToRead, size - position); + + if (bytesToRead > 0 && ! archiveReader->readBytesFromArchive ((ARA::ARASize) position, (ARA::ARASize) bytesToRead, + static_cast (destBuffer))) + { + failure = true; + return 0; + } + + position += bytesToRead; + return (int) bytesToRead; +} + +bool ARAInputStream::setPosition (int64 newPosition) +{ + position = jlimit ((int64) 0, size, newPosition); + return true; +} + +bool ARAInputStream::isExhausted() +{ + return position >= size; +} + +ARAOutputStream::ARAOutputStream (ARA::PlugIn::HostArchiveWriter* writer) + : archiveWriter (writer) +{} + +bool ARAOutputStream::write (const void* dataToWrite, size_t numberOfBytes) +{ + if (! archiveWriter->writeBytesToArchive ((ARA::ARASize) position, numberOfBytes, (const ARA::ARAByte*) dataToWrite)) + return false; + + position += numberOfBytes; + return true; +} + +bool ARAOutputStream::setPosition (int64 newPosition) +{ + position = newPosition; + return true; +} + +//============================================================================== +ARADocumentControllerSpecialisation::ARADocumentControllerSpecialisation ( + const ARA::PlugIn::PlugInEntry* entry, + const ARA::ARADocumentControllerHostInstance* instance) + : documentController (std::make_unique (entry, instance, this)) +{ +} + +ARADocumentControllerSpecialisation::~ARADocumentControllerSpecialisation() = default; + +ARAPlaybackRenderer* ARADocumentControllerSpecialisation::doCreatePlaybackRenderer() +{ + return new ARAPlaybackRenderer (getDocumentController()); +} + +ARAEditorRenderer* ARADocumentControllerSpecialisation::doCreateEditorRenderer() +{ + return new ARAEditorRenderer (getDocumentController()); +} + +ARAEditorView* ARADocumentControllerSpecialisation::doCreateEditorView() +{ + return new ARAEditorView (getDocumentController()); +} + +bool ARADocumentControllerSpecialisation::doIsAudioSourceContentAvailable (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) +{ + juce::ignoreUnused (audioSource, type); + return false; +} + +ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetAudioSourceContentGrade (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) +{ + // Overriding doIsAudioSourceContentAvailable() requires overriding + // doGetAudioSourceContentGrade() accordingly! + jassertfalse; + + juce::ignoreUnused (audioSource, type); + return ARA::kARAContentGradeInitial; +} + +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreateAudioSourceContentReader (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) +{ + // Overriding doIsAudioSourceContentAvailable() requires overriding + // doCreateAudioSourceContentReader() accordingly! + jassertfalse; + + juce::ignoreUnused (audioSource, type, range); + return nullptr; +} + +bool ARADocumentControllerSpecialisation::doIsAudioModificationContentAvailable (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type) +{ + juce::ignoreUnused (audioModification, type); + return false; +} + +ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetAudioModificationContentGrade (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type) +{ + // Overriding doIsAudioModificationContentAvailable() requires overriding + // doGetAudioModificationContentGrade() accordingly! + jassertfalse; + + juce::ignoreUnused (audioModification, type); + return ARA::kARAContentGradeInitial; +} + +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreateAudioModificationContentReader (ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) +{ + // Overriding doIsAudioModificationContentAvailable() requires overriding + // doCreateAudioModificationContentReader() accordingly! + jassertfalse; + + juce::ignoreUnused (audioModification, type, range); + return nullptr; +} + +bool ARADocumentControllerSpecialisation::doIsPlaybackRegionContentAvailable (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type) +{ + juce::ignoreUnused (playbackRegion, type); + return false; +} + +ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetPlaybackRegionContentGrade (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type) +{ + // Overriding doIsPlaybackRegionContentAvailable() requires overriding + // doGetPlaybackRegionContentGrade() accordingly! + jassertfalse; + + juce::ignoreUnused (playbackRegion, type); + return ARA::kARAContentGradeInitial; +} + +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreatePlaybackRegionContentReader (ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) +{ + // Overriding doIsPlaybackRegionContentAvailable() requires overriding + // doCreatePlaybackRegionContentReader() accordingly! + jassertfalse; + + juce::ignoreUnused (playbackRegion, type, range); + return nullptr; +} + +bool ARADocumentControllerSpecialisation::doIsAudioSourceContentAnalysisIncomplete (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) +{ + juce::ignoreUnused (audioSource, type); + return false; +} + +void ARADocumentControllerSpecialisation::doRequestAudioSourceContentAnalysis (ARA::PlugIn::AudioSource* audioSource, + std::vector const& contentTypes) +{ + juce::ignoreUnused (audioSource, contentTypes); +} + +ARA::ARAInt32 ARADocumentControllerSpecialisation::doGetProcessingAlgorithmsCount() { return 0; } + +const ARA::ARAProcessingAlgorithmProperties* + ARADocumentControllerSpecialisation::doGetProcessingAlgorithmProperties (ARA::ARAInt32 algorithmIndex) +{ + juce::ignoreUnused (algorithmIndex); + return nullptr; +} + +ARA::ARAInt32 ARADocumentControllerSpecialisation::doGetProcessingAlgorithmForAudioSource (const ARA::PlugIn::AudioSource* audioSource) +{ + // doGetProcessingAlgorithmForAudioSource() must be implemented if the supported + // algorithm count is greater than zero. + if (getDocumentController()->getProcessingAlgorithmsCount() > 0) + jassertfalse; + + juce::ignoreUnused (audioSource); + return 0; +} + +void ARADocumentControllerSpecialisation::doRequestProcessingAlgorithmForAudioSource (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAInt32 algorithmIndex) +{ + // doRequestProcessingAlgorithmForAudioSource() must be implemented if the supported + // algorithm count is greater than zero. + if (getDocumentController()->getProcessingAlgorithmsCount() > 0) + jassertfalse; + + juce::ignoreUnused (audioSource, algorithmIndex); +} + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,520 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#pragma once + +namespace juce +{ + +class ARAPlaybackRenderer; +class ARAEditorRenderer; +class ARAEditorView; +class ARAInputStream; +class ARAOutputStream; + +/** This class contains the customisation points for the JUCE provided ARA document controller + implementation. + + Every ARA enabled plugin must provide its own document controller implementation. To do this, + inherit from this class, and override its protected methods as needed. Then you need to + implement a global function somewhere in your module called createARAFactory(). This function + must return an ARAFactory* that will instantiate document controller objects using your + specialisation. There are helper functions inside ARADocumentControllerSpecialisation, so the + implementation of createARAFactory() can always be a simple one-liner. For example + + @code + class MyDocumentController : public ARADocumentControllerSpecialisation + { + //... + }; + + const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory() + { + return juce::ARADocumentControllerSpecialisation::createARAFactory(); + } + @endcode + + Most member functions have a default implementation so you can build up your required feature + set gradually. The protected functions of this class fall in three distinct groups: + - interactive editing and playback, + - analysis features provided by the plugin and utilised by the host, and + - maintaining the ARA model graph. + + On top of the pure virtual functions, you will probably want to override + doCreatePlaybackRenderer() at the very least if you want your plugin to play any sound. This + function belongs to the first group. + + If your plugin has analysis capabilities and wants to allow the host to access these, functions + in the second group should be overridden. + + The default implementation of the ARA model object classes - i.e. ARADocument, ARAMusicalContext, + ARARegionSequence, ARAAudioSource, ARAAudioModification, ARAPlaybackRegion - should be sufficient + for maintaining a representation of the ARA model graph, hence overriding the model object + creation functions e.g. doCreateMusicalContext() is considered an advanced use case. Hence you + should be able to get a lot done without overriding functions in the third group. + + In order to react to the various ARA state changes you can override any of the ARA model object + Listener functions that ARADocumentControllerSpecialisation inherits from. Such listener + functions can be attached to one particular model objects instance, but the listener functions + inside ARADocumentControllerSpecialisation will respond to the events of all instances of the + model objects. + + @tags{ARA} +*/ +class ARADocumentControllerSpecialisation : public ARADocument::Listener, + public ARAMusicalContext::Listener, + public ARARegionSequence::Listener, + public ARAAudioSource::Listener, + public ARAAudioModification::Listener, + public ARAPlaybackRegion::Listener +{ +public: + //============================================================================== + /** Constructor. Used internally by the ARAFactory implementation. + */ + ARADocumentControllerSpecialisation (const ARA::PlugIn::PlugInEntry* entry, + const ARA::ARADocumentControllerHostInstance* instance); + + /** Destructor. */ + virtual ~ARADocumentControllerSpecialisation(); + + /** Returns the underlying DocumentController object that references this specialisation. + */ + ARA::PlugIn::DocumentController* getDocumentController() noexcept; + + /** Helper function for implementing the global createARAFactory() function. + + For example + + @code + class MyDocumentController : public ARADocumentControllerSpecialisation + { + //... + }; + + const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory() + { + return juce::ARADocumentControllerSpecialisation::createARAFactory(); + } + @endcode + */ + template + static const ARA::ARAFactory* createARAFactory() + { + static_assert (std::is_base_of::value, + "DocumentController specialization types must inherit from ARADocumentControllerSpecialisation"); + return ARA::PlugIn::PlugInEntry::getPlugInEntry>()->getFactory(); + } + + /** Returns a pointer to the ARADocumentControllerSpecialisation instance that is referenced + by the provided DocumentController. You can use this function to access your specialisation + from anywhere where you have access to ARA::PlugIn::DocumentController*. + */ + template + static Specialisation* getSpecialisedDocumentController (ARA::PlugIn::DocumentController* dc) + { + return static_cast (getSpecialisedDocumentControllerImpl (dc)); + } + + /** Returns a pointer to the ARA document root maintained by this document controller. */ + template + DocumentType* getDocument() + { + return static_cast (getDocumentImpl()); + } + +protected: + //============================================================================== + /** Read an ARADocument archive from a juce::InputStream. + + @param input Data stream containing previously persisted data to be used when restoring the ARADocument + @param filter A filter to be applied to the stream + + Return true if the operation is successful. + + @see ARADocumentControllerInterface::restoreObjectsFromArchive + */ + virtual bool doRestoreObjectsFromStream (ARAInputStream& input, const ARARestoreObjectsFilter* filter) = 0; + + /** Write an ARADocument archive to a juce::OutputStream. + + @param output Data stream that should be used to write the persistent ARADocument data + @param filter A filter to be applied to the stream + + Returns true if the operation is successful. + + @see ARADocumentControllerInterface::storeObjectsToArchive + */ + virtual bool doStoreObjectsToStream (ARAOutputStream& output, const ARAStoreObjectsFilter* filter) = 0; + + //============================================================================== + /** Override to return a custom subclass instance of ARAPlaybackRenderer. */ + virtual ARAPlaybackRenderer* doCreatePlaybackRenderer(); + + /** Override to return a custom subclass instance of ARAEditorRenderer. */ + virtual ARAEditorRenderer* doCreateEditorRenderer(); + + /** Override to return a custom subclass instance of ARAEditorView. */ + virtual ARAEditorView* doCreateEditorView(); + + //============================================================================== + // ARAAudioSource content access + + /** Override to implement isAudioSourceContentAvailable() for all your supported content types - + the default implementation always returns false, preventing any calls to doGetAudioSourceContentGrade() + and doCreateAudioSourceContentReader(). + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doIsAudioSourceContentAvailable. + */ + virtual bool doIsAudioSourceContentAvailable (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type); + + /** Override to implement getAudioSourceContentGrade() for all your supported content types. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doGetAudioSourceContentGrade. + */ + virtual ARA::ARAContentGrade doGetAudioSourceContentGrade (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type); + + /** Override to implement createAudioSourceContentReader() for all your supported content types, + returning a custom subclass instance of ContentReader providing data of the requested type. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doCreateAudioSourceContentReader. + */ + virtual ARA::PlugIn::ContentReader* doCreateAudioSourceContentReader (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range); + + //============================================================================== + // ARAAudioModification content access + + /** Override to implement isAudioModificationContentAvailable() for all your supported content types - + the default implementation always returns false. + For read-only data directly inherited from the underlying audio source you can just delegate the + call to the audio source, but user-editable modification data must be specifically handled here. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doIsAudioModificationContentAvailable. + */ + virtual bool doIsAudioModificationContentAvailable (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type); + + /** Override to implement getAudioModificationContentGrade() for all your supported content types. + For read-only data directly inherited from the underlying audio source you can just delegate the + call to the audio source, but user-editable modification data must be specifically handled here. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doGetAudioModificationContentGrade. + */ + virtual ARA::ARAContentGrade doGetAudioModificationContentGrade (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type); + + /** Override to implement createAudioModificationContentReader() for all your supported content types, + returning a custom subclass instance of ContentReader providing data of the requested \p type. + For read-only data directly inherited from the underlying audio source you can just delegate the + call to the audio source, but user-editable modification data must be specifically handled here. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doCreateAudioModificationContentReader. + */ + virtual ARA::PlugIn::ContentReader* doCreateAudioModificationContentReader (ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range); + + //============================================================================== + // ARAPlaybackRegion content access + + /** Override to implement isPlaybackRegionContentAvailable() for all your supported content types - + the default implementation always returns false. + Typically, this call can directly delegate to the underlying audio modification, since most + plug-ins will apply their modification data to the playback region with a transformation that + does not affect content availability. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doIsPlaybackRegionContentAvailable. + */ + virtual bool doIsPlaybackRegionContentAvailable (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type); + + /** Override to implement getPlaybackRegionContentGrade() for all your supported content types. + Typically, this call can directly delegate to the underlying audio modification, since most + plug-ins will apply their modification data to the playback region with a transformation that + does not affect content grade. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doGetPlaybackRegionContentGrade. + */ + virtual ARA::ARAContentGrade doGetPlaybackRegionContentGrade (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type); + + /** Override to implement createPlaybackRegionContentReader() for all your supported content types, + returning a custom subclass instance of ContentReader providing data of the requested type. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doCreatePlaybackRegionContentReader. + */ + virtual ARA::PlugIn::ContentReader* doCreatePlaybackRegionContentReader (ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range); + + //============================================================================== + // ARAAudioSource analysis + + /** Override to implement isAudioSourceContentAnalysisIncomplete(). + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doIsAudioSourceContentAnalysisIncomplete. + */ + virtual bool doIsAudioSourceContentAnalysisIncomplete (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type); + + /** Override to implement requestAudioSourceContentAnalysis(). + + This function's called from + ARA::PlugIn::DocumentControllerDelegate::doRequestAudioSourceContentAnalysis. + */ + virtual void doRequestAudioSourceContentAnalysis (ARA::PlugIn::AudioSource* audioSource, + std::vector const& contentTypes); + + //============================================================================== + // Analysis Algorithm selection + + /** Override to implement getProcessingAlgorithmsCount(). + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doGetProcessingAlgorithmsCount. + */ + virtual ARA::ARAInt32 doGetProcessingAlgorithmsCount (); + + /** Override to implement getProcessingAlgorithmProperties(). + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doGetProcessingAlgorithmProperties. + */ + virtual const ARA::ARAProcessingAlgorithmProperties* + doGetProcessingAlgorithmProperties (ARA::ARAInt32 algorithmIndex); + + /** Override to implement getProcessingAlgorithmForAudioSource(). + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doGetProcessingAlgorithmForAudioSource. + */ + virtual ARA::ARAInt32 doGetProcessingAlgorithmForAudioSource (const ARA::PlugIn::AudioSource* audioSource); + + /** Override to implement requestProcessingAlgorithmForAudioSource(). + + This function's called from + ARA::PlugIn::DocumentControllerDelegate::doRequestProcessingAlgorithmForAudioSource. + */ + virtual void doRequestProcessingAlgorithmForAudioSource (ARA::PlugIn::AudioSource* audioSource, ARA::ARAInt32 algorithmIndex); + + //============================================================================== + /** Override to return a custom subclass instance of ARADocument. */ + ARADocument* doCreateDocument(); + + /** Override to return a custom subclass instance of ARAMusicalContext. */ + ARAMusicalContext* doCreateMusicalContext (ARADocument* document, + ARA::ARAMusicalContextHostRef hostRef); + + /** Override to return a custom subclass instance of ARARegionSequence. */ + ARARegionSequence* doCreateRegionSequence (ARADocument* document, + ARA::ARARegionSequenceHostRef hostRef); + + /** Override to return a custom subclass instance of ARAAudioSource. */ + ARAAudioSource* doCreateAudioSource (ARADocument* document, + ARA::ARAAudioSourceHostRef hostRef); + + /** Override to return a custom subclass instance of ARAAudioModification. */ + ARAAudioModification* doCreateAudioModification (ARAAudioSource* audioSource, + ARA::ARAAudioModificationHostRef hostRef, + const ARAAudioModification* optionalModificationToClone); + + /** Override to return a custom subclass instance of ARAPlaybackRegion. */ + ARAPlaybackRegion* doCreatePlaybackRegion (ARAAudioModification* modification, + ARA::ARAPlaybackRegionHostRef hostRef); + +private: + //============================================================================== + template + class FactoryConfig : public ARA::PlugIn::FactoryConfig + { + public: + FactoryConfig() noexcept + { + const juce::String compatibleDocumentArchiveIDString = JucePlugin_ARACompatibleArchiveIDs; + + if (compatibleDocumentArchiveIDString.isNotEmpty()) + { + compatibleDocumentArchiveIDStrings = juce::StringArray::fromLines (compatibleDocumentArchiveIDString); + for (const auto& compatibleID : compatibleDocumentArchiveIDStrings) + compatibleDocumentArchiveIDs.push_back (compatibleID.toRawUTF8()); + } + + // Update analyzeable content types + static constexpr std::array contentTypes { + ARA::kARAContentTypeNotes, + ARA::kARAContentTypeTempoEntries, + ARA::kARAContentTypeBarSignatures, + ARA::kARAContentTypeStaticTuning, + ARA::kARAContentTypeKeySignatures, + ARA::kARAContentTypeSheetChords + }; + + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6313) + + for (size_t i = 0; i < contentTypes.size(); ++i) + if (JucePlugin_ARAContentTypes & (1 << i)) + analyzeableContentTypes.push_back (contentTypes[i]); + + JUCE_END_IGNORE_WARNINGS_MSVC + + // Update playback transformation flags + static constexpr std::array playbackTransformationFlags { + ARA::kARAPlaybackTransformationTimestretch, + ARA::kARAPlaybackTransformationTimestretchReflectingTempo, + ARA::kARAPlaybackTransformationContentBasedFadeAtTail, + ARA::kARAPlaybackTransformationContentBasedFadeAtHead + }; + + supportedPlaybackTransformationFlags = 0; + + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6313) + + for (size_t i = 0; i < playbackTransformationFlags.size(); ++i) + if (JucePlugin_ARATransformationFlags & (1 << i)) + supportedPlaybackTransformationFlags |= playbackTransformationFlags[i]; + + JUCE_END_IGNORE_WARNINGS_MSVC + } + + const char* getFactoryID() const noexcept override { return JucePlugin_ARAFactoryID; } + const char* getPlugInName() const noexcept override { return JucePlugin_Name; } + const char* getManufacturerName() const noexcept override { return JucePlugin_Manufacturer; } + const char* getInformationURL() const noexcept override { return JucePlugin_ManufacturerWebsite; } + const char* getVersion() const noexcept override { return JucePlugin_VersionString; } + const char* getDocumentArchiveID() const noexcept override { return JucePlugin_ARADocumentArchiveID; } + + ARA::ARASize getCompatibleDocumentArchiveIDsCount() const noexcept override + { + return compatibleDocumentArchiveIDs.size(); + } + + const ARA::ARAPersistentID* getCompatibleDocumentArchiveIDs() const noexcept override + { + return compatibleDocumentArchiveIDs.empty() ? nullptr : compatibleDocumentArchiveIDs.data(); + } + + ARA::ARASize getAnalyzeableContentTypesCount() const noexcept override + { + return analyzeableContentTypes.size(); + } + + const ARA::ARAContentType* getAnalyzeableContentTypes() const noexcept override + { + return analyzeableContentTypes.empty() ? nullptr : analyzeableContentTypes.data(); + } + + ARA::ARAPlaybackTransformationFlags getSupportedPlaybackTransformationFlags() const noexcept override + { + return supportedPlaybackTransformationFlags; + } + + ARA::PlugIn::DocumentController* createDocumentController (const ARA::PlugIn::PlugInEntry* entry, + const ARA::ARADocumentControllerHostInstance* instance) const noexcept override + { + auto* spec = new SpecialisationType (entry, instance); + return spec->getDocumentController(); + } + + void destroyDocumentController (ARA::PlugIn::DocumentController* controller) const noexcept override + { + delete getSpecialisedDocumentController (controller); + } + + private: + juce::StringArray compatibleDocumentArchiveIDStrings; + std::vector compatibleDocumentArchiveIDs; + std::vector analyzeableContentTypes; + ARA::ARAPlaybackTransformationFlags supportedPlaybackTransformationFlags; + }; + + //============================================================================== + static ARADocumentControllerSpecialisation* getSpecialisedDocumentControllerImpl (ARA::PlugIn::DocumentController*); + + ARADocument* getDocumentImpl(); + + //============================================================================== + class ARADocumentControllerImpl; + std::unique_ptr documentController; +}; + +/** Used to read persisted ARA archives - see doRestoreObjectsFromStream() for details. + + @tags{ARA} +*/ +class ARAInputStream : public InputStream +{ +public: + explicit ARAInputStream (ARA::PlugIn::HostArchiveReader*); + + int64 getPosition() override { return position; } + int64 getTotalLength() override { return size; } + + int read (void*, int) override; + bool setPosition (int64) override; + bool isExhausted() override; + + bool failed() const { return failure; } + +private: + ARA::PlugIn::HostArchiveReader* archiveReader; + int64 position = 0; + int64 size; + bool failure = false; +}; + +/** Used to write persistent ARA archives - see doStoreObjectsToStream() for details. + + @tags{ARA} +*/ +class ARAOutputStream : public OutputStream +{ +public: + explicit ARAOutputStream (ARA::PlugIn::HostArchiveWriter*); + + int64 getPosition() override { return position; } + void flush() override {} + + bool write (const void*, size_t) override; + bool setPosition (int64) override; + +private: + ARA::PlugIn::HostArchiveWriter* archiveWriter; + int64 position = 0; +}; +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,199 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +namespace juce +{ + +//============================================================================== +size_t ARADocument::getNumChildren() const noexcept +{ + return getMusicalContexts().size() + getRegionSequences().size() + getAudioSources().size(); +} + +ARAObject* ARADocument::getChild (size_t index) +{ + auto& musicalContexts = getMusicalContexts(); + + if (index < musicalContexts.size()) + return musicalContexts[index]; + + const auto numMusicalContexts = musicalContexts.size(); + auto& regionSequences = getRegionSequences(); + + if (index < numMusicalContexts + regionSequences.size()) + return regionSequences[index - numMusicalContexts]; + + const auto numMusicalContextsAndRegionSequences = numMusicalContexts + regionSequences.size(); + auto& audioSources = getAudioSources(); + + if (index < numMusicalContextsAndRegionSequences + audioSources.size()) + return getAudioSources()[index - numMusicalContextsAndRegionSequences]; + + return nullptr; +} + +//============================================================================== +size_t ARARegionSequence::getNumChildren() const noexcept +{ + return 0; +} + +ARAObject* ARARegionSequence::getChild (size_t) +{ + return nullptr; +} + +Range ARARegionSequence::getTimeRange (ARAPlaybackRegion::IncludeHeadAndTail includeHeadAndTail) const +{ + if (getPlaybackRegions().empty()) + return {}; + + auto startTime = std::numeric_limits::max(); + auto endTime = std::numeric_limits::lowest(); + for (const auto& playbackRegion : getPlaybackRegions()) + { + const auto regionTimeRange = playbackRegion->getTimeRange (includeHeadAndTail); + startTime = jmin (startTime, regionTimeRange.getStart()); + endTime = jmax (endTime, regionTimeRange.getEnd()); + } + return { startTime, endTime }; +} + +double ARARegionSequence::getCommonSampleRate() const +{ + const auto getSampleRate = [] (auto* playbackRegion) + { + return playbackRegion->getAudioModification()->getAudioSource()->getSampleRate(); + }; + + const auto range = getPlaybackRegions(); + const auto sampleRate = range.size() > 0 ? getSampleRate (range.front()) : 0.0; + + if (std::any_of (range.begin(), range.end(), [&] (auto& x) { return getSampleRate (x) != sampleRate; })) + return 0.0; + + return sampleRate; +} + +//============================================================================== +size_t ARAAudioSource::getNumChildren() const noexcept +{ + return getAudioModifications().size(); +} + +ARAObject* ARAAudioSource::getChild (size_t index) +{ + return getAudioModifications()[index]; +} + +void ARAAudioSource::notifyAnalysisProgressStarted() +{ + getDocumentController()->internalNotifyAudioSourceAnalysisProgressStarted (this); +} + +void ARAAudioSource::notifyAnalysisProgressUpdated (float progress) +{ + getDocumentController()->internalNotifyAudioSourceAnalysisProgressUpdated (this, progress); +} + +void ARAAudioSource::notifyAnalysisProgressCompleted() +{ + getDocumentController()->internalNotifyAudioSourceAnalysisProgressCompleted (this); +} + +void ARAAudioSource::notifyContentChanged (ARAContentUpdateScopes scopeFlags, bool notifyARAHost) +{ + getDocumentController()->internalNotifyAudioSourceContentChanged (this, + scopeFlags, + notifyARAHost); +} + +//============================================================================== +size_t ARAAudioModification::getNumChildren() const noexcept +{ + return getPlaybackRegions().size(); +} + +ARAObject* ARAAudioModification::getChild (size_t index) +{ + return getPlaybackRegions()[index]; +} + +void ARAAudioModification::notifyContentChanged (ARAContentUpdateScopes scopeFlags, bool notifyARAHost) +{ + getDocumentController()->internalNotifyAudioModificationContentChanged (this, + scopeFlags, + notifyARAHost); +} + +//============================================================================== +ARAObject* ARAPlaybackRegion::getParent() { return getAudioModification(); } + +Range ARAPlaybackRegion::getTimeRange (IncludeHeadAndTail includeHeadAndTail) const +{ + auto startTime = getStartInPlaybackTime(); + auto endTime = getEndInPlaybackTime(); + + if (includeHeadAndTail == IncludeHeadAndTail::yes) + { + ARA::ARATimeDuration headTime {}, tailTime {}; + getDocumentController()->getPlaybackRegionHeadAndTailTime (toRef (this), &headTime, &tailTime); + startTime -= headTime; + endTime += tailTime; + } + + return { startTime, endTime }; +} + +Range ARAPlaybackRegion::getSampleRange (double sampleRate, IncludeHeadAndTail includeHeadAndTail) const +{ + const auto timeRange = getTimeRange (includeHeadAndTail); + + return { ARA::samplePositionAtTime (timeRange.getStart(), sampleRate), + ARA::samplePositionAtTime (timeRange.getEnd(), sampleRate) }; +} + +double ARAPlaybackRegion::getHeadTime() const +{ + ARA::ARATimeDuration headTime {}, tailTime {}; + getDocumentController()->getPlaybackRegionHeadAndTailTime (toRef (this), &headTime, &tailTime); + return headTime; +} + +double ARAPlaybackRegion::getTailTime() const +{ + ARA::ARATimeDuration headTime {}, tailTime {}; + getDocumentController()->getPlaybackRegionHeadAndTailTime (toRef (this), &headTime, &tailTime); + return tailTime; +} + +void ARAPlaybackRegion::notifyContentChanged (ARAContentUpdateScopes scopeFlags, bool notifyARAHost) +{ + getDocumentController()->internalNotifyPlaybackRegionContentChanged (this, + scopeFlags, + notifyARAHost); +} + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1145 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#pragma once + +namespace juce +{ + +class ARADocumentController; +class ARADocument; +class ARAMusicalContext; +class ARARegionSequence; +class ARAAudioSource; +class ARAAudioModification; +class ARAPlaybackRegion; + +/** Base class used by the JUCE ARA model objects to provide listenable interfaces. + + @tags{ARA} +*/ +template +class JUCE_API ARAListenableModelClass +{ +public: + /** Constructor. */ + ARAListenableModelClass() = default; + + /** Destructor. */ + virtual ~ARAListenableModelClass() = default; + + /** Subscribe \p l to notified by changes to the object. + @param l The listener instance. + */ + void addListener (ListenerType* l) { listeners.add (l); } + + /** Unsubscribe \p l from object notifications. + @param l The listener instance. + */ + void removeListener (ListenerType* l) { listeners.remove (l); } + + /** Call the provided callback for each of the added listeners. */ + template + void notifyListeners (Callback&& callback) + { + listeners.call (callback); + } + +private: + ListenerList listeners; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAListenableModelClass) +}; + +/** Create a derived implementation of this class and pass it to ARAObject::visit() to retrieve the + concrete type of a model object. + + Combined with ARAObject::traverse() on the ARADocument object it is possible to discover the + entire model graph. + + Note that the references passed to the visit member functions are only guaranteed to live for + the duration of the function call, so don't store pointers to these objects! + + @tags{Audio} +*/ +class ARAObjectVisitor +{ +public: + /** Destructor. */ + virtual ~ARAObjectVisitor() = default; + + /** Called when visiting an ARADocument object. */ + virtual void visitDocument (juce::ARADocument&) {} + + /** Called when visiting an ARAMusicalContext object. */ + virtual void visitMusicalContext (juce::ARAMusicalContext&) {} + + /** Called when visiting an ARARegionSequence object. */ + virtual void visitRegionSequence (juce::ARARegionSequence&) {} + + /** Called when visiting an ARAPlaybackRegion object. */ + virtual void visitPlaybackRegion (juce::ARAPlaybackRegion&) {} + + /** Called when visiting an ARAAudioModification object. */ + virtual void visitAudioModification (juce::ARAAudioModification&) {} + + /** Called when visiting an ARAAudioSource object. */ + virtual void visitAudioSource (juce::ARAAudioSource&) {} +}; + +/** Common base class for all JUCE ARA model objects to aid with the discovery and traversal of the + entire ARA model graph. + + @tags{ARA} +*/ +class ARAObject +{ +public: + /** Destructor. */ + virtual ~ARAObject() = default; + + /** Returns the number of ARA model objects aggregated by this object. Objects that are merely + referred to, but not aggregated by the current object are not included in this count, e.g. + a referenced RegionSequence does not count as a child of the referring PlaybackRegion. + + See the ARA documentation's ARA Model Graph Overview for more details. + */ + virtual size_t getNumChildren() const noexcept = 0; + + /** Returns the child object associated with the given index. + + The index should be smaller than the value returned by getNumChildren(). + + Note that the index of a particular object may change when the ARA model graph is edited. + */ + virtual ARAObject* getChild (size_t index) = 0; + + /** Returns the ARA model object that aggregates this object. + + Returns nullptr for the ARADocument root object. + */ + virtual ARAObject* getParent() = 0; + + /** Implements a depth first traversal of the ARA model graph starting from the current object, + and visiting its children recursively. + + The provided function should accept a single ARAObject& parameter. + */ + template + void traverse (Fn&& fn) + { + fn (*this); + + for (size_t i = 0; i < getNumChildren(); ++i) + { + getChild (i)->traverse (fn); + } + } + + /** Allows the retrieval of the concrete type of a model object. + + To use this, create a new class derived from ARAObjectVisitor and override its functions + depending on which concrete types you are interested in. + + Calling this function inside the function passed to ARAObject::traverse() allows you to + map the entire ARA model graph. + */ + virtual void visit (ARAObjectVisitor& visitor) = 0; +}; + +/** A base class for listeners that want to know about changes to an ARADocument object. + + Use ARADocument::addListener() to register your listener with an ARADocument. + + @tags{ARA} +*/ +class JUCE_API ARADocumentListener +{ +public: + /** Destructor */ + virtual ~ARADocumentListener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called before the document enters an editing state. + @param document The document about to enter an editing state. + */ + virtual void willBeginEditing (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called after the document exits an editing state. + @param document The document about exit an editing state. + */ + virtual void didEndEditing (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called before sending model updates do the host. + @param document The document whose model updates are about to be sent. + */ + virtual void willNotifyModelUpdates (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called after sending model updates do the host. + @param document The document whose model updates have just been sent. + */ + virtual void didNotifyModelUpdates (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called before the document's properties are updated. + @param document The document whose properties will be updated. + @param newProperties The document properties that will be assigned to \p document. + */ + virtual void willUpdateDocumentProperties (ARADocument* document, + ARA::PlugIn::PropertiesPtr newProperties) + { + ignoreUnused (document, newProperties); + } + + /** Called after the document's properties are updated. + @param document The document whose properties were updated. + */ + virtual void didUpdateDocumentProperties (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called after a musical context is added to the document. + @param document The document that \p musicalContext was added to. + @param musicalContext The musical context that was added to \p document. + */ + virtual void didAddMusicalContextToDocument (ARADocument* document, ARAMusicalContext* musicalContext) + { + ignoreUnused (document, musicalContext); + } + + /** Called before a musical context is removed from the document. + @param document The document that \p musicalContext will be removed from. + @param musicalContext The musical context that will be removed from \p document. + */ + virtual void willRemoveMusicalContextFromDocument (ARADocument* document, + ARAMusicalContext* musicalContext) + { + ignoreUnused (document, musicalContext); + } + + /** Called after the musical contexts are reordered in an ARA document + + Musical contexts are sorted by their order index - + this callback signals a change in this ordering within the document. + + @param document The document with reordered musical contexts. + */ + virtual void didReorderMusicalContextsInDocument (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called after a region sequence is added to the document. + @param document The document that \p regionSequence was added to. + @param regionSequence The region sequence that was added to \p document. + */ + virtual void didAddRegionSequenceToDocument (ARADocument* document, ARARegionSequence* regionSequence) + { + ignoreUnused (document, regionSequence); + } + + /** Called before a region sequence is removed from the document. + @param document The document that \p regionSequence will be removed from. + @param regionSequence The region sequence that will be removed from \p document. + */ + virtual void willRemoveRegionSequenceFromDocument (ARADocument* document, + ARARegionSequence* regionSequence) + { + ignoreUnused (document, regionSequence); + } + + /** Called after the region sequences are reordered in an ARA document + + Region sequences are sorted by their order index - + this callback signals a change in this ordering within the document. + + @param document The document with reordered region sequences. + */ + virtual void didReorderRegionSequencesInDocument (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called after an audio source is added to the document. + @param document The document that \p audioSource was added to. + @param audioSource The audio source that was added to \p document. + */ + virtual void didAddAudioSourceToDocument (ARADocument* document, ARAAudioSource* audioSource) + { + ignoreUnused (document, audioSource); + } + + /** Called before an audio source is removed from the document. + @param document The document that \p audioSource will be removed from . + @param audioSource The audio source that will be removed from \p document. + */ + virtual void willRemoveAudioSourceFromDocument (ARADocument* document, ARAAudioSource* audioSource) + { + ignoreUnused (document, audioSource); + } + + /** Called before the document is destroyed by the ARA host. + @param document The document that will be destroyed. + */ + virtual void willDestroyDocument (ARADocument* document) + { + ignoreUnused (document); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END +}; + +//============================================================================== +/** Base class representing an ARA document. + + @tags{ARA} +*/ +class JUCE_API ARADocument : public ARA::PlugIn::Document, + public ARAListenableModelClass, + public ARAObject +{ +public: + using PropertiesPtr = ARA::PlugIn::PropertiesPtr; + using Listener = ARADocumentListener; + + using ARA::PlugIn::Document::Document; + + /** Returns the result of ARA::PlugIn::Document::getAudioSources() with the pointers within + cast to ARAAudioSource*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateAudioSource(), then + you can use the template parameter to cast the pointers to your subclass of ARAAudioSource. + */ + template + const std::vector& getAudioSources() const noexcept + { + return ARA::PlugIn::Document::getAudioSources(); + } + + /** Returns the result of ARA::PlugIn::Document::getMusicalContexts() with the pointers within + cast to ARAMusicalContext*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateMusicalContext(), then + you can use the template parameter to cast the pointers to your subclass of ARAMusicalContext. + */ + template + const std::vector& getMusicalContexts() const noexcept + { + return ARA::PlugIn::Document::getMusicalContexts(); + } + + /** Returns the result of ARA::PlugIn::Document::getRegionSequences() with the pointers within + cast to ARARegionSequence*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateRegionSequence(), then + you can use the template parameter to cast the pointers to your subclass of ARARegionSequence. + */ + template + const std::vector& getRegionSequences() const noexcept + { + return ARA::PlugIn::Document::getRegionSequences(); + } + + size_t getNumChildren() const noexcept override; + + ARAObject* getChild (size_t index) override; + + ARAObject* getParent() override { return nullptr; } + + void visit (ARAObjectVisitor& visitor) override { visitor.visitDocument (*this); } +}; + +/** A base class for listeners that want to know about changes to an ARAMusicalContext object. + + Use ARAMusicalContext::addListener() to register your listener with an ARAMusicalContext. + + @tags{ARA} +*/ +class JUCE_API ARAMusicalContextListener +{ +public: + virtual ~ARAMusicalContextListener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called before the musical context's properties are updated. + @param musicalContext The musical context whose properties will be updated. + @param newProperties The musical context properties that will be assigned to \p musicalContext. + */ + virtual void willUpdateMusicalContextProperties (ARAMusicalContext* musicalContext, + ARA::PlugIn::PropertiesPtr newProperties) + { + ignoreUnused (musicalContext, newProperties); + } + + /** Called after the musical context's properties are updated by the host. + @param musicalContext The musical context whose properties were updated. + */ + virtual void didUpdateMusicalContextProperties (ARAMusicalContext* musicalContext) + { + ignoreUnused (musicalContext); + } + + /** Called when the musical context's content (i.e tempo entries or chords) changes. + @param musicalContext The musical context with updated content. + @param scopeFlags The scope of the content update indicating what has changed. + */ + virtual void doUpdateMusicalContextContent (ARAMusicalContext* musicalContext, + ARAContentUpdateScopes scopeFlags) + { + ignoreUnused (musicalContext, scopeFlags); + } + + /** Called after a region sequence is added to the musical context. + @param musicalContext The musical context that \p regionSequence was added to. + @param regionSequence The region sequence that was added to \p musicalContext. + */ + virtual void didAddRegionSequenceToMusicalContext (ARAMusicalContext* musicalContext, + ARARegionSequence* regionSequence) + { + ignoreUnused (musicalContext, regionSequence); + } + + /** Called before a region sequence is removed from the musical context. + @param musicalContext The musical context that \p regionSequence will be removed from. + @param regionSequence The region sequence that will be removed from \p musicalContext. + */ + virtual void willRemoveRegionSequenceFromMusicalContext (ARAMusicalContext* musicalContext, + ARARegionSequence* regionSequence) + { + ignoreUnused (musicalContext, regionSequence); + } + + /** Called after the region sequences are reordered in an ARA MusicalContext + + Region sequences are sorted by their order index - + this callback signals a change in this ordering within the musical context. + + @param musicalContext The musical context with reordered region sequences. + */ + virtual void didReorderRegionSequencesInMusicalContext (ARAMusicalContext* musicalContext) + { + ignoreUnused (musicalContext); + } + + /** Called before the musical context is destroyed. + @param musicalContext The musical context that will be destoyed. + */ + virtual void willDestroyMusicalContext (ARAMusicalContext* musicalContext) + { + ignoreUnused (musicalContext); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END +}; + +//============================================================================== +/** Base class representing an ARA musical context. + + @tags{ARA} +*/ +class JUCE_API ARAMusicalContext : public ARA::PlugIn::MusicalContext, + public ARAListenableModelClass, + public ARAObject +{ +public: + using PropertiesPtr = ARA::PlugIn::PropertiesPtr; + using Listener = ARAMusicalContextListener; + + using ARA::PlugIn::MusicalContext::MusicalContext; + + /** Returns the result of ARA::PlugIn::MusicalContext::getDocument() with the pointer cast + to ARADocument*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateDocument(), then you + can use the template parameter to cast the pointers to your subclass of ARADocument. + */ + template + Document_t* getDocument() const noexcept + { + return ARA::PlugIn::MusicalContext::getDocument(); + } + + /** Returns the result of ARA::PlugIn::MusicalContext::getRegionSequences() with the pointers + within cast to ARARegionSequence*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateRegionSequence(), then you + can use the template parameter to cast the pointers to your subclass of ARARegionSequence. + */ + template + const std::vector& getRegionSequences() const noexcept + { + return ARA::PlugIn::MusicalContext::getRegionSequences(); + } + + size_t getNumChildren() const noexcept override { return 0; } + + ARAObject* getChild (size_t) override { return nullptr; } + + ARAObject* getParent() override { return getDocument(); } + + void visit (ARAObjectVisitor& visitor) override { visitor.visitMusicalContext (*this); } +}; + +/** A base class for listeners that want to know about changes to an ARAPlaybackRegion object. + + Use ARAPlaybackRegion::addListener() to register your listener with an ARAPlaybackRegion. + + @tags{ARA} +*/ +class JUCE_API ARAPlaybackRegionListener +{ +public: + /** Destructor. */ + virtual ~ARAPlaybackRegionListener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called before the playback region's properties are updated. + @param playbackRegion The playback region whose properties will be updated. + @param newProperties The playback region properties that will be assigned to \p playbackRegion. + */ + virtual void willUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion, + ARA::PlugIn::PropertiesPtr newProperties) + { + ignoreUnused (playbackRegion, newProperties); + } + + /** Called after the playback region's properties are updated. + @param playbackRegion The playback region whose properties were updated. + */ + virtual void didUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion) + { + ignoreUnused (playbackRegion); + } + + /** Called when the playback region's content (i.e. samples or notes) changes. + @param playbackRegion The playback region with updated content. + @param scopeFlags The scope of the content update. + */ + virtual void didUpdatePlaybackRegionContent (ARAPlaybackRegion* playbackRegion, + ARAContentUpdateScopes scopeFlags) + { + ignoreUnused (playbackRegion, scopeFlags); + } + + /** Called before the playback region is destroyed. + @param playbackRegion The playback region that will be destoyed. + */ + virtual void willDestroyPlaybackRegion (ARAPlaybackRegion* playbackRegion) + { + ignoreUnused (playbackRegion); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END +}; + +//============================================================================== +/** Base class representing an ARA playback region. + + @tags{ARA} +*/ +class JUCE_API ARAPlaybackRegion : public ARA::PlugIn::PlaybackRegion, + public ARAListenableModelClass, + public ARAObject +{ +public: + using PropertiesPtr = ARA::PlugIn::PropertiesPtr; + using Listener = ARAPlaybackRegionListener; + + using ARA::PlugIn::PlaybackRegion::PlaybackRegion; + + /** Returns the result of ARA::PlugIn::PlaybackRegion::getAudioModification() with the pointer cast + to ARAAudioModification*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateAudioModification(), then you + can use the template parameter to cast the pointers to your subclass of ARAAudioModification. + */ + template + AudioModification_t* getAudioModification() const noexcept + { + return ARA::PlugIn::PlaybackRegion::getAudioModification(); + } + + /** Returns the result of ARA::PlugIn::PlaybackRegion::getRegionSequence() with the pointer cast + to ARARegionSequence*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateRegionSequence(), then you + can use the template parameter to cast the pointers to your subclass of ARARegionSequence. + */ + template + RegionSequence_t* getRegionSequence() const noexcept + { + return ARA::PlugIn::PlaybackRegion::getRegionSequence(); + } + + size_t getNumChildren() const noexcept override { return 0; } + + ARAObject* getChild (size_t) override { return nullptr; } + + ARAObject* getParent() override; + + void visit (ARAObjectVisitor& visitor) override { visitor.visitPlaybackRegion (*this); } + + /** Used in getTimeRange to indicate whether the head and tail times should be included in the result. + */ + enum class IncludeHeadAndTail { no, yes }; + + /** Returns the playback time range of this playback region. + @param includeHeadAndTail Whether or not the range includes the head and tail + time of all playback regions in the sequence. + */ + Range getTimeRange (IncludeHeadAndTail includeHeadAndTail = IncludeHeadAndTail::no) const; + + /** Returns the playback sample range of this playback region. + @param sampleRate The rate at which the sample position should be calculated from + the time range. + @param includeHeadAndTail Whether or not the range includes the head and tail + time of all playback regions in the sequence. + */ + Range getSampleRange (double sampleRate, IncludeHeadAndTail includeHeadAndTail = IncludeHeadAndTail::no) const; + + /** Get the head length in seconds before the start of the region's playback time. */ + double getHeadTime() const; + + /** Get the tail length in seconds after the end of the region's playback time. */ + double getTailTime() const; + + /** Notify the ARA host and any listeners of a content update initiated by the plug-in. + This must be called by the plug-in model management code on the message thread whenever updating + the internal content representation, such as after the user edited the pitch of a note in the + underlying audio modification. + Listeners will be notified immediately. If \p notifyARAHost is true, a notification to the host + will be enqueued and sent out the next time it polls for updates. + + @param scopeFlags The scope of the content update. + @param notifyARAHost If true, the ARA host will be notified of the content change. + */ + void notifyContentChanged (ARAContentUpdateScopes scopeFlags, bool notifyARAHost); +}; + +/** A base class for listeners that want to know about changes to an ARARegionSequence object. + + Use ARARegionSequence::addListener() to register your listener with an ARARegionSequence. + + @tags{ARA} +*/ +class JUCE_API ARARegionSequenceListener +{ +public: + /** Destructor. */ + virtual ~ARARegionSequenceListener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called before the region sequence's properties are updated. + @param regionSequence The region sequence whose properties will be updated. + @param newProperties The region sequence properties that will be assigned to \p regionSequence. + */ + virtual void willUpdateRegionSequenceProperties (ARARegionSequence* regionSequence, + ARA::PlugIn::PropertiesPtr newProperties) + { + ignoreUnused (regionSequence, newProperties); + } + + /** Called after the region sequence's properties are updated. + @param regionSequence The region sequence whose properties were updated. + */ + virtual void didUpdateRegionSequenceProperties (ARARegionSequence* regionSequence) + { + ignoreUnused (regionSequence); + } + + /** Called before a playback region is removed from the region sequence. + @param regionSequence The region sequence that \p playbackRegion will be removed from. + @param playbackRegion The playback region that will be removed from \p regionSequence. + */ + virtual void willRemovePlaybackRegionFromRegionSequence (ARARegionSequence* regionSequence, + ARAPlaybackRegion* playbackRegion) + { + ignoreUnused (regionSequence, playbackRegion); + } + + /** Called after a playback region is added to the region sequence. + @param regionSequence The region sequence that \p playbackRegion was added to. + @param playbackRegion The playback region that was added to \p regionSequence. + */ + virtual void didAddPlaybackRegionToRegionSequence (ARARegionSequence* regionSequence, + ARAPlaybackRegion* playbackRegion) + { + ignoreUnused (regionSequence, playbackRegion); + } + + /** Called before the region sequence is destroyed. + @param regionSequence The region sequence that will be destoyed. + */ + virtual void willDestroyRegionSequence (ARARegionSequence* regionSequence) + { + ignoreUnused (regionSequence); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END +}; + +//============================================================================== +/** Base class representing an ARA region sequence. + + @tags{ARA} +*/ +class JUCE_API ARARegionSequence : public ARA::PlugIn::RegionSequence, + public ARAListenableModelClass, + public ARAObject +{ +public: + using PropertiesPtr = ARA::PlugIn::PropertiesPtr; + using Listener = ARARegionSequenceListener; + + using ARA::PlugIn::RegionSequence::RegionSequence; + + /** Returns the result of ARA::PlugIn::RegionSequence::getDocument() with the pointer cast + to ARADocument*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateDocument(), then you + can use the template parameter to cast the pointers to your subclass of ARADocument. + */ + template + Document_t* getDocument() const noexcept + { + return ARA::PlugIn::RegionSequence::getDocument(); + } + + /** Returns the result of ARA::PlugIn::RegionSequence::getMusicalContext() with the pointer cast + to ARAMusicalContext*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateMusicalContext(), then you + can use the template parameter to cast the pointers to your subclass of ARAMusicalContext. + */ + template + MusicalContext_t* getMusicalContext() const noexcept + { + return ARA::PlugIn::RegionSequence::getMusicalContext(); + } + + /** Returns the result of ARA::PlugIn::RegionSequence::getPlaybackRegions() with the pointers within cast + to ARAPlaybackRegion*. + + If you have overridden ARADocumentControllerSpecialisation::doCreatePlaybackRegion(), then you + can use the template parameter to cast the pointers to your subclass of ARAPlaybackRegion. + */ + template + const std::vector& getPlaybackRegions() const noexcept + { + return ARA::PlugIn::RegionSequence::getPlaybackRegions(); + } + + size_t getNumChildren() const noexcept override; + + ARAObject* getChild (size_t index) override; + + ARAObject* getParent () override { return getDocument(); } + + void visit (ARAObjectVisitor& visitor) override { visitor.visitRegionSequence (*this); } + + /** Returns the playback time range covered by the regions in this sequence. + @param includeHeadAndTail Whether or not the range includes the playback region's head and tail time. + */ + Range getTimeRange (ARAPlaybackRegion::IncludeHeadAndTail includeHeadAndTail = ARAPlaybackRegion::IncludeHeadAndTail::no) const; + + /** If all audio sources used by the playback regions in this region sequence have the same + sample rate, this rate is returned here, otherwise 0.0 is returned. + + If the region sequence has no playback regions, this also returns 0.0. + */ + double getCommonSampleRate() const; +}; + +/** A base class for listeners that want to know about changes to an ARAAudioSource object. + + Use ARAAudioSource::addListener() to register your listener with an ARAAudioSource. + + @tags{ARA} +*/ +class JUCE_API ARAAudioSourceListener +{ +public: + /** Destructor. */ + virtual ~ARAAudioSourceListener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called before the audio source's properties are updated. + @param audioSource The audio source whose properties will be updated. + @param newProperties The audio source properties that will be assigned to \p audioSource. + */ + virtual void willUpdateAudioSourceProperties (ARAAudioSource* audioSource, + ARA::PlugIn::PropertiesPtr newProperties) + { + ignoreUnused (audioSource, newProperties); + } + + /** Called after the audio source's properties are updated. + @param audioSource The audio source whose properties were updated. + */ + virtual void didUpdateAudioSourceProperties (ARAAudioSource* audioSource) + { + ignoreUnused (audioSource); + } + + /** Called when the audio source's content (i.e. samples or notes) changes. + @param audioSource The audio source with updated content. + @param scopeFlags The scope of the content update. + */ + virtual void doUpdateAudioSourceContent (ARAAudioSource* audioSource, ARAContentUpdateScopes scopeFlags) + { + ignoreUnused (audioSource, scopeFlags); + } + + /** Called to notify progress when an audio source is being analyzed. + @param audioSource The audio source being analyzed. + @param state Indicates start, intermediate update or completion of the analysis. + @param progress Progress normalized to the 0..1 range. + */ + virtual void didUpdateAudioSourceAnalysisProgress (ARAAudioSource* audioSource, + ARA::ARAAnalysisProgressState state, + float progress) + { + ignoreUnused (audioSource, state, progress); + } + + /** Called before access to an audio source's samples is enabled or disabled. + @param audioSource The audio source whose sample access state will be changed. + @param enable A bool indicating whether or not sample access will be enabled or disabled. + */ + virtual void willEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) + { + ignoreUnused (audioSource, enable); + } + + /** Called after access to an audio source's samples is enabled or disabled. + @param audioSource The audio source whose sample access state was changed. + @param enable A bool indicating whether or not sample access was enabled or disabled. + */ + virtual void didEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) + { + ignoreUnused (audioSource, enable); + } + + /** Called before an audio source is activated or deactivated when being removed / added from the host's undo history. + @param audioSource The audio source that will be activated or deactivated + @param deactivate A bool indicating whether \p audioSource was deactivated or activated. + */ + virtual void willDeactivateAudioSourceForUndoHistory (ARAAudioSource* audioSource, bool deactivate) + { + ignoreUnused (audioSource, deactivate); + } + + /** Called after an audio source is activated or deactivated when being removed / added from the host's undo history. + @param audioSource The audio source that was activated or deactivated + @param deactivate A bool indicating whether \p audioSource was deactivated or activated. + */ + virtual void didDeactivateAudioSourceForUndoHistory (ARAAudioSource* audioSource, bool deactivate) + { + ignoreUnused (audioSource, deactivate); + } + + /** Called after an audio modification is added to the audio source. + @param audioSource The region sequence that \p audioModification was added to. + @param audioModification The playback region that was added to \p audioSource. + */ + virtual void didAddAudioModificationToAudioSource (ARAAudioSource* audioSource, + ARAAudioModification* audioModification) + { + ignoreUnused (audioSource, audioModification); + } + + /** Called before an audio modification is removed from the audio source. + @param audioSource The audio source that \p audioModification will be removed from. + @param audioModification The audio modification that will be removed from \p audioSource. + */ + virtual void willRemoveAudioModificationFromAudioSource (ARAAudioSource* audioSource, + ARAAudioModification* audioModification) + { + ignoreUnused (audioSource, audioModification); + } + + /** Called before the audio source is destroyed. + @param audioSource The audio source that will be destoyed. + */ + virtual void willDestroyAudioSource (ARAAudioSource* audioSource) + { + ignoreUnused (audioSource); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END +}; + +//============================================================================== +/** Base class representing an ARA audio source. + + @tags{ARA} +*/ +class JUCE_API ARAAudioSource : public ARA::PlugIn::AudioSource, + public ARAListenableModelClass, + public ARAObject +{ +public: + using PropertiesPtr = ARA::PlugIn::PropertiesPtr; + using ARAAnalysisProgressState = ARA::ARAAnalysisProgressState; + using Listener = ARAAudioSourceListener; + + using ARA::PlugIn::AudioSource::AudioSource; + + /** Returns the result of ARA::PlugIn::AudioSource::getDocument() with the pointer cast + to ARADocument*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateDocument(), then you + can use the template parameter to cast the pointers to your subclass of ARADocument. + */ + template + Document_t* getDocument() const noexcept + { + return ARA::PlugIn::AudioSource::getDocument(); + } + + /** Returns the result of ARA::PlugIn::AudioSource::getAudioModifications() with the pointers + within cast to ARAAudioModification*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateAudioModification(), + then you can use the template parameter to cast the pointers to your subclass of + ARAAudioModification. + */ + template + const std::vector& getAudioModifications() const noexcept + { + return ARA::PlugIn::AudioSource::getAudioModifications(); + } + + size_t getNumChildren() const noexcept override; + + ARAObject* getChild (size_t index) override; + + ARAObject* getParent() override { return getDocument(); } + + void visit (ARAObjectVisitor& visitor) override { visitor.visitAudioSource (*this); } + + /** Notify the ARA host and any listeners of analysis progress. + Contrary to most ARA functions, this call can be made from any thread. + The implementation will enqueue these notifications and later post them from the message thread. + Calling code must ensure start and completion state are always balanced, + and must send updates in ascending order. + */ + void notifyAnalysisProgressStarted(); + + /** \copydoc notifyAnalysisProgressStarted + @param progress Progress normalized to the 0..1 range. + */ + void notifyAnalysisProgressUpdated (float progress); + + /** \copydoc notifyAnalysisProgressStarted + */ + void notifyAnalysisProgressCompleted(); + + /** Notify the ARA host and any listeners of a content update initiated by the plug-in. + This must be called by the plug-in model management code on the message thread whenever updating + the internal content representation, such as after successfully analyzing a new tempo map. + Listeners will be notified immediately. If \p notifyARAHost is true, a notification to the host + will be enqueued and sent out the next time it polls for updates. + \p notifyARAHost must be false if the update was triggered by the host via doUpdateAudioSourceContent(). + Furthermore, \p notifyARAHost must be false if the updated content is being restored from an archive. + + @param scopeFlags The scope of the content update. + @param notifyARAHost If true, the ARA host will be notified of the content change. + */ + void notifyContentChanged (ARAContentUpdateScopes scopeFlags, bool notifyARAHost); + +public: + friend ARADocumentController; + ARA::PlugIn::AnalysisProgressTracker internalAnalysisProgressTracker; +}; + +/** A base class for listeners that want to know about changes to an ARAAudioModification object. + + Use ARAAudioModification::addListener() to register your listener with an ARAAudioModification. + + @tags{ARA} +*/ +class JUCE_API ARAAudioModificationListener +{ +public: + /** Destructor. */ + virtual ~ARAAudioModificationListener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called before the audio modification's properties are updated. + @param audioModification The audio modification whose properties will be updated. + @param newProperties The audio modification properties that will be assigned to \p audioModification. + */ + virtual void willUpdateAudioModificationProperties (ARAAudioModification* audioModification, + ARA::PlugIn::PropertiesPtr newProperties) + { + ignoreUnused (audioModification, newProperties); + } + + /** Called after the audio modification's properties are updated. + @param audioModification The audio modification whose properties were updated. + */ + virtual void didUpdateAudioModificationProperties (ARAAudioModification* audioModification) + { + ignoreUnused (audioModification); + } + + /** Called when the audio modification's content (i.e. samples or notes) changes. + @param audioModification The audio modification with updated content. + @param scopeFlags The scope of the content update. + */ + virtual void didUpdateAudioModificationContent (ARAAudioModification* audioModification, ARAContentUpdateScopes scopeFlags) + { + ignoreUnused (audioModification, scopeFlags); + } + + /** Called before an audio modification is activated or deactivated when being removed / added from the host's undo history. + @param audioModification The audio modification that was activated or deactivated + @param deactivate A bool indicating whether \p audioModification was deactivated or activated. + */ + virtual void willDeactivateAudioModificationForUndoHistory (ARAAudioModification* audioModification, bool deactivate) + { + ignoreUnused (audioModification, deactivate); + } + + /** Called after an audio modification is activated or deactivated when being removed / added from the host's undo history. + @param audioModification The audio modification that was activated or deactivated + @param deactivate A bool indicating whether \p audioModification was deactivated or activated. + */ + virtual void didDeactivateAudioModificationForUndoHistory (ARAAudioModification* audioModification, bool deactivate) + { + ignoreUnused (audioModification, deactivate); + } + + /** Called after a playback region is added to the audio modification. + @param audioModification The audio modification that \p playbackRegion was added to. + @param playbackRegion The playback region that was added to \p audioModification. + */ + virtual void didAddPlaybackRegionToAudioModification (ARAAudioModification* audioModification, + ARAPlaybackRegion* playbackRegion) + { + ignoreUnused (audioModification, playbackRegion); + } + + /** Called before a playback region is removed from the audio modification. + @param audioModification The audio modification that \p playbackRegion will be removed from. + @param playbackRegion The playback region that will be removed from \p audioModification. + */ + virtual void willRemovePlaybackRegionFromAudioModification (ARAAudioModification* audioModification, + ARAPlaybackRegion* playbackRegion) + { + ignoreUnused (audioModification, playbackRegion); + } + + /** Called before the audio modification is destroyed. + @param audioModification The audio modification that will be destoyed. + */ + virtual void willDestroyAudioModification (ARAAudioModification* audioModification) + { + ignoreUnused (audioModification); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END +}; + +//============================================================================== +/** Base class representing an ARA audio modification. + + @tags{ARA} +*/ +class JUCE_API ARAAudioModification : public ARA::PlugIn::AudioModification, + public ARAListenableModelClass, + public ARAObject +{ +public: + using PropertiesPtr = ARA::PlugIn::PropertiesPtr; + using Listener = ARAAudioModificationListener; + + using ARA::PlugIn::AudioModification::AudioModification; + + /** Returns the result of ARA::PlugIn::AudioModification::getAudioSource() with the pointer cast + to ARAAudioSource*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateAudioSource(), then you + can use the template parameter to cast the pointers to your subclass of ARAAudioSource. + */ + template + AudioSource_t* getAudioSource() const noexcept + { + return ARA::PlugIn::AudioModification::getAudioSource(); + } + + /** Returns the result of ARA::PlugIn::AudioModification::getPlaybackRegions() with the + pointers within cast to ARAPlaybackRegion*. + + If you have overridden ARADocumentControllerSpecialisation::doCreatePlaybackRegion(), then + you can use the template parameter to cast the pointers to your subclass of ARAPlaybackRegion. + */ + template + const std::vector& getPlaybackRegions() const noexcept + { + return ARA::PlugIn::AudioModification::getPlaybackRegions(); + } + + size_t getNumChildren() const noexcept override; + + ARAObject* getChild (size_t index) override; + + ARAObject* getParent() override { return getAudioSource(); } + + void visit (ARAObjectVisitor& visitor) override { visitor.visitAudioModification (*this); } + + /** Notify the ARA host and any listeners of a content update initiated by the plug-in. + This must be called by the plug-in model management code on the message thread whenever updating + the internal content representation, such as after the user editing the pitch of a note. + Listeners will be notified immediately. If \p notifyARAHost is true, a notification to the host + will be enqueued and sent out the next time it polls for updates. + \p notifyARAHost must be false if the updated content is being restored from an archive. + + @param scopeFlags The scope of the content update. + @param notifyARAHost If true, the ARA host will be notified of the content change. + */ + void notifyContentChanged (ARAContentUpdateScopes scopeFlags, bool notifyARAHost); +}; + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,92 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "juce_ARAPlugInInstanceRoles.h" + +namespace juce +{ + +bool ARARenderer::processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept +{ + ignoreUnused (buffer, realtime, positionInfo); + + // If you hit this assertion then either the caller called the double + // precision version of processBlock on a processor which does not support it + // (i.e. supportsDoublePrecisionProcessing() returns false), or the implementation + // of the ARARenderer forgot to override the double precision version of this method + jassertfalse; + + return false; +} + +//============================================================================== +#if ARA_VALIDATE_API_CALLS +void ARAPlaybackRenderer::addPlaybackRegion (ARA::ARAPlaybackRegionRef playbackRegionRef) noexcept +{ + if (araExtension) + ARA_VALIDATE_API_STATE (! araExtension->isPrepared); + + ARA::PlugIn::PlaybackRenderer::addPlaybackRegion (playbackRegionRef); +} + +void ARAPlaybackRenderer::removePlaybackRegion (ARA::ARAPlaybackRegionRef playbackRegionRef) noexcept +{ + if (araExtension) + ARA_VALIDATE_API_STATE (! araExtension->isPrepared); + + ARA::PlugIn::PlaybackRenderer::removePlaybackRegion (playbackRegionRef); +} +#endif + +//============================================================================== +void ARAEditorView::doNotifySelection (const ARA::PlugIn::ViewSelection* viewSelection) noexcept +{ + listeners.call ([&] (Listener& l) + { + l.onNewSelection (*viewSelection); + }); +} + +void ARAEditorView::doNotifyHideRegionSequences (std::vector const& regionSequences) noexcept +{ + listeners.call ([&] (Listener& l) + { + l.onHideRegionSequences (ARA::vector_cast (regionSequences)); + }); +} + +void ARAEditorView::addListener (Listener* l) +{ + listeners.add (l); +} + +void ARAEditorView::removeListener (Listener* l) +{ + listeners.remove (l); +} + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,271 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#pragma once + +namespace juce +{ + +//============================================================================== +/** Base class for a renderer fulfilling either the ARAPlaybackRenderer or the ARAEditorRenderer role. + + Instances of either subclass are constructed by the DocumentController. + + @tags{ARA} +*/ +class JUCE_API ARARenderer +{ +public: + enum class AlwaysNonRealtime { no, yes }; + + virtual ~ARARenderer() = default; + + /** Initialises the renderer for playback. + + @param sampleRate The sample rate that will be used for the data that is sent + to the renderer + @param maximumSamplesPerBlock The maximum number of samples that will be in the blocks + sent to process() method + @param numChannels The number of channels that the process() method will be + expected to handle + @param precision This should be the same as the result of getProcessingPrecision() + for the enclosing AudioProcessor + @param alwaysNonRealtime yes if this renderer is never used in realtime (e.g. if + providing data for views only) + */ + virtual void prepareToPlay (double sampleRate, + int maximumSamplesPerBlock, + int numChannels, + AudioProcessor::ProcessingPrecision precision, + AlwaysNonRealtime alwaysNonRealtime = AlwaysNonRealtime::no) + { + ignoreUnused (sampleRate, maximumSamplesPerBlock, numChannels, precision, alwaysNonRealtime); + } + + /** Frees render resources allocated in prepareToPlay(). */ + virtual void releaseResources() {} + + /** Resets the internal state variables of the renderer. */ + virtual void reset() {} + + /** Renders the output into the given buffer. Returns true if rendering executed without error, + false otherwise. + + @param buffer The output buffer for the rendering. ARAPlaybackRenderers will + replace the sample data, while ARAEditorRenderer will add to it. + @param realtime Indicates whether the call is executed under real time constraints. + The value of this parameter may change from one call to the next, + and if the value is yes, the rendering may fail if the required + samples cannot be obtained in time. + @param positionInfo Current song position, playback state and playback loop location. + There should be no need to access the bpm, timeSig and ppqPosition + members in any ARA renderer since ARA provides that information with + random access in its model graph. + + Returns false if non-ARA fallback rendering is required and true otherwise. + */ + virtual bool processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept = 0; + + /** Renders the output into the given buffer. Returns true if rendering executed without error, + false otherwise. + + @param buffer The output buffer for the rendering. ARAPlaybackRenderers will + replace the sample data, while ARAEditorRenderer will add to it. + @param realtime Indicates whether the call is executed under real time constraints. + The value of this parameter may change from one call to the next, + and if the value is yes, the rendering may fail if the required + samples cannot be obtained in time. + @param positionInfo Current song position, playback state and playback loop location. + There should be no need to access the bpm, timeSig and ppqPosition + members in any ARA renderer since ARA provides that information with + random access in its model graph. + + Returns false if non-ARA fallback rendering is required and true otherwise. + */ + virtual bool processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept; +}; + +//============================================================================== +/** Base class for a renderer fulfilling the ARAPlaybackRenderer role as described in the ARA SDK. + + Instances of this class are constructed by the DocumentController. If you are subclassing + ARAPlaybackRenderer, make sure to call the base class implementation of any overridden function, + except for processBlock. + + @tags{ARA} +*/ +class JUCE_API ARAPlaybackRenderer : public ARA::PlugIn::PlaybackRenderer, + public ARARenderer +{ +public: + using ARA::PlugIn::PlaybackRenderer::PlaybackRenderer; + + bool processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept override + { + ignoreUnused (buffer, realtime, positionInfo); + return false; + } + + // Shadowing templated getters to default to JUCE versions of the returned classes + /** Returns the PlaybackRegions + * + * @tparam PlaybackRegion_t + * @return + */ + template + std::vector const& getPlaybackRegions() const noexcept + { + return ARA::PlugIn::PlaybackRenderer::getPlaybackRegions(); + } + +#if ARA_VALIDATE_API_CALLS + void addPlaybackRegion (ARA::ARAPlaybackRegionRef playbackRegionRef) noexcept override; + void removePlaybackRegion (ARA::ARAPlaybackRegionRef playbackRegionRef) noexcept override; + AudioProcessorARAExtension* araExtension {}; +#endif + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAPlaybackRenderer) +}; + +//============================================================================== +/** Base class for a renderer fulfilling the ARAEditorRenderer role as described in the ARA SDK. + + Instances of this class are constructed by the DocumentController. If you are subclassing + ARAEditorRenderer, make sure to call the base class implementation of any overridden function, + except for processBlock. + + @tags{ARA} +*/ +class JUCE_API ARAEditorRenderer : public ARA::PlugIn::EditorRenderer, + public ARARenderer +{ +public: + using ARA::PlugIn::EditorRenderer::EditorRenderer; + + // Shadowing templated getters to default to JUCE versions of the returned classes + template + std::vector const& getPlaybackRegions() const noexcept + { + return ARA::PlugIn::EditorRenderer::getPlaybackRegions(); + } + + template + std::vector const& getRegionSequences() const noexcept + { + return ARA::PlugIn::EditorRenderer::getRegionSequences(); + } + + // By default, editor renderers will just let the signal pass through unaltered. + // If you're overriding this to implement actual audio preview, remember to check + // isNonRealtime of the process context - typically preview is limited to realtime. + bool processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime isNonRealtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept override + { + ignoreUnused (buffer, isNonRealtime, positionInfo); + return true; + } + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAEditorRenderer) +}; + +//============================================================================== +/** Base class for a renderer fulfilling the ARAEditorView role as described in the ARA SDK. + + Instances of this class are constructed by the DocumentController. If you are subclassing + ARAEditorView, make sure to call the base class implementation of overridden functions. + + @tags{ARA} +*/ +class JUCE_API ARAEditorView : public ARA::PlugIn::EditorView +{ +public: + using ARA::PlugIn::EditorView::EditorView; + + // Shadowing templated getters to default to JUCE versions of the returned classes + template + std::vector const& getHiddenRegionSequences() const noexcept + { + return ARA::PlugIn::EditorView::getHiddenRegionSequences(); + } + + // Base class implementation must be called if overridden + void doNotifySelection (const ARA::PlugIn::ViewSelection* currentSelection) noexcept override; + + // Base class implementation must be called if overridden + void doNotifyHideRegionSequences (std::vector const& regionSequences) noexcept override; + + /** A base class for listeners that want to know about changes to an ARAEditorView object. + + Use ARAEditorView::addListener() to register your listener with an ARAEditorView. + */ + class JUCE_API Listener + { + public: + /** Destructor. */ + virtual ~Listener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called when the editor view's selection changes. + @param viewSelection The current selection state + */ + virtual void onNewSelection (const ARA::PlugIn::ViewSelection& viewSelection) + { + ignoreUnused (viewSelection); + } + + /** Called when region sequences are flagged as hidden in the host UI. + @param regionSequences A vector containing all hidden region sequences. + */ + virtual void onHideRegionSequences (std::vector const& regionSequences) + { + ignoreUnused (regionSequences); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END + }; + + /** \copydoc ARAListenableModelClass::addListener */ + void addListener (Listener* l); + + /** \copydoc ARAListenableModelClass::removeListener */ + void removeListener (Listener* l); + +private: + ListenerList listeners; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAEditorView) +}; + +} diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,32 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#if JucePlugin_Enable_ARA +#include "juce_ARADocumentControllerCommon.cpp" +#include "juce_ARADocumentController.cpp" +#include "juce_ARAModelObjects.cpp" +#include "juce_ARAPlugInInstanceRoles.cpp" +#include "juce_AudioProcessor_ARAExtensions.cpp" +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,85 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#if JucePlugin_Enable_ARA + +// Include ARA SDK headers +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments", + "-Wunused-parameter") +JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6387) + +#include + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE +JUCE_END_IGNORE_WARNINGS_MSVC + +namespace juce +{ + +using ARAViewSelection = ARA::PlugIn::ViewSelection; +using ARAContentUpdateScopes = ARA::ContentUpdateScopes; +using ARARestoreObjectsFilter = ARA::PlugIn::RestoreObjectsFilter; +using ARAStoreObjectsFilter = ARA::PlugIn::StoreObjectsFilter; + +/** Converts an ARA::ARAUtf8String to a JUCE String. */ +inline String convertARAString (ARA::ARAUtf8String str) +{ + return String (CharPointer_UTF8 (str)); +} + +/** Converts a potentially NULL ARA::ARAUtf8String to a JUCE String. + + Returns the JUCE equivalent of the provided string if it's not nullptr, and the fallback string + otherwise. +*/ +inline String convertOptionalARAString (ARA::ARAUtf8String str, const String& fallbackString = String()) +{ + return (str != nullptr) ? convertARAString (str) : fallbackString; +} + +/** Converts an ARA::ARAColor* to a JUCE Colour. */ +inline Colour convertARAColour (const ARA::ARAColor* colour) +{ + return Colour::fromFloatRGBA (colour->r, colour->g, colour->b, 1.0f); +} + +/** Converts a potentially NULL ARA::ARAColor* to a JUCE Colour. + + Returns the JUCE equivalent of the provided colour if it's not nullptr, and the fallback colour + otherwise. +*/ +inline Colour convertOptionalARAColour (const ARA::ARAColor* colour, const Colour& fallbackColour = Colour()) +{ + return (colour != nullptr) ? convertARAColour (colour) : fallbackColour; +} + +} // namespace juce + +#include "juce_ARAModelObjects.h" +#include "juce_ARADocumentController.h" +#include "juce_AudioProcessor_ARAExtensions.h" +#include "juce_ARAPlugInInstanceRoles.h" + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,154 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "juce_AudioProcessor_ARAExtensions.h" + +namespace juce +{ + +//============================================================================== +bool AudioProcessorARAExtension::getTailLengthSecondsForARA (double& tailLength) const +{ + if (! isBoundToARA()) + return false; + + tailLength = 0.0; + + if (auto playbackRenderer = getPlaybackRenderer()) + for (const auto& playbackRegion : playbackRenderer->getPlaybackRegions()) + tailLength = jmax (tailLength, playbackRegion->getTailTime()); + + return true; +} + +bool AudioProcessorARAExtension::prepareToPlayForARA (double sampleRate, + int samplesPerBlock, + int numChannels, + AudioProcessor::ProcessingPrecision precision) +{ +#if ARA_VALIDATE_API_CALLS + isPrepared = true; +#endif + + if (! isBoundToARA()) + return false; + + if (auto playbackRenderer = getPlaybackRenderer()) + playbackRenderer->prepareToPlay (sampleRate, samplesPerBlock, numChannels, precision); + + if (auto editorRenderer = getEditorRenderer()) + editorRenderer->prepareToPlay (sampleRate, samplesPerBlock, numChannels, precision); + + return true; +} + +bool AudioProcessorARAExtension::releaseResourcesForARA() +{ +#if ARA_VALIDATE_API_CALLS + isPrepared = false; +#endif + + if (! isBoundToARA()) + return false; + + if (auto playbackRenderer = getPlaybackRenderer()) + playbackRenderer->releaseResources(); + + if (auto editorRenderer = getEditorRenderer()) + editorRenderer->releaseResources(); + + return true; +} + +bool AudioProcessorARAExtension::processBlockForARA (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) +{ + // validate that the host has prepared us before processing + ARA_VALIDATE_API_STATE (isPrepared); + + if (! isBoundToARA()) + return false; + + // Render our ARA playback regions for this buffer. + if (auto playbackRenderer = getPlaybackRenderer()) + playbackRenderer->processBlock (buffer, realtime, positionInfo); + + // Render our ARA editor regions and sequences for this buffer. + // This example does not support editor rendering and thus uses the default implementation, + // which is a no-op and could be omitted in actual plug-ins to optimize performance. + if (auto editorRenderer = getEditorRenderer()) + editorRenderer->processBlock (buffer, realtime, positionInfo); + + return true; +} + +bool AudioProcessorARAExtension::processBlockForARA (AudioBuffer& buffer, + juce::AudioProcessor::Realtime realtime, + AudioPlayHead* playhead) +{ + return processBlockForARA (buffer, + realtime, + playhead != nullptr ? playhead->getPosition().orFallback (AudioPlayHead::PositionInfo{}) + : AudioPlayHead::PositionInfo{}); +} + +//============================================================================== +void AudioProcessorARAExtension::didBindToARA() noexcept +{ + // validate that the ARA binding is not established by the host while prepared to play +#if ARA_VALIDATE_API_CALLS + ARA_VALIDATE_API_STATE (! isPrepared); + if (auto playbackRenderer = getPlaybackRenderer()) + playbackRenderer->araExtension = this; +#endif + +#if (! JUCE_DISABLE_ASSERTIONS) + // validate proper subclassing of the instance role classes + if (auto playbackRenderer = getPlaybackRenderer()) + jassert (dynamic_cast (playbackRenderer) != nullptr); + if (auto editorRenderer = getEditorRenderer()) + jassert (dynamic_cast (editorRenderer) != nullptr); + if (auto editorView = getEditorView()) + jassert (dynamic_cast (editorView) != nullptr); +#endif +} + +//============================================================================== + +AudioProcessorEditorARAExtension::AudioProcessorEditorARAExtension (AudioProcessor* audioProcessor) + : araProcessorExtension (dynamic_cast (audioProcessor)) +{ + if (isARAEditorView()) + getARAEditorView()->setEditorOpen (true); +} + +AudioProcessorEditorARAExtension::~AudioProcessorEditorARAExtension() +{ + if (isARAEditorView()) + getARAEditorView()->setEditorOpen (false); +} + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,204 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#pragma once + +namespace juce +{ + +class AudioProcessor; +class ARAPlaybackRenderer; +class ARAEditorRenderer; +class ARAEditorView; + +//============================================================================== +/** Extension class meant to be subclassed by the plugin's implementation of @see AudioProcessor. + + Subclassing AudioProcessorARAExtension allows access to the three possible plugin instance + roles as defined by the ARA SDK. Hosts can assign any subset of roles to each plugin instance. + + @tags{ARA} +*/ +class JUCE_API AudioProcessorARAExtension : public ARA::PlugIn::PlugInExtension +{ +public: + AudioProcessorARAExtension() = default; + + //============================================================================== + /** Returns the result of ARA::PlugIn::PlugInExtension::getPlaybackRenderer() with the pointer + cast to ARAPlaybackRenderer*. + + If you have overridden ARADocumentControllerSpecialisation::doCreatePlaybackRenderer(), + then you can use the template parameter to cast the pointers to your subclass of + ARAPlaybackRenderer. + */ + template + PlaybackRenderer_t* getPlaybackRenderer() const noexcept + { + return ARA::PlugIn::PlugInExtension::getPlaybackRenderer(); + } + + /** Returns the result of ARA::PlugIn::PlugInExtension::getEditorRenderer() with the pointer + cast to ARAEditorRenderer*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateEditorRenderer(), + then you can use the template parameter to cast the pointers to your subclass of + ARAEditorRenderer. + */ + template + EditorRenderer_t* getEditorRenderer() const noexcept + { + return ARA::PlugIn::PlugInExtension::getEditorRenderer(); + } + + /** Returns the result of ARA::PlugIn::PlugInExtension::getEditorView() with the pointer + cast to ARAEditorView*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateEditorView(), + then you can use the template parameter to cast the pointers to your subclass of + ARAEditorView. + */ + template + EditorView_t* getEditorView() const noexcept + { + return ARA::PlugIn::PlugInExtension::getEditorView(); + } + + //============================================================================== + /** Returns true if plugin instance fulfills the ARAPlaybackRenderer role. */ + bool isPlaybackRenderer() const noexcept + { + return ARA::PlugIn::PlugInExtension::getPlaybackRenderer() != nullptr; + } + + /** Returns true if plugin instance fulfills the ARAEditorRenderer role. */ + bool isEditorRenderer() const noexcept + { + return ARA::PlugIn::PlugInExtension::getEditorRenderer() != nullptr; + } + + /** Returns true if plugin instance fulfills the ARAEditorView role. */ + bool isEditorView() const noexcept + { + return ARA::PlugIn::PlugInExtension::getEditorView() != nullptr; + } + + //============================================================================== +#if ARA_VALIDATE_API_CALLS + bool isPrepared { false }; +#endif + +protected: + /** Implementation helper for AudioProcessor::getTailLengthSeconds(). + + If bound to ARA, this traverses the instance roles to retrieve the respective tail time + and returns true. Otherwise returns false and leaves tailLength unmodified. + */ + bool getTailLengthSecondsForARA (double& tailLength) const; + + /** Implementation helper for AudioProcessor::prepareToPlay(). + + If bound to ARA, this traverses the instance roles to prepare them for play and returns + true. Otherwise returns false and does nothing. + */ + bool prepareToPlayForARA (double sampleRate, + int samplesPerBlock, + int numChannels, + AudioProcessor::ProcessingPrecision precision); + + /** Implementation helper for AudioProcessor::releaseResources(). + + If bound to ARA, this traverses the instance roles to let them release resources and returns + true. Otherwise returns false and does nothing. + */ + bool releaseResourcesForARA(); + + /** Implementation helper for AudioProcessor::processBlock(). + + If bound to ARA, this traverses the instance roles to let them process the block and returns + true. Otherwise returns false and does nothing. + + Use this overload if your rendering code already has a current positionInfo available. + */ + bool processBlockForARA (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo); + + /** Implementation helper for AudioProcessor::processBlock(). + + If bound to ARA, this traverses the instance roles to let them process the block and returns + true. Otherwise returns false and does nothing. + + Use this overload if your rendering code does not have a current positionInfo available. + */ + bool processBlockForARA (AudioBuffer& buffer, AudioProcessor::Realtime isNonRealtime, AudioPlayHead* playhead); + + //============================================================================== + /** Optional hook for derived classes to perform any additional initialization that may be needed. + + If overriding this, make sure you call the base class implementation from your override. + */ + void didBindToARA() noexcept override; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorARAExtension) +}; + +//============================================================================== +/** Extension class meant to be subclassed by the plugin's implementation of @see AudioProcessorEditor. + + Subclassing AudioProcessorARAExtension allows access to the ARAEditorView instance role as + described by the ARA SDK. + + @tags{ARA} +*/ +class JUCE_API AudioProcessorEditorARAExtension +{ +public: + /** Constructor. */ + explicit AudioProcessorEditorARAExtension (AudioProcessor* audioProcessor); + + /** \copydoc AudioProcessorARAExtension::getEditorView */ + template + EditorView_t* getARAEditorView() const noexcept + { + return (this->araProcessorExtension != nullptr) ? this->araProcessorExtension->getEditorView() + : nullptr; + } + + /** \copydoc AudioProcessorARAExtension::isEditorView */ + bool isARAEditorView() const noexcept { return getARAEditorView() != nullptr; } + +protected: + /** Destructor. */ + ~AudioProcessorEditorARAExtension(); + +private: + AudioProcessorARAExtension* araProcessorExtension; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorEditorARAExtension) +}; + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,46 +26,36 @@ namespace juce { -AudioParameterBool::AudioParameterBool (const String& idToUse, const String& nameToUse, - bool def, const String& labelToUse, - std::function stringFromBool, - std::function boolFromString) - : RangedAudioParameter (idToUse, nameToUse, labelToUse), - value (def ? 1.0f : 0.0f), - defaultValue (value), - stringFromBoolFunction (stringFromBool), - boolFromStringFunction (boolFromString) -{ - if (stringFromBoolFunction == nullptr) - stringFromBoolFunction = [] (bool v, int) { return v ? TRANS("On") : TRANS("Off"); }; +AudioParameterBool::AudioParameterBool (const ParameterID& idToUse, + const String& nameToUse, + bool def, + const AudioParameterBoolAttributes& attributes) + : RangedAudioParameter (idToUse, nameToUse, attributes.getAudioProcessorParameterWithIDAttributes()), + value (def ? 1.0f : 0.0f), + valueDefault (def), + stringFromBoolFunction (attributes.getStringFromValueFunction() != nullptr + ? attributes.getStringFromValueFunction() + : [] (bool v, int) { return v ? TRANS("On") : TRANS("Off"); }), + boolFromStringFunction (attributes.getValueFromStringFunction() != nullptr + ? attributes.getValueFromStringFunction() + : [] (const String& text) + { + static const StringArray onStrings { TRANS ("on"), TRANS ("yes"), TRANS ("true") }; + static const StringArray offStrings { TRANS ("off"), TRANS ("no"), TRANS ("false") }; + + String lowercaseText (text.toLowerCase()); + + for (auto& testText : onStrings) + if (lowercaseText == testText) + return true; + + for (auto& testText : offStrings) + if (lowercaseText == testText) + return false; - if (boolFromStringFunction == nullptr) - { - StringArray onStrings; - onStrings.add (TRANS("on")); - onStrings.add (TRANS("yes")); - onStrings.add (TRANS("true")); - - StringArray offStrings; - offStrings.add (TRANS("off")); - offStrings.add (TRANS("no")); - offStrings.add (TRANS("false")); - - boolFromStringFunction = [onStrings, offStrings] (const String& text) - { - String lowercaseText (text.toLowerCase()); - - for (auto& testText : onStrings) - if (lowercaseText == testText) - return true; - - for (auto& testText : offStrings) - if (lowercaseText == testText) - return false; - - return text.getIntValue() != 0; - }; - } + return text.getIntValue() != 0; + }) +{ } AudioParameterBool::~AudioParameterBool() @@ -78,7 +68,7 @@ float AudioParameterBool::getValue() const { return value; } void AudioParameterBool::setValue (float newValue) { value = newValue; valueChanged (get()); } -float AudioParameterBool::getDefaultValue() const { return defaultValue; } +float AudioParameterBool::getDefaultValue() const { return valueDefault; } int AudioParameterBool::getNumSteps() const { return 2; } bool AudioParameterBool::isDiscrete() const { return true; } bool AudioParameterBool::isBoolean() const { return true; } diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterBool.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterBool.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterBool.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterBool.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,13 @@ namespace juce { +/** Properties of an AudioParameterBool. + + @see AudioParameterBool(), RangedAudioParameterAttributes() +*/ +class AudioParameterBoolAttributes : public RangedAudioParameterAttributes {}; + +//============================================================================== /** Provides a class of AudioProcessorParameter that can be used as a boolean value. @@ -38,6 +45,28 @@ public: /** Creates a AudioParameterBool with the specified parameters. + Note that the attributes argument is optional and only needs to be + supplied if you want to change options from their default values. + + Example usage: + @code + auto attributes = AudioParameterBoolAttributes().withStringFromValueFunction ([] (auto x, auto) { return x ? "On" : "Off"; }) + .withLabel ("enabled"); + auto param = std::make_unique ("paramID", "Parameter Name", false, attributes); + @endcode + + @param parameterID The parameter ID to use + @param parameterName The parameter name to use + @param defaultValue The default value + @param attributes Optional characteristics + */ + AudioParameterBool (const ParameterID& parameterID, + const String& parameterName, + bool defaultValue, + const AudioParameterBoolAttributes& attributes = {}); + + /** Creates a AudioParameterBool with the specified parameters. + @param parameterID The parameter ID to use @param parameterName The parameter name to use @param defaultValue The default value @@ -49,10 +78,21 @@ converts it into a bool value. Some hosts use this to allow users to type in parameter values. */ - AudioParameterBool (const String& parameterID, const String& parameterName, bool defaultValue, - const String& parameterLabel = String(), + [[deprecated ("Prefer the signature taking an Attributes argument")]] + AudioParameterBool (const ParameterID& parameterID, + const String& parameterName, + bool defaultValue, + const String& parameterLabel, std::function stringFromBool = nullptr, - std::function boolFromString = nullptr); + std::function boolFromString = nullptr) + : AudioParameterBool (parameterID, + parameterName, + defaultValue, + AudioParameterBoolAttributes().withLabel (parameterLabel) + .withStringFromValueFunction (std::move (stringFromBool)) + .withValueFromStringFunction (std::move (boolFromString))) + { + } /** Destructor. */ ~AudioParameterBool() override; @@ -88,7 +128,7 @@ const NormalisableRange range { 0.0f, 1.0f, 1.0f }; std::atomic value; - const float defaultValue; + const float valueDefault; std::function stringFromBoolFunction; std::function boolFromStringFunction; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,11 +26,13 @@ namespace juce { -AudioParameterChoice::AudioParameterChoice (const String& idToUse, const String& nameToUse, - const StringArray& c, int def, const String& labelToUse, - std::function stringFromIndex, - std::function indexFromString) - : RangedAudioParameter (idToUse, nameToUse, labelToUse), choices (c), +AudioParameterChoice::AudioParameterChoice (const ParameterID& idToUse, + const String& nameToUse, + const StringArray& c, + int def, + const AudioParameterChoiceAttributes& attributes) + : RangedAudioParameter (idToUse, nameToUse, attributes.getAudioProcessorParameterWithIDAttributes()), + choices (c), range ([this] { NormalisableRange rangeWithInterval { 0.0f, (float) choices.size() - 1.0f, @@ -42,16 +44,14 @@ }()), value ((float) def), defaultValue (convertTo0to1 ((float) def)), - stringFromIndexFunction (stringFromIndex), - indexFromStringFunction (indexFromString) + stringFromIndexFunction (attributes.getStringFromValueFunction() != nullptr + ? attributes.getStringFromValueFunction() + : [this] (int index, int) { return choices [index]; }), + indexFromStringFunction (attributes.getValueFromStringFunction() != nullptr + ? attributes.getValueFromStringFunction() + : [this] (const String& text) { return choices.indexOf (text); }) { jassert (choices.size() > 1); // you must supply an actual set of items to choose from! - - if (stringFromIndexFunction == nullptr) - stringFromIndexFunction = [this] (int index, int) { return choices [index]; }; - - if (indexFromStringFunction == nullptr) - indexFromStringFunction = [this] (const String& text) { return choices.indexOf (text); }; } AudioParameterChoice::~AudioParameterChoice() diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,13 @@ namespace juce { +/** Properties of an AudioParameterChoice. + + @see AudioParameterChoice(), RangedAudioParameterAttributes() +*/ +class AudioParameterChoiceAttributes : public RangedAudioParameterAttributes {}; + +//============================================================================== /** Provides a class of AudioProcessorParameter that can be used to select an indexed, named choice from a list. @@ -39,10 +46,33 @@ public: /** Creates a AudioParameterChoice with the specified parameters. + Note that the attributes argument is optional and only needs to be + supplied if you want to change options from their default values. + + Example usage: + @code + auto attributes = AudioParameterChoiceAttributes().withLabel ("selected"); + auto param = std::make_unique ("paramID", "Parameter Name", StringArray { "a", "b", "c" }, 0, attributes); + @endcode + @param parameterID The parameter ID to use @param parameterName The parameter name to use @param choices The set of choices to use @param defaultItemIndex The index of the default choice + @param attributes Optional characteristics + */ + AudioParameterChoice (const ParameterID& parameterID, + const String& parameterName, + const StringArray& choices, + int defaultItemIndex, + const AudioParameterChoiceAttributes& attributes = {}); + + /** Creates a AudioParameterChoice with the specified parameters. + + @param parameterID The parameter ID to use + @param parameterName The parameter name to use + @param choicesToUse The set of choices to use + @param defaultItemIndex The index of the default choice @param parameterLabel An optional label for the parameter's value @param stringFromIndex An optional lambda function that converts a choice index to a string with a maximum length. This may @@ -51,12 +81,23 @@ converts it into a choice index. Some hosts use this to allow users to type in parameter values. */ - AudioParameterChoice (const String& parameterID, const String& parameterName, - const StringArray& choices, + [[deprecated ("Prefer the signature taking an Attributes argument")]] + AudioParameterChoice (const ParameterID& parameterID, + const String& parameterName, + const StringArray& choicesToUse, int defaultItemIndex, - const String& parameterLabel = String(), + const String& parameterLabel, std::function stringFromIndex = nullptr, - std::function indexFromString = nullptr); + std::function indexFromString = nullptr) + : AudioParameterChoice (parameterID, + parameterName, + choicesToUse, + defaultItemIndex, + AudioParameterChoiceAttributes().withLabel (parameterLabel) + .withStringFromValueFunction (std::move (stringFromIndex)) + .withValueFromStringFunction (std::move (indexFromString))) + { + } /** Destructor. */ ~AudioParameterChoice() override; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,15 +26,17 @@ namespace juce { -AudioParameterFloat::AudioParameterFloat (const String& idToUse, const String& nameToUse, - NormalisableRange r, float def, - const String& labelToUse, Category categoryToUse, - std::function stringFromValue, - std::function valueFromString) - : RangedAudioParameter (idToUse, nameToUse, labelToUse, categoryToUse), - range (r), value (def), defaultValue (def), - stringFromValueFunction (stringFromValue), - valueFromStringFunction (valueFromString) +AudioParameterFloat::AudioParameterFloat (const ParameterID& idToUse, + const String& nameToUse, + NormalisableRange r, + float def, + const AudioParameterFloatAttributes& attributes) + : RangedAudioParameter (idToUse, nameToUse, attributes.getAudioProcessorParameterWithIDAttributes()), + range (r), + value (def), + valueDefault (def), + stringFromValueFunction (attributes.getStringFromValueFunction()), + valueFromStringFunction (attributes.getValueFromStringFunction()) { if (stringFromValueFunction == nullptr) { @@ -70,7 +72,7 @@ valueFromStringFunction = [] (const String& text) { return text.getFloatValue(); }; } -AudioParameterFloat::AudioParameterFloat (String pid, String nm, float minValue, float maxValue, float def) +AudioParameterFloat::AudioParameterFloat (const ParameterID& pid, const String& nm, float minValue, float maxValue, float def) : AudioParameterFloat (pid, nm, { minValue, maxValue, 0.01f }, def) { } @@ -85,7 +87,7 @@ float AudioParameterFloat::getValue() const { return convertTo0to1 (value); } void AudioParameterFloat::setValue (float newValue) { value = convertFrom0to1 (newValue); valueChanged (get()); } -float AudioParameterFloat::getDefaultValue() const { return convertTo0to1 (defaultValue); } +float AudioParameterFloat::getDefaultValue() const { return convertTo0to1 (valueDefault); } int AudioParameterFloat::getNumSteps() const { return AudioProcessorParameterWithID::getNumSteps(); } String AudioParameterFloat::getText (float v, int length) const { return stringFromValueFunction (convertFrom0to1 (v), length); } float AudioParameterFloat::getValueForText (const String& text) const { return convertTo0to1 (valueFromStringFunction (text)); } diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,13 @@ namespace juce { +/** Properties of an AudioParameterFloat. + + @see AudioParameterFloat(), RangedAudioParameterAttributes() +*/ +class AudioParameterFloatAttributes : public RangedAudioParameterAttributes {}; + +//============================================================================== /** A subclass of AudioProcessorParameter that provides an easy way to create a parameter which maps onto a given NormalisableRange. @@ -39,6 +46,30 @@ public: /** Creates a AudioParameterFloat with the specified parameters. + Note that the attributes argument is optional and only needs to be + supplied if you want to change options from their default values. + + Example usage: + @code + auto attributes = AudioParameterFloatAttributes().withStringFromValueFunction ([] (auto x, auto) { return String (x * 100); }) + .withLabel ("%"); + auto param = std::make_unique ("paramID", "Parameter Name", NormalisableRange(), 0.5f, attributes); + @endcode + + @param parameterID The parameter ID to use + @param parameterName The parameter name to use + @param normalisableRange The NormalisableRange to use + @param defaultValue The non-normalised default value + @param attributes Optional characteristics + */ + AudioParameterFloat (const ParameterID& parameterID, + const String& parameterName, + NormalisableRange normalisableRange, + float defaultValue, + const AudioParameterFloatAttributes& attributes = {}); + + /** Creates a AudioParameterFloat with the specified parameters. + @param parameterID The parameter ID to use @param parameterName The parameter name to use @param normalisableRange The NormalisableRange to use @@ -52,22 +83,33 @@ converts it into a non-normalised value. Some hosts use this to allow users to type in parameter values. */ - AudioParameterFloat (const String& parameterID, + [[deprecated ("Prefer the signature taking an Attributes argument")]] + AudioParameterFloat (const ParameterID& parameterID, const String& parameterName, NormalisableRange normalisableRange, float defaultValue, - const String& parameterLabel = String(), + const String& parameterLabel, Category parameterCategory = AudioProcessorParameter::genericParameter, std::function stringFromValue = nullptr, - std::function valueFromString = nullptr); + std::function valueFromString = nullptr) + : AudioParameterFloat (parameterID, + parameterName, + std::move (normalisableRange), + defaultValue, + AudioParameterFloatAttributes().withLabel (parameterLabel) + .withCategory (parameterCategory) + .withStringFromValueFunction (std::move (stringFromValue)) + .withValueFromStringFunction (std::move (valueFromString))) + { + } /** Creates a AudioParameterFloat with an ID, name, and range. On creation, its value is set to the default value. For control over skew factors, you can use the other constructor and provide a NormalisableRange. */ - AudioParameterFloat (String parameterID, - String parameterName, + AudioParameterFloat (const ParameterID& parameterID, + const String& parameterName, float minValue, float maxValue, float defaultValue); @@ -106,7 +148,7 @@ float getValueForText (const String&) const override; std::atomic value; - const float defaultValue; + const float valueDefault; std::function stringFromValueFunction; std::function valueFromStringFunction; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,33 +26,29 @@ namespace juce { -AudioParameterInt::AudioParameterInt (const String& idToUse, const String& nameToUse, +AudioParameterInt::AudioParameterInt (const ParameterID& idToUse, const String& nameToUse, int minValue, int maxValue, int def, - const String& labelToUse, - std::function stringFromInt, - std::function intFromString) - : RangedAudioParameter (idToUse, nameToUse, labelToUse), - range ([minValue, maxValue] - { - NormalisableRange rangeWithInterval { (float) minValue, (float) maxValue, - [] (float start, float end, float v) { return jlimit (start, end, v * (end - start) + start); }, - [] (float start, float end, float v) { return jlimit (0.0f, 1.0f, (v - start) / (end - start)); }, - [] (float start, float end, float v) { return (float) roundToInt (juce::jlimit (start, end, v)); } }; - rangeWithInterval.interval = 1.0f; - return rangeWithInterval; - }()), - value ((float) def), - defaultValue (convertTo0to1 ((float) def)), - stringFromIntFunction (stringFromInt), - intFromStringFunction (intFromString) + const AudioParameterIntAttributes& attributes) + : RangedAudioParameter (idToUse, nameToUse, attributes.getAudioProcessorParameterWithIDAttributes()), + range ([minValue, maxValue] + { + NormalisableRange rangeWithInterval { (float) minValue, (float) maxValue, + [] (float start, float end, float v) { return jlimit (start, end, v * (end - start) + start); }, + [] (float start, float end, float v) { return jlimit (0.0f, 1.0f, (v - start) / (end - start)); }, + [] (float start, float end, float v) { return (float) roundToInt (juce::jlimit (start, end, v)); } }; + rangeWithInterval.interval = 1.0f; + return rangeWithInterval; + }()), + value ((float) def), + defaultValue (convertTo0to1 ((float) def)), + stringFromIntFunction (attributes.getStringFromValueFunction() != nullptr + ? attributes.getStringFromValueFunction() + : [] (int v, int) { return String (v); }), + intFromStringFunction (attributes.getValueFromStringFunction() != nullptr + ? attributes.getValueFromStringFunction() + : [] (const String& text) { return text.getIntValue(); }) { jassert (minValue < maxValue); // must have a non-zero range of values! - - if (stringFromIntFunction == nullptr) - stringFromIntFunction = [] (int v, int) { return String (v); }; - - if (intFromStringFunction == nullptr) - intFromStringFunction = [] (const String& text) { return text.getIntValue(); }; } AudioParameterInt::~AudioParameterInt() diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterInt.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterInt.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterInt.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioParameterInt.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,13 @@ namespace juce { +/** Properties of an AudioParameterInt. + + @see AudioParameterInt(), RangedAudioParameterAttributes() +*/ +class AudioParameterIntAttributes : public RangedAudioParameterAttributes {}; + +//============================================================================== /** Provides a class of AudioProcessorParameter that can be used as an integer value with a given range. @@ -39,11 +46,37 @@ public: /** Creates a AudioParameterInt with the specified parameters. + Note that the attributes argument is optional and only needs to be + supplied if you want to change options from their default values. + + Example usage: + @code + auto attributes = AudioParameterIntAttributes().withStringFromValueFunction ([] (auto x, auto) { return String (x); }) + .withLabel ("things"); + auto param = std::make_unique ("paramID", "Parameter Name", 0, 100, 50, attributes); + @endcode + @param parameterID The parameter ID to use @param parameterName The parameter name to use @param minValue The minimum parameter value @param maxValue The maximum parameter value @param defaultValue The default value + @param attributes Optional characteristics + */ + AudioParameterInt (const ParameterID& parameterID, + const String& parameterName, + int minValue, + int maxValue, + int defaultValue, + const AudioParameterIntAttributes& attributes = {}); + + /** Creates a AudioParameterInt with the specified parameters. + + @param parameterID The parameter ID to use + @param parameterName The parameter name to use + @param minValue The minimum parameter value + @param maxValue The maximum parameter value + @param defaultValueIn The default value @param parameterLabel An optional label for the parameter's value @param stringFromInt An optional lambda function that converts a int value to a string with a maximum length. This may @@ -52,12 +85,25 @@ and converts it into an int. Some hosts use this to allow users to type in parameter values. */ - AudioParameterInt (const String& parameterID, const String& parameterName, - int minValue, int maxValue, - int defaultValue, - const String& parameterLabel = String(), + [[deprecated ("Prefer the signature taking an Attributes argument")]] + AudioParameterInt (const ParameterID& parameterID, + const String& parameterName, + int minValue, + int maxValue, + int defaultValueIn, + const String& parameterLabel, std::function stringFromInt = nullptr, - std::function intFromString = nullptr); + std::function intFromString = nullptr) + : AudioParameterInt (parameterID, + parameterName, + minValue, + maxValue, + defaultValueIn, + AudioParameterIntAttributes().withLabel (parameterLabel) + .withStringFromValueFunction (std::move (stringFromInt)) + .withValueFromStringFunction (std::move (intFromString))) + { + } /** Destructor. */ ~AudioParameterInt() override; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,12 +26,19 @@ namespace juce { -AudioProcessorParameterWithID::AudioProcessorParameterWithID (const String& idToUse, +AudioProcessorParameterWithID::AudioProcessorParameterWithID (const ParameterID& idToUse, const String& nameToUse, - const String& labelToUse, - AudioProcessorParameter::Category categoryToUse) - : paramID (idToUse), name (nameToUse), label (labelToUse), category (categoryToUse) {} -AudioProcessorParameterWithID::~AudioProcessorParameterWithID() {} + const AudioProcessorParameterWithIDAttributes& attributes) + : HostedAudioProcessorParameter (idToUse.getVersionHint()), + paramID (idToUse.getParamID()), + name (nameToUse), + label (attributes.getLabel()), + category (attributes.getCategory()), + meta (attributes.getMeta()), + automatable (attributes.getAutomatable()), + inverted (attributes.getInverted()) +{ +} String AudioProcessorParameterWithID::getName (int maximumStringLength) const { return name.substring (0, maximumStringLength); } String AudioProcessorParameterWithID::getLabel() const { return label; } diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,6 +27,87 @@ { /** + Combines a parameter ID and a version hint. +*/ +class ParameterID +{ +public: + ParameterID() = default; + + /** Constructs an instance. + + Note that this constructor implicitly converts from Strings and string-like types. + + @param identifier A string that uniquely identifies a single parameter + @param versionHint Influences parameter ordering in Audio Unit plugins. + Used to provide backwards compatibility of Audio Unit plugins in + Logic and GarageBand. + @see AudioProcessorParameter(int) + */ + template > + ParameterID (StringLike&& identifier, int versionHint = 0) + : paramID (std::forward (identifier)), version (versionHint) {} + + /** @see AudioProcessorParameterWithID::paramID */ + auto getParamID() const { return paramID; } + + /** @see AudioProcessorParameter(int) */ + auto getVersionHint() const { return version; } + +private: + String paramID; + int version = 0; +}; + +/** + An instance of this class may be passed to the constructor of an AudioProcessorParameterWithID + to set optional characteristics of that parameter. +*/ +class AudioProcessorParameterWithIDAttributes +{ + using This = AudioProcessorParameterWithIDAttributes; + +public: + using Category = AudioProcessorParameter::Category; + + /** An optional label for the parameter's value */ + JUCE_NODISCARD auto withLabel (String x) const { return withMember (*this, &This::label, std::move (x)); } + + /** The semantics of this parameter */ + JUCE_NODISCARD auto withCategory (Category x) const { return withMember (*this, &This::category, std::move (x)); } + + /** @see AudioProcessorParameter::isMetaParameter() */ + JUCE_NODISCARD auto withMeta (bool x) const { return withMember (*this, &This::meta, std::move (x)); } + + /** @see AudioProcessorParameter::isAutomatable() */ + JUCE_NODISCARD auto withAutomatable (bool x) const { return withMember (*this, &This::automatable, std::move (x)); } + + /** @see AudioProcessorParameter::isOrientationInverted() */ + JUCE_NODISCARD auto withInverted (bool x) const { return withMember (*this, &This::inverted, std::move (x)); } + + /** An optional label for the parameter's value */ + JUCE_NODISCARD auto getLabel() const { return label; } + + /** The semantics of this parameter */ + JUCE_NODISCARD auto getCategory() const { return category; } + + /** @see AudioProcessorParameter::isMetaParameter() */ + JUCE_NODISCARD auto getMeta() const { return meta; } + + /** @see AudioProcessorParameter::isAutomatable() */ + JUCE_NODISCARD auto getAutomatable() const { return automatable; } + + /** @see AudioProcessorParameter::isOrientationInverted() */ + JUCE_NODISCARD auto getInverted() const { return inverted; } + +private: + String label; + Category category = AudioProcessorParameter::genericParameter; + bool meta = false, automatable = true, inverted = false; +}; + +//============================================================================== +/** This abstract base class is used by some AudioProcessorParameter helper classes. @see AudioParameterFloat, AudioParameterInt, AudioParameterBool, AudioParameterChoice @@ -36,16 +117,45 @@ class JUCE_API AudioProcessorParameterWithID : public HostedAudioProcessorParameter { public: + /** The creation of this object requires providing a name and ID which will be constant for its lifetime. + + Given that AudioProcessorParameterWithID is abstract, you'll probably call this constructor + from a derived class constructor, e.g. + @code + MyParameterType (String paramID, String name, String label, bool automatable) + : AudioProcessorParameterWithID (paramID, name, AudioProcessorParameterWithIDAttributes().withLabel (label) + .withAutomatable (automatable)) + { + } + @endcode + + @param parameterID Specifies the identifier, and optionally the parameter's version hint. + @param parameterName The user-facing parameter name. + @param attributes Other parameter properties. + */ + AudioProcessorParameterWithID (const ParameterID& parameterID, + const String& parameterName, + const AudioProcessorParameterWithIDAttributes& attributes = {}); + /** The creation of this object requires providing a name and ID which will be constant for its lifetime. + + @param parameterID Used to uniquely identify the parameter + @param parameterName The user-facing name of the parameter + @param parameterLabel An optional label for the parameter's value + @param parameterCategory The semantics of this parameter */ - AudioProcessorParameterWithID (const String& parameterID, + [[deprecated ("Prefer the signature taking an Attributes argument")]] + AudioProcessorParameterWithID (const ParameterID& parameterID, const String& parameterName, - const String& parameterLabel = {}, - Category parameterCategory = AudioProcessorParameter::genericParameter); - - /** Destructor. */ - ~AudioProcessorParameterWithID() override; + const String& parameterLabel, + Category parameterCategory = AudioProcessorParameter::genericParameter) + : AudioProcessorParameterWithID (parameterID, + parameterName, + AudioProcessorParameterWithIDAttributes().withLabel (parameterLabel) + .withCategory (parameterCategory)) + { + } /** Provides access to the parameter's ID string. */ const String paramID; @@ -63,9 +173,14 @@ String getLabel() const override; Category getCategory() const override; - String getParameterID() const override { return paramID; } + String getParameterID() const override { return paramID; } + bool isMetaParameter() const override { return meta; } + bool isAutomatable() const override { return automatable; } + bool isOrientationInverted() const override { return inverted; } private: + bool meta = false, automatable = true, inverted = false; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorParameterWithID) }; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,40 +27,26 @@ { //============================================================================== -AudioProcessorValueTreeState::Parameter::Parameter (const String& parameterID, + +AudioProcessorValueTreeState::Parameter::Parameter (const ParameterID& parameterID, const String& parameterName, - const String& labelText, NormalisableRange valueRange, float defaultParameterValue, - std::function valueToTextFunction, - std::function textToValueFunction, - bool isMetaParameter, - bool isAutomatableParameter, - bool isDiscrete, - AudioProcessorParameter::Category parameterCategory, - bool isBoolean) + const AudioProcessorValueTreeStateParameterAttributes& attributes) : AudioParameterFloat (parameterID, parameterName, valueRange, defaultParameterValue, - labelText, - parameterCategory, - valueToTextFunction == nullptr ? std::function() - : [valueToTextFunction] (float v, int) { return valueToTextFunction (v); }, - std::move (textToValueFunction)), + attributes.getAudioParameterFloatAttributes()), unsnappedDefault (valueRange.convertTo0to1 (defaultParameterValue)), - metaParameter (isMetaParameter), - automatable (isAutomatableParameter), - discrete (isDiscrete), - boolean (isBoolean) + discrete (attributes.getDiscrete()), + boolean (attributes.getBoolean()) { } float AudioProcessorValueTreeState::Parameter::getDefaultValue() const { return unsnappedDefault; } int AudioProcessorValueTreeState::Parameter::getNumSteps() const { return RangedAudioParameter::getNumSteps(); } -bool AudioProcessorValueTreeState::Parameter::isMetaParameter() const { return metaParameter; } -bool AudioProcessorValueTreeState::Parameter::isAutomatable() const { return automatable; } bool AudioProcessorValueTreeState::Parameter::isDiscrete() const { return discrete; } bool AudioProcessorValueTreeState::Parameter::isBoolean() const { return boolean; } @@ -303,18 +289,21 @@ AudioProcessorParameter::Category category, bool isBooleanParameter) { + auto attributes = AudioProcessorValueTreeStateParameterAttributes() + .withLabel (labelText) + .withStringFromValueFunction ([fn = std::move (valueToTextFunction)] (float v, int) { return fn (v); }) + .withValueFromStringFunction (std::move (textToValueFunction)) + .withMeta (isMetaParameter) + .withAutomatable (isAutomatableParameter) + .withDiscrete (isDiscreteParameter) + .withCategory (category) + .withBoolean (isBooleanParameter); + return createAndAddParameter (std::make_unique (paramID, paramName, - labelText, range, defaultVal, - std::move (valueToTextFunction), - std::move (textToValueFunction), - isMetaParameter, - isAutomatableParameter, - isDiscreteParameter, - category, - isBooleanParameter)); + std::move (attributes))); } RangedAudioParameter* AudioProcessorValueTreeState::createAndAddParameter (std::unique_ptr param) @@ -533,7 +522,7 @@ { const auto test = [&] (NormalisableRange range, float value) { - AudioParameterFloat param ({}, {}, range, value, {}); + AudioParameterFloat param ({}, {}, range, value); AudioProcessorValueTreeState::ParameterAdapter adapter (param); @@ -548,7 +537,7 @@ { const auto test = [&] (NormalisableRange range, float value) { - AudioParameterFloat param ({}, {}, range, {}, {}); + AudioParameterFloat param ({}, {}, range, {}); AudioProcessorValueTreeState::ParameterAdapter adapter (param); adapter.setDenormalisedValue (value); @@ -565,7 +554,7 @@ { const auto test = [&] (NormalisableRange range, float value, String expected) { - AudioParameterFloat param ({}, {}, range, {}, {}); + AudioParameterFloat param ({}, {}, range, {}); AudioProcessorValueTreeState::ParameterAdapter adapter (param); expectEquals (adapter.getTextForDenormalisedValue (value), expected); @@ -581,7 +570,7 @@ { const auto test = [&] (NormalisableRange range, String text, float expected) { - AudioParameterFloat param ({}, {}, range, {}, {}); + AudioParameterFloat param ({}, {}, range, {}); AudioProcessorValueTreeState::ParameterAdapter adapter (param); expectEquals (adapter.getDenormalisedValueForText (text), expected); @@ -621,6 +610,7 @@ using Parameter = AudioProcessorValueTreeState::Parameter; using ParameterGroup = AudioProcessorParameterGroup; using ParameterLayout = AudioProcessorValueTreeState::ParameterLayout; + using Attributes = AudioProcessorValueTreeStateParameterAttributes; class TestAudioProcessor : public AudioProcessor { @@ -677,8 +667,11 @@ { TestAudioProcessor proc; - proc.state.createAndAddParameter (std::make_unique (String(), String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + proc.state.createAndAddParameter (std::make_unique ( + String(), + String(), + NormalisableRange(), + 0.0f)); expectEquals (proc.getParameters().size(), 1); } @@ -688,8 +681,11 @@ TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f)); expect (proc.state.getParameter (key) == param); } @@ -721,8 +717,12 @@ TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr, true)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f, + Attributes().withMeta (true))); expect (param->isMetaParameter()); } @@ -732,8 +732,12 @@ TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr, false, true)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f, + Attributes().withAutomatable (true))); expect (param->isAutomatable()); } @@ -743,8 +747,12 @@ TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr, false, false, true)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f, + Attributes().withDiscrete (true))); expect (param->isDiscrete()); } @@ -754,9 +762,12 @@ TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr, false, false, false, - AudioProcessorParameter::Category::inputMeter)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f, + Attributes().withCategory (AudioProcessorParameter::Category::inputMeter))); expect (param->category == AudioProcessorParameter::Category::inputMeter); } @@ -766,9 +777,12 @@ TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr, false, false, false, - AudioProcessorParameter::Category::genericParameter, true)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f, + Attributes().withBoolean (true))); expect (param->isBoolean()); } @@ -788,11 +802,17 @@ { TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f)); - proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f)); expectEquals (proc.getParameters().size(), 1); expect (proc.getParameters().getFirst() == param); @@ -802,8 +822,11 @@ { TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f)); const auto value = 0.5f; param->setValueNotifyingHost (value); @@ -820,11 +843,8 @@ proc.state.createAndAddParameter (std::make_unique ( key, String(), - String(), NormalisableRange (0.0f, 100.0f, 10.0f), - value, - nullptr, - nullptr)); + value)); expectEquals (proc.state.getRawParameterValue (key)->load(), value); } @@ -834,8 +854,11 @@ Listener listener; TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f)); proc.state.addParameterListener (key, &listener); const auto value = 0.5f; @@ -891,8 +914,11 @@ TestAudioProcessor proc; const auto key = "id"; const auto initialValue = 0.2f; - auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - initialValue, nullptr, nullptr)); + auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + initialValue)); proc.state.state = ValueTree { "state" }; auto value = proc.state.getParameterAsValue (key); @@ -926,8 +952,11 @@ Listener listener; TestAudioProcessor proc; const auto key = "id"; - proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f)); proc.state.addParameterListener (key, &listener); proc.state.state = ValueTree { "state" }; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,60 @@ namespace juce { +/** Advanced properties of an AudioProcessorValueTreeState::Parameter. + + The members here have the same meaning as the similarly-named member functions of + AudioParameterFloatAttributes. + + @see AudioParameterFloatAttributes, RangedAudioParameterAttributes +*/ +class AudioProcessorValueTreeStateParameterAttributes +{ + using This = AudioProcessorValueTreeStateParameterAttributes; + using StringFromValue = AudioParameterFloatAttributes::StringFromValue; + using ValueFromString = AudioParameterFloatAttributes::ValueFromString; + using Category = AudioParameterFloatAttributes::Category; + +public: + /** @see RangedAudioParameterAttributes::withStringFromValueFunction() */ + JUCE_NODISCARD auto withStringFromValueFunction (StringFromValue x) const { return withMember (*this, &This::attributes, attributes.withStringFromValueFunction (std::move (x))); } + /** @see RangedAudioParameterAttributes::withValueFromStringFunction() */ + JUCE_NODISCARD auto withValueFromStringFunction (ValueFromString x) const { return withMember (*this, &This::attributes, attributes.withValueFromStringFunction (std::move (x))); } + /** @see RangedAudioParameterAttributes::withLabel() */ + JUCE_NODISCARD auto withLabel (String x) const { return withMember (*this, &This::attributes, attributes.withLabel (std::move (x))); } + /** @see RangedAudioParameterAttributes::withCategory() */ + JUCE_NODISCARD auto withCategory (Category x) const { return withMember (*this, &This::attributes, attributes.withCategory (std::move (x))); } + /** @see RangedAudioParameterAttributes::withMeta() */ + JUCE_NODISCARD auto withMeta (bool x) const { return withMember (*this, &This::attributes, attributes.withMeta (std::move (x))); } + /** @see RangedAudioParameterAttributes::withAutomatable() */ + JUCE_NODISCARD auto withAutomatable (bool x) const { return withMember (*this, &This::attributes, attributes.withAutomatable (std::move (x))); } + /** @see RangedAudioParameterAttributes::withInverted() */ + JUCE_NODISCARD auto withInverted (bool x) const { return withMember (*this, &This::attributes, attributes.withInverted (std::move (x))); } + + /** Pass 'true' if this parameter has discrete steps, or 'false' if the parameter is continuous. + + Using an AudioParameterChoice or AudioParameterInt might be a better choice than setting this flag. + */ + JUCE_NODISCARD auto withDiscrete (bool x) const { return withMember (*this, &This::discrete, std::move (x)); } + + /** Pass 'true' if this parameter only has two valid states. + + Using an AudioParameterBool might be a better choice than setting this flag. + */ + JUCE_NODISCARD auto withBoolean (bool x) const { return withMember (*this, &This::boolean, std::move (x)); } + + /** @returns all attributes that might also apply to an AudioParameterFloat */ + JUCE_NODISCARD const auto& getAudioParameterFloatAttributes() const { return attributes; } + /** @returns 'true' if this parameter has discrete steps, or 'false' if the parameter is continuous. */ + JUCE_NODISCARD const auto& getDiscrete() const { return discrete; } + /** @returns 'true' if this parameter only has two valid states. */ + JUCE_NODISCARD const auto& getBoolean() const { return boolean; } + +private: + AudioParameterFloatAttributes attributes; + bool discrete = false, boolean = false; +}; + /** This class contains a ValueTree that is used to manage an AudioProcessor's entire state. @@ -398,24 +452,65 @@ class Parameter final : public AudioParameterFloat { public: - Parameter (const String& parameterID, + /** Constructs a parameter instance. + + Example usage: + @code + using Parameter = AudioProcessorValueTreeState::Parameter; + using Attributes = AudioProcessorValueTreeStateParameterAttributes; + + auto parameter = std::make_unique (ParameterID { "uniqueID", 1 }, + "Name", + NormalisableRange { 0.0f, 100.0f }, + 50.0f, + Attributes().withStringFromValueFunction (myStringFromValueFunction) + .withValueFromStringFunction (myValueFromStringFunction) + .withLabel ("%")); + @endcode + + @param parameterID The globally-unique identifier of this parameter + @param parameterName The user-facing name of this parameter + @param valueRange The valid range of values for this parameter + @param defaultValue The initial parameter value + @param attributes Further advanced settings to customise the behaviour of this parameter + */ + Parameter (const ParameterID& parameterID, const String& parameterName, - const String& labelText, NormalisableRange valueRange, float defaultValue, + const AudioProcessorValueTreeStateParameterAttributes& attributes = {}); + + [[deprecated ("Prefer the signature taking an Attributes argument")]] + Parameter (const ParameterID& parameterID, + const String& parameterName, + const String& labelText, + NormalisableRange valueRange, + float defaultParameterValue, std::function valueToTextFunction, std::function textToValueFunction, bool isMetaParameter = false, bool isAutomatableParameter = true, bool isDiscrete = false, AudioProcessorParameter::Category parameterCategory = AudioProcessorParameter::genericParameter, - bool isBoolean = false); + bool isBoolean = false) + : Parameter (parameterID, + parameterName, + valueRange, + defaultParameterValue, + AudioProcessorValueTreeStateParameterAttributes().withLabel (labelText) + .withStringFromValueFunction ([valueToTextFunction] (float v, int) { return valueToTextFunction (v); }) + .withValueFromStringFunction (std::move (textToValueFunction)) + .withMeta (isMetaParameter) + .withAutomatable (isAutomatableParameter) + .withDiscrete (isDiscrete) + .withCategory (parameterCategory) + .withBoolean (isBoolean)) + { + } float getDefaultValue() const override; int getNumSteps() const override; - bool isMetaParameter() const override; - bool isAutomatable() const override; bool isDiscrete() const override; bool isBoolean() const override; @@ -425,7 +520,7 @@ std::function onValueChanged; const float unsnappedDefault; - const bool metaParameter, automatable, discrete, boolean; + const bool discrete, boolean; std::atomic lastValue { -1.0f }; friend class AudioProcessorValueTreeState::ParameterAdapter; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -37,7 +37,7 @@ #endif //============================================================================== -#if (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || (defined(AUDIOCOMPONENT_NOCARBONINSTANCES) && AUDIOCOMPONENT_NOCARBONINSTANCES) +#if TARGET_OS_IPHONE struct OpaqueAudioComponentInstance; typedef struct OpaqueAudioComponentInstance* AudioComponentInstance; #else @@ -113,6 +113,21 @@ virtual AEffect* getAEffectPtr() const noexcept = 0; }; + /** Can be used to retrieve information about a plugin that provides ARA extensions. */ + struct ARAClient + { + virtual ~ARAClient() = default; + virtual void createARAFactoryAsync (std::function) const = 0; + }; + + ExtensionsVisitor() = default; + + ExtensionsVisitor (const ExtensionsVisitor&) = default; + ExtensionsVisitor (ExtensionsVisitor&&) = default; + + ExtensionsVisitor& operator= (const ExtensionsVisitor&) = default; + ExtensionsVisitor& operator= (ExtensionsVisitor&&) = default; + virtual ~ExtensionsVisitor() = default; /** Will be called if there is no platform specific information available. */ @@ -126,6 +141,9 @@ /** Called with AU-specific information. */ virtual void visitAudioUnitClient (const AudioUnitClient&) {} + + /** Called with ARA-specific information. */ + virtual void visitARAClient (const ARAClient&) {} }; } // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_FlagCache.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_FlagCache.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_FlagCache.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_FlagCache.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,182 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#if ! DOXYGEN + +namespace juce +{ + +template +class FlagCache +{ + using FlagType = uint32_t; + +public: + FlagCache() = default; + + explicit FlagCache (size_t items) + : flags (divCeil (items, groupsPerWord)) + { + std::fill (flags.begin(), flags.end(), 0); + } + + void set (size_t index, FlagType bits) + { + const auto flagIndex = index / groupsPerWord; + jassert (flagIndex < flags.size()); + const auto groupIndex = index - (flagIndex * groupsPerWord); + flags[flagIndex].fetch_or (moveToGroupPosition (bits, groupIndex), std::memory_order_acq_rel); + } + + /* Calls the supplied callback for any entries with non-zero flags, and + sets all flags to zero. + */ + template + void ifSet (Callback&& callback) + { + for (size_t flagIndex = 0; flagIndex < flags.size(); ++flagIndex) + { + const auto prevFlags = flags[flagIndex].exchange (0, std::memory_order_acq_rel); + + for (size_t group = 0; group < groupsPerWord; ++group) + { + const auto masked = moveFromGroupPosition (prevFlags, group); + + if (masked != 0) + callback ((flagIndex * groupsPerWord) + group, masked); + } + } + } + + void clear() + { + std::fill (flags.begin(), flags.end(), 0); + } + +private: + /* Given the flags for a single item, and a group index, shifts the flags + so that they are positioned at the appropriate location for that group + index. + + e.g. If the flag type is a uint32_t, and there are 2 flags per item, + then each uint32_t will hold flags for 16 items. The flags for item 0 + are the least significant two bits; the flags for item 15 are the most + significant two bits. + */ + static constexpr FlagType moveToGroupPosition (FlagType ungrouped, size_t groupIndex) + { + return (ungrouped & groupMask) << (groupIndex * bitsPerFlagGroup); + } + + /* Given a set of grouped flags for multiple items, and a group index, + extracts the flags set for an item at that group index. + + e.g. If the flag type is a uint32_t, and there are 2 flags per item, + then each uint32_t will hold flags for 16 items. Asking for groupIndex + 0 will return the least significant two bits; asking for groupIndex 15 + will return the most significant two bits. + */ + static constexpr FlagType moveFromGroupPosition (FlagType grouped, size_t groupIndex) + { + return (grouped >> (groupIndex * bitsPerFlagGroup)) & groupMask; + } + + static constexpr size_t findNextPowerOfTwoImpl (size_t n, size_t shift) + { + return shift == 32 ? n : findNextPowerOfTwoImpl (n | (n >> shift), shift * 2); + } + + static constexpr size_t findNextPowerOfTwo (size_t value) + { + return findNextPowerOfTwoImpl (value - 1, 1) + 1; + } + + static constexpr size_t divCeil (size_t a, size_t b) + { + return (a / b) + ((a % b) != 0); + } + + static constexpr size_t bitsPerFlagGroup = findNextPowerOfTwo (requiredFlagBitsPerItem); + static constexpr size_t groupsPerWord = (8 * sizeof (FlagType)) / bitsPerFlagGroup; + static constexpr FlagType groupMask = ((FlagType) 1 << requiredFlagBitsPerItem) - 1; + + std::vector> flags; +}; + +template +class FlaggedFloatCache +{ +public: + FlaggedFloatCache() = default; + + explicit FlaggedFloatCache (size_t sizeIn) + : values (sizeIn), + flags (sizeIn) + { + std::fill (values.begin(), values.end(), 0.0f); + } + + size_t size() const noexcept { return values.size(); } + + void setValue (size_t index, float value) + { + jassert (index < size()); + values[index].store (value, std::memory_order_relaxed); + } + + void setBits (size_t index, uint32_t bits) { flags.set (index, bits); } + + void setValueAndBits (size_t index, float value, uint32_t bits) + { + setValue (index, value); + setBits (index, bits); + } + + float get (size_t index) const noexcept + { + jassert (index < size()); + return values[index].load (std::memory_order_relaxed); + } + + /* Calls the supplied callback for any entries which have been modified + since the last call to this function. + */ + template + void ifSet (Callback&& callback) + { + flags.ifSet ([this, &callback] (size_t groupIndex, uint32_t bits) + { + callback (groupIndex, values[groupIndex].load (std::memory_order_relaxed), bits); + }); + } + +private: + std::vector> values; + FlagCache flags; +}; + +} // namespace juce + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,66 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +namespace juce +{ + +static void removeScaleFactorListenerFromAllPeers (ComponentPeer::ScaleFactorListener& listener) +{ + for (int i = 0; i < ComponentPeer::getNumPeers(); ++i) + ComponentPeer::getPeer (i)->removeScaleFactorListener (&listener); +} + +NativeScaleFactorNotifier::NativeScaleFactorNotifier (Component* comp, std::function onScaleChanged) + : ComponentMovementWatcher (comp), + scaleChanged (std::move (onScaleChanged)) +{ + componentPeerChanged(); +} + +NativeScaleFactorNotifier::~NativeScaleFactorNotifier() +{ + removeScaleFactorListenerFromAllPeers (*this); +} + +void NativeScaleFactorNotifier::nativeScaleFactorChanged (double newScaleFactor) +{ + NullCheckedInvocation::invoke (scaleChanged, (float) newScaleFactor); +} + +void NativeScaleFactorNotifier::componentPeerChanged() +{ + removeScaleFactorListenerFromAllPeers (*this); + + if (auto* x = getComponent()) + peer = x->getPeer(); + + if (auto* x = peer) + { + x->addScaleFactorListener (this); + nativeScaleFactorChanged (x->getPlatformScaleFactor()); + } +} + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,67 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +namespace juce +{ + +/** + Calls a function every time the native scale factor of a component's peer changes. + + This is used in the VST and VST3 wrappers to ensure that the editor's scale is kept in sync with + the scale of its containing component. +*/ +class NativeScaleFactorNotifier : private ComponentMovementWatcher, + private ComponentPeer::ScaleFactorListener +{ +public: + /** Constructs an instance. + + While the instance is alive, it will listen for changes to the scale factor of the + comp's peer, and will call onScaleChanged whenever this scale factor changes. + + @param comp The component to observe + @param onScaleChanged A function that will be called when the backing scale factor changes + */ + NativeScaleFactorNotifier (Component* comp, std::function onScaleChanged); + ~NativeScaleFactorNotifier() override; + +private: + void nativeScaleFactorChanged (double newScaleFactor) override; + void componentPeerChanged() override; + + using ComponentMovementWatcher::componentVisibilityChanged; + void componentVisibilityChanged() override {} + + using ComponentMovementWatcher::componentMovedOrResized; + void componentMovedOrResized (bool, bool) override {} + + ComponentPeer* peer = nullptr; + std::function scaleChanged; + + JUCE_DECLARE_NON_COPYABLE (NativeScaleFactorNotifier) + JUCE_DECLARE_NON_MOVEABLE (NativeScaleFactorNotifier) +}; + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_ParameterAttachments.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_ParameterAttachments.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_ParameterAttachments.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_ParameterAttachments.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_PluginHostType.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_PluginHostType.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_PluginHostType.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_PluginHostType.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,14 +26,6 @@ namespace juce { -RangedAudioParameter::RangedAudioParameter (const String& parameterID, - const String& parameterName, - const String& parameterLabel, - Category parameterCategory) - : AudioProcessorParameterWithID (parameterID, parameterName, parameterLabel, parameterCategory) -{ -} - int RangedAudioParameter::getNumSteps() const { const auto& range = getNormalisableRange(); diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,6 +27,67 @@ { /** + @internal + + Holds common attributes of audio parameters. + + CRTP is used here because we want the Attributes types for each parameter + (Float, Bool, Choice, Int) to be distinct and extensible in the future. + i.e. the identifiers AudioParameterFloatAttributes and RangedAudioParameterAttributes + should not be interchangable because we might need to add float-specific attributes in + the future. Users should not refer directly to RangedAudioParameterAttributes. +*/ +template +class RangedAudioParameterAttributes +{ + using This = RangedAudioParameterAttributes; + +public: + using Category = AudioProcessorParameter::Category; + + using StringFromValue = std::function; + using ValueFromString = std::function; + + /** An optional lambda function that converts a non-normalised value to a string with a maximum length. This may be used by hosts to display the parameter's value. */ + JUCE_NODISCARD auto withStringFromValueFunction (StringFromValue x) const { return withMember (asDerived(), &Derived::stringFromValue, std::move (x)); } + + /** An optional lambda function that parses a string and converts it into a non-normalised value. Some hosts use this to allow users to type in parameter values. */ + JUCE_NODISCARD auto withValueFromStringFunction (ValueFromString x) const { return withMember (asDerived(), &Derived::valueFromString, std::move (x)); } + + /** See AudioProcessorParameterWithIDAttributes::withLabel() */ + JUCE_NODISCARD auto withLabel (String x) const { return withMember (asDerived(), &Derived::attributes, attributes.withLabel (std::move (x))); } + + /** See AudioProcessorParameterWithIDAttributes::withCategory() */ + JUCE_NODISCARD auto withCategory (Category x) const { return withMember (asDerived(), &Derived::attributes, attributes.withCategory (std::move (x))); } + + /** See AudioProcessorParameter::isMetaParameter() */ + JUCE_NODISCARD auto withMeta (bool x) const { return withMember (asDerived(), &Derived::attributes, attributes.withMeta (std::move (x))); } + + /** See AudioProcessorParameter::isAutomatable() */ + JUCE_NODISCARD auto withAutomatable (bool x) const { return withMember (asDerived(), &Derived::attributes, attributes.withAutomatable (std::move (x))); } + + /** See AudioProcessorParameter::isOrientationInverted() */ + JUCE_NODISCARD auto withInverted (bool x) const { return withMember (asDerived(), &Derived::attributes, attributes.withInverted (std::move (x))); } + + /** An optional lambda function that converts a non-normalised value to a string with a maximum length. This may be used by hosts to display the parameter's value. */ + JUCE_NODISCARD const auto& getStringFromValueFunction() const { return stringFromValue; } + + /** An optional lambda function that parses a string and converts it into a non-normalised value. Some hosts use this to allow users to type in parameter values. */ + JUCE_NODISCARD const auto& getValueFromStringFunction() const { return valueFromString; } + + /** Gets attributes that would also apply to an AudioProcessorParameterWithID */ + JUCE_NODISCARD const auto& getAudioProcessorParameterWithIDAttributes() const { return attributes; } + +private: + auto& asDerived() const { return *static_cast (this); } + + AudioProcessorParameterWithIDAttributes attributes; + StringFromValue stringFromValue; + ValueFromString valueFromString; +}; + +//============================================================================== +/** This abstract base class is used by some AudioProcessorParameter helper classes. @see AudioParameterFloat, AudioParameterInt, AudioParameterBool, AudioParameterChoice @@ -36,13 +97,7 @@ class JUCE_API RangedAudioParameter : public AudioProcessorParameterWithID { public: - /** The creation of this object requires providing a name and ID which will be - constant for its lifetime. - */ - RangedAudioParameter (const String& parameterID, - const String& parameterName, - const String& parameterLabel = {}, - Category parameterCategory = AudioProcessorParameter::genericParameter); + using AudioProcessorParameterWithID::AudioProcessorParameterWithID; /** Returns the range of values that the parameter can take. */ virtual const NormalisableRange& getNormalisableRange() const = 0; diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h --- juce-6.1.5~ds0/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h juce-7.0.0~ds0/modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h --- juce-6.1.5~ds0/modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp juce-7.0.0~ds0/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h juce-7.0.0~ds0/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h --- juce-6.1.5~ds0/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioAppComponent.h juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioAppComponent.h --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioAppComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioAppComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -1051,7 +1051,6 @@ deviceManager.addChangeListener (this); updateAllControls(); - startTimer (1000); } AudioDeviceSelectorComponent::~AudioDeviceSelectorComponent() @@ -1105,16 +1104,6 @@ setSize (getWidth(), r.getY()); } -void AudioDeviceSelectorComponent::timerCallback() -{ - // TODO - // unfortunately, the AudioDeviceManager only gives us changeListenerCallbacks - // if an audio device has changed, but not if a MIDI device has changed. - // This needs to be implemented properly. Until then, we use a workaround - // where we update the whole component once per second on a timer callback. - updateAllControls(); -} - void AudioDeviceSelectorComponent::updateDeviceType() { if (auto* type = deviceManager.getAvailableDeviceTypes() [deviceTypeDropDown->getSelectedId() - 1]) diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -38,8 +38,7 @@ @tags{Audio} */ class JUCE_API AudioDeviceSelectorComponent : public Component, - private ChangeListener, - private Timer + private ChangeListener { public: //============================================================================== @@ -92,7 +91,6 @@ private: //============================================================================== - void timerCallback() override; void handleBluetoothButton(); void updateDeviceType(); void updateMidiOutput(); diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnail.h juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnail.h --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnail.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioThumbnail.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h --- juce-6.1.5~ds0/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/juce_audio_utils.cpp juce-7.0.0~ds0/modules/juce_audio_utils/juce_audio_utils.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/juce_audio_utils.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/juce_audio_utils.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/juce_audio_utils.h juce-7.0.0~ds0/modules/juce_audio_utils/juce_audio_utils.h --- juce-6.1.5~ds0/modules/juce_audio_utils/juce_audio_utils.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/juce_audio_utils.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_audio_utils vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE extra audio utility classes description: Classes for audio-related GUI and miscellaneous tasks. website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/juce_audio_utils.mm juce-7.0.0~ds0/modules/juce_audio_utils/juce_audio_utils.mm --- juce-6.1.5~ds0/modules/juce_audio_utils/juce_audio_utils.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/juce_audio_utils.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm --- juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm --- juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm --- juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm --- juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,7 +27,7 @@ { //============================================================================== -class BluetoothMidiPairingWindowClass : public ObjCClass +class API_AVAILABLE (macos (10.11)) BluetoothMidiPairingWindowClass : public ObjCClass { public: struct Callbacks @@ -117,7 +117,7 @@ } }; -class BluetoothMidiSelectorWindowHelper : public DeletedAtShutdown +class API_AVAILABLE (macos (10.11)) BluetoothMidiSelectorWindowHelper : public DeletedAtShutdown { public: BluetoothMidiSelectorWindowHelper (ModalComponentManager::Callback* exitCallback, diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp juce-7.0.0~ds0/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -171,6 +171,8 @@ if (processor == processorToPlay) return; + sampleCount = 0; + if (processorToPlay != nullptr && sampleRate > 0 && blockSize > 0) { defaultProcessorChannels = NumChannels { processorToPlay->getBusesLayout() }; @@ -233,11 +235,12 @@ } //============================================================================== -void AudioProcessorPlayer::audioDeviceIOCallback (const float** const inputChannelData, - const int numInputChannels, - float** const outputChannelData, - const int numOutputChannels, - const int numSamples) +void AudioProcessorPlayer::audioDeviceIOCallbackWithContext (const float** const inputChannelData, + const int numInputChannels, + float** const outputChannelData, + const int numOutputChannels, + const int numSamples, + const AudioIODeviceCallbackContext& context) { const ScopedLock sl (lock); @@ -266,6 +269,49 @@ const ScopedLock sl2 (processor->getCallbackLock()); + class PlayHead : private AudioPlayHead + { + public: + PlayHead (AudioProcessor& proc, + Optional hostTimeIn, + uint64_t sampleCountIn, + double sampleRateIn) + : processor (proc), + hostTimeNs (hostTimeIn), + sampleCount (sampleCountIn), + seconds ((double) sampleCountIn / sampleRateIn) + { + processor.setPlayHead (this); + } + + ~PlayHead() override + { + processor.setPlayHead (nullptr); + } + + private: + Optional getPosition() const override + { + PositionInfo info; + info.setHostTimeNs (hostTimeNs); + info.setTimeInSamples ((int64_t) sampleCount); + info.setTimeInSeconds (seconds); + return info; + } + + AudioProcessor& processor; + Optional hostTimeNs; + uint64_t sampleCount; + double seconds; + }; + + PlayHead playHead { *processor, + context.hostTimeNs != nullptr ? makeOptional (*context.hostTimeNs) : nullopt, + sampleCount, + sampleRate }; + + sampleCount += (uint64_t) numSamples; + if (! processor->isSuspended()) { if (processor->isUsingDoublePrecision()) diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h juce-7.0.0~ds0/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h --- juce-6.1.5~ds0/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -92,7 +92,7 @@ //============================================================================== /** @internal */ - void audioDeviceIOCallback (const float**, int, float**, int, int) override; + void audioDeviceIOCallbackWithContext (const float**, int, float**, int, int, const AudioIODeviceCallbackContext&) override; /** @internal */ void audioDeviceAboutToStart (AudioIODevice*) override; /** @internal */ @@ -137,6 +137,7 @@ MidiBuffer incomingMidi; MidiMessageCollector messageCollector; MidiOutput* midiOutput = nullptr; + uint64_t sampleCount = 0; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorPlayer) }; diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/players/juce_SoundPlayer.cpp juce-7.0.0~ds0/modules/juce_audio_utils/players/juce_SoundPlayer.cpp --- juce-6.1.5~ds0/modules/juce_audio_utils/players/juce_SoundPlayer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/players/juce_SoundPlayer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_audio_utils/players/juce_SoundPlayer.h juce-7.0.0~ds0/modules/juce_audio_utils/players/juce_SoundPlayer.h --- juce-6.1.5~ds0/modules/juce_audio_utils/players/juce_SoundPlayer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_audio_utils/players/juce_SoundPlayer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_box2d/juce_box2d.cpp juce-7.0.0~ds0/modules/juce_box2d/juce_box2d.cpp --- juce-6.1.5~ds0/modules/juce_box2d/juce_box2d.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_box2d/juce_box2d.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -42,7 +42,8 @@ "-Wswitch-enum", "-Wswitch-default", "-Wunused-but-set-variable", - "-Wzero-as-null-pointer-constant") + "-Wzero-as-null-pointer-constant", + "-Wmaybe-uninitialized") #include diff -Nru juce-6.1.5~ds0/modules/juce_box2d/juce_box2d.h juce-7.0.0~ds0/modules/juce_box2d/juce_box2d.h --- juce-6.1.5~ds0/modules/juce_box2d/juce_box2d.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_box2d/juce_box2d.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_box2d vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE wrapper for the Box2D physics engine description: The Box2D physics engine and some utility classes. website: http://www.juce.com/juce @@ -58,7 +58,9 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wconversion", "-Wshadow-field", "-Wzero-as-null-pointer-constant", - "-Wsign-conversion") + "-Wsign-conversion", + "-Wdeprecated", + "-Wmaybe-uninitialized") #include #include diff -Nru juce-6.1.5~ds0/modules/juce_box2d/utils/juce_Box2DRenderer.cpp juce-7.0.0~ds0/modules/juce_box2d/utils/juce_Box2DRenderer.cpp --- juce-6.1.5~ds0/modules/juce_box2d/utils/juce_Box2DRenderer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_box2d/utils/juce_Box2DRenderer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_box2d/utils/juce_Box2DRenderer.h juce-7.0.0~ds0/modules/juce_box2d/utils/juce_Box2DRenderer.h --- juce-6.1.5~ds0/modules/juce_box2d/utils/juce_Box2DRenderer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_box2d/utils/juce_Box2DRenderer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_AbstractFifo.cpp juce-7.0.0~ds0/modules/juce_core/containers/juce_AbstractFifo.cpp --- juce-6.1.5~ds0/modules/juce_core/containers/juce_AbstractFifo.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_AbstractFifo.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_AbstractFifo.h juce-7.0.0~ds0/modules/juce_core/containers/juce_AbstractFifo.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_AbstractFifo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_AbstractFifo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_ArrayAllocationBase.h juce-7.0.0~ds0/modules/juce_core/containers/juce_ArrayAllocationBase.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_ArrayAllocationBase.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_ArrayAllocationBase.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_ArrayBase.cpp juce-7.0.0~ds0/modules/juce_core/containers/juce_ArrayBase.cpp --- juce-6.1.5~ds0/modules/juce_core/containers/juce_ArrayBase.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_ArrayBase.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_ArrayBase.h juce-7.0.0~ds0/modules/juce_core/containers/juce_ArrayBase.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_ArrayBase.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_ArrayBase.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_Array.h juce-7.0.0~ds0/modules/juce_core/containers/juce_Array.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_Array.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_Array.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -829,9 +829,10 @@ If the item isn't found, no action is taken. @param valueToRemove the object to try to remove + @returns the index of the removed item, or -1 if the item isn't found @see remove, removeRange, removeIf */ - void removeFirstMatchingValue (ParameterType valueToRemove) + int removeFirstMatchingValue (ParameterType valueToRemove) { const ScopedLockType lock (getLock()); auto* e = values.begin(); @@ -841,9 +842,11 @@ if (valueToRemove == e[i]) { removeInternal (i); - break; + return i; } } + + return -1; } /** Removes items from the array. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_DynamicObject.cpp juce-7.0.0~ds0/modules/juce_core/containers/juce_DynamicObject.cpp --- juce-6.1.5~ds0/modules/juce_core/containers/juce_DynamicObject.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_DynamicObject.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_DynamicObject.h juce-7.0.0~ds0/modules/juce_core/containers/juce_DynamicObject.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_DynamicObject.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_DynamicObject.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_ElementComparator.h juce-7.0.0~ds0/modules/juce_core/containers/juce_ElementComparator.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_ElementComparator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_ElementComparator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -35,12 +35,14 @@ struct SortFunctionConverter { SortFunctionConverter (ElementComparator& e) : comparator (e) {} + SortFunctionConverter (const SortFunctionConverter&) = default; template bool operator() (Type a, Type b) { return comparator.compareElements (a, b) < 0; } private: ElementComparator& comparator; + SortFunctionConverter& operator= (const SortFunctionConverter&) = delete; }; diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_HashMap.h juce-7.0.0~ds0/modules/juce_core/containers/juce_HashMap.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_HashMap.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_HashMap.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_HashMap_test.cpp juce-7.0.0~ds0/modules/juce_core/containers/juce_HashMap_test.cpp --- juce-6.1.5~ds0/modules/juce_core/containers/juce_HashMap_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_HashMap_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_LinkedListPointer.h juce-7.0.0~ds0/modules/juce_core/containers/juce_LinkedListPointer.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_LinkedListPointer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_LinkedListPointer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_ListenerList.cpp juce-7.0.0~ds0/modules/juce_core/containers/juce_ListenerList.cpp --- juce-6.1.5~ds0/modules/juce_core/containers/juce_ListenerList.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_ListenerList.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,321 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +#if JUCE_UNIT_TESTS + +class ListenerListTests : public UnitTest +{ +public: + //============================================================================== + class TestListener + { + public: + explicit TestListener (std::function cb) : callback (std::move (cb)) {} + + void doCallback() + { + ++numCalls; + callback(); + } + + int getNumCalls() const { return numCalls; } + + private: + int numCalls = 0; + std::function callback; + }; + + class TestObject + { + public: + void addListener (std::function cb) + { + listeners.push_back (std::make_unique (std::move (cb))); + listenerList.add (listeners.back().get()); + } + + void removeListener (int i) { listenerList.remove (listeners[(size_t) i].get()); } + + void callListeners() + { + ++callLevel; + listenerList.call ([] (auto& l) { l.doCallback(); }); + --callLevel; + } + + int getNumListeners() const { return (int) listeners.size(); } + + auto& getListener (int i) { return *listeners[(size_t) i]; } + + int getCallLevel() const + { + return callLevel; + } + + bool wereAllNonRemovedListenersCalled (int numCalls) const + { + return std::all_of (std::begin (listeners), + std::end (listeners), + [&] (auto& listener) + { + return (! listenerList.contains (listener.get())) || listener->getNumCalls() == numCalls; + }); + } + + private: + std::vector> listeners; + ListenerList listenerList; + int callLevel = 0; + }; + + //============================================================================== + ListenerListTests() : UnitTest ("ListenerList", UnitTestCategories::containers) {} + + void runTest() override + { + // This is a test that the pre-iterator adjustment implementation should pass too + beginTest ("All non-removed listeners should be called - removing an already called listener"); + { + TestObject test; + + for (int i = 0; i < 20; ++i) + { + test.addListener ([i, &test] + { + if (i == 5) + test.removeListener (6); + }); + } + + test.callListeners(); + expect (test.wereAllNonRemovedListenersCalled (1)); + } + + // Iterator adjustment is necessary for passing this + beginTest ("All non-removed listeners should be called - removing a yet uncalled listener"); + { + TestObject test; + + for (int i = 0; i < 20; ++i) + { + test.addListener ([i, &test] + { + if (i == 5) + test.removeListener (4); + }); + } + + test.callListeners(); + expect (test.wereAllNonRemovedListenersCalled (1)); + } + + // This test case demonstrates why we have to call --it.index instead of it.next() + beginTest ("All non-removed listeners should be called - one callback removes multiple listeners"); + { + TestObject test; + + for (int i = 0; i < 20; ++i) + { + test.addListener ([i, &test] + { + if (i == 19) + { + test.removeListener (19); + test.removeListener (0); + } + }); + } + + test.callListeners(); + expect (test.wereAllNonRemovedListenersCalled (1)); + } + + beginTest ("All non-removed listeners should be called - removing listeners randomly"); + { + auto random = getRandom(); + + for (auto run = 0; run < 10; ++run) + { + const auto numListeners = random.nextInt ({ 10, 100 }); + const auto listenersThatRemoveListeners = chooseUnique (random, + numListeners, + random.nextInt ({ 0, numListeners / 2 })); + + // The listener in position [key] should remove listeners in [value] + std::map> removals; + + for (auto i : listenersThatRemoveListeners) + { + // Random::nextInt ({1, 1}); triggers an assertion + removals[i] = chooseUnique (random, + numListeners, + random.nextInt ({ 1, std::max (2, numListeners / 10) })); + } + + TestObject test; + + for (int i = 0; i < numListeners; ++i) + { + test.addListener ([i, &removals, &test] + { + const auto iter = removals.find (i); + + if (iter == removals.end()) + return; + + for (auto j : iter->second) + { + test.removeListener (j); + } + }); + } + + test.callListeners(); + expect (test.wereAllNonRemovedListenersCalled (1)); + } + } + + // Iterator adjustment is not necessary for passing this + beginTest ("All non-removed listeners should be called - add listener during iteration"); + { + TestObject test; + const auto numStartingListeners = 20; + + for (int i = 0; i < numStartingListeners; ++i) + { + test.addListener ([i, &test] + { + if (i == 5 || i == 6) + test.addListener ([] {}); + }); + } + + test.callListeners(); + + // Only the Listeners added before the test can be expected to have been called + bool success = true; + + for (int i = 0; i < numStartingListeners; ++i) + success = success && test.getListener (i).getNumCalls() == 1; + + // Listeners added during the iteration must not be called in that iteration + for (int i = numStartingListeners; i < test.getNumListeners(); ++i) + success = success && test.getListener (i).getNumCalls() == 0; + + expect (success); + } + + beginTest ("All non-removed listeners should be called - nested ListenerList::call()"); + { + TestObject test; + + for (int i = 0; i < 20; ++i) + { + test.addListener ([i, &test] + { + const auto callLevel = test.getCallLevel(); + + if (i == 6 && callLevel == 1) + { + test.callListeners(); + } + + if (i == 5) + { + if (callLevel == 1) + test.removeListener (4); + else if (callLevel == 2) + test.removeListener (6); + } + }); + } + + test.callListeners(); + expect (test.wereAllNonRemovedListenersCalled (2)); + } + + beginTest ("All non-removed listeners should be called - random ListenerList::call()"); + { + const auto numListeners = 20; + auto random = getRandom(); + + for (int run = 0; run < 10; ++run) + { + TestObject test; + auto numCalls = 0; + + auto listenersToRemove = chooseUnique (random, numListeners, numListeners / 2); + + for (int i = 0; i < numListeners; ++i) + { + // Capturing numListeners is a warning on MacOS, not capturing it is an error on Windows + test.addListener ([&] + { + const auto callLevel = test.getCallLevel(); + + if (callLevel < 4 && random.nextFloat() < 0.05f) + { + ++numCalls; + test.callListeners(); + } + + if (random.nextFloat() < 0.5f) + { + const auto listenerToRemove = random.nextInt ({ 0, numListeners }); + + if (listenersToRemove.erase (listenerToRemove) > 0) + test.removeListener (listenerToRemove); + } + }); + } + + while (listenersToRemove.size() > 0) + { + test.callListeners(); + ++numCalls; + } + + expect (test.wereAllNonRemovedListenersCalled (numCalls)); + } + } + } + +private: + static std::set chooseUnique (Random& random, int max, int numChosen) + { + std::set result; + + while ((int) result.size() < numChosen) + result.insert (random.nextInt ({ 0, max })); + + return result; + } +}; + +static ListenerListTests listenerListTests; + +#endif + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_ListenerList.h juce-7.0.0~ds0/modules/juce_core/containers/juce_ListenerList.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_ListenerList.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_ListenerList.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -47,10 +47,11 @@ listeners.call ([] (MyListenerType& l) { l.myCallbackMethod (1234, true); }); @endcode - If you add or remove listeners from the list during one of the callbacks - i.e. while - it's in the middle of iterating the listeners, then it's guaranteed that no listeners - will be mistakenly called after they've been removed, but it may mean that some of the - listeners could be called more than once, or not at all, depending on the list's order. + It is guaranteed that every Listener is called during an iteration if it's inside the + ListenerList before the iteration starts and isn't removed until its end. This guarantee + holds even if some Listeners are removed or new ones are added during the iteration. + + Listeners added during an iteration are guaranteed to be not called in that iteration. Sometimes, there's a chance that invoking one of the callbacks might result in the list itself being deleted while it's still iterating - to survive this situation, you can @@ -73,7 +74,13 @@ ListenerList() = default; /** Destructor. */ - ~ListenerList() = default; + ~ListenerList() + { + WrappedIterator::forEach (activeIterators, [&] (auto& iter) + { + iter.invalidate(); + }); + } //============================================================================== /** Adds a listener to the list. @@ -95,7 +102,16 @@ void remove (ListenerClass* listenerToRemove) { jassert (listenerToRemove != nullptr); // Listeners can't be null pointers! - listeners.removeFirstMatchingValue (listenerToRemove); + + typename ArrayType::ScopedLockType lock (listeners.getLock()); + + const auto index = listeners.removeFirstMatchingValue (listenerToRemove); + + WrappedIterator::forEach (activeIterators, [&] (auto& iter) + { + if (0 <= index && index < iter.get().index) + --iter.get().index; + }); } /** Returns the number of registered listeners. */ @@ -120,8 +136,8 @@ { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next();) - callback (*iter.getListener()); + for (WrappedIterator iter (*this, activeIterators); iter.get().next();) + callback (*iter.get().getListener()); } /** Calls a member function with 1 parameter, on all but the specified listener in the list. @@ -132,9 +148,9 @@ { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next();) + for (WrappedIterator iter (*this, activeIterators); iter.get().next();) { - auto* l = iter.getListener(); + auto* l = iter.get().getListener(); if (l != listenerToExclude) callback (*l); @@ -149,8 +165,10 @@ { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next (bailOutChecker);) - callback (*iter.getListener()); + for (WrappedIterator iter (*this, activeIterators); iter.get().next (bailOutChecker);) + { + callback (*iter.get().getListener()); + } } /** Calls a member function, with 1 parameter, on all but the specified listener in the list @@ -164,9 +182,9 @@ { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next (bailOutChecker);) + for (WrappedIterator iter (*this, activeIterators); iter.get().next (bailOutChecker);) { - auto* l = iter.getListener(); + auto* l = iter.get().getListener(); if (l != listenerToExclude) callback (*l); @@ -187,15 +205,12 @@ //============================================================================== /** Iterates the listeners in a ListenerList. */ - template struct Iterator { - Iterator (const ListType& listToIterate) noexcept + explicit Iterator (const ListenerList& listToIterate) noexcept : list (listToIterate), index (listToIterate.size()) {} - ~Iterator() = default; - //============================================================================== bool next() noexcept { @@ -211,28 +226,28 @@ return index >= 0; } + template bool next (const BailOutCheckerType& bailOutChecker) noexcept { return (! bailOutChecker.shouldBailOut()) && next(); } - typename ListType::ListenerType* getListener() const noexcept + ListenerClass* getListener() const noexcept { return list.getListeners().getUnchecked (index); } - //============================================================================== private: - const ListType& list; + const ListenerList& list; int index; + friend ListenerList; + JUCE_DECLARE_NON_COPYABLE (Iterator) }; //============================================================================== #ifndef DOXYGEN - // There are now lambda-based call functions that can be used to replace these old method-based versions. - // We'll eventually deprecate these old ones, so please begin moving your code to use lambdas! void call (void (ListenerClass::*callbackFunction) ()) { call ([=] (ListenerClass& l) { (l.*callbackFunction)(); }); @@ -262,7 +277,7 @@ { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next();) + for (Iterator iter (*this); iter.next();) (iter.getListener()->*callbackFunction) (static_cast::type> (args)...); } @@ -273,7 +288,7 @@ { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next();) + for (Iterator iter (*this); iter.next();) if (iter.getListener() != listenerToExclude) (iter.getListener()->*callbackFunction) (static_cast::type> (args)...); } @@ -285,7 +300,7 @@ { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next (bailOutChecker);) + for (Iterator iter (*this); iter.next (bailOutChecker);) (iter.getListener()->*callbackFunction) (static_cast::type> (args)...); } @@ -297,15 +312,49 @@ { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next (bailOutChecker);) + for (Iterator iter (*this); iter.next (bailOutChecker);) if (iter.getListener() != listenerToExclude) (iter.getListener()->*callbackFunction) (static_cast::type> (args)...); } #endif private: + class WrappedIterator + { + public: + WrappedIterator (const ListenerList& listToIterate, WrappedIterator*& listHeadIn) + : it (listToIterate), listHead (listHeadIn), next (listHead) + { + listHead = this; + } + + ~WrappedIterator() + { + if (valid) + listHead = next; + } + + auto& get() noexcept { return it; } + + template + static void forEach (WrappedIterator* wrapped, Callback&& cb) + { + for (auto* p = wrapped; p != nullptr; p = p->next) + cb (*p); + } + + void invalidate() noexcept { valid = false; } + + private: + Iterator it; + WrappedIterator*& listHead; + WrappedIterator* next = nullptr; + bool valid = true; + }; + //============================================================================== ArrayType listeners; + WrappedIterator* activeIterators = nullptr; JUCE_DECLARE_NON_COPYABLE (ListenerList) }; diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_NamedValueSet.cpp juce-7.0.0~ds0/modules/juce_core/containers/juce_NamedValueSet.cpp --- juce-6.1.5~ds0/modules/juce_core/containers/juce_NamedValueSet.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_NamedValueSet.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_NamedValueSet.h juce-7.0.0~ds0/modules/juce_core/containers/juce_NamedValueSet.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_NamedValueSet.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_NamedValueSet.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_Optional.h juce-7.0.0~ds0/modules/juce_core/containers/juce_Optional.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_Optional.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_Optional.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,401 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +namespace detail +{ +namespace adlSwap +{ +using std::swap; + +template +constexpr auto isNothrowSwappable = noexcept (swap (std::declval(), std::declval())); +} // namespace adlSwap +} // namespace detail + +/** A type representing the null state of an Optional. + Similar to std::nullopt_t. +*/ +struct Nullopt +{ + explicit constexpr Nullopt (int) {} +}; + +/** An object that can be used when constructing and comparing Optional instances. + Similar to std::nullopt. +*/ +constexpr Nullopt nullopt { 0 }; + +// Without this, our tests can emit "unreachable code" warnings during +// link time code generation. +JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4702) + +/** + A simple optional type. + + Has similar (not necessarily identical!) semantics to std::optional. + + This is intended to stand-in for std::optional while JUCE's minimum + supported language standard is lower than C++17. When the minimum language + standard moves to C++17, this class will probably be deprecated, in much + the same way that juce::ScopedPointer was deprecated in favour of + std::unique_ptr after C++11. + + This isn't really intended to be used by JUCE clients. Instead, it's to be + used internally in JUCE code, with an API close-enough to std::optional + that the types can be swapped with fairly minor disruption at some point in + the future, but *without breaking any public APIs*. + + @tags{Core} +*/ +template +class Optional +{ + template + struct NotConstructibleFromSimilarType + { + static constexpr auto value = ! std::is_constructible&>::value + && ! std::is_constructible&>::value + && ! std::is_constructible&&>::value + && ! std::is_constructible&&>::value + && ! std::is_convertible&, T>::value + && ! std::is_convertible&, T>::value + && ! std::is_convertible&&, T>::value + && ! std::is_convertible&&, T>::value; + }; + + template + using OptionalCopyConstructorEnabled = std::enable_if_t::value && NotConstructibleFromSimilarType::value>; + + template + using OptionalMoveConstructorEnabled = std::enable_if_t::value && NotConstructibleFromSimilarType::value>; + + template + static auto notAssignableFromSimilarType = NotConstructibleFromSimilarType::value + && ! std::is_assignable&>::value + && ! std::is_assignable&>::value + && ! std::is_assignable&&>::value + && ! std::is_assignable&&>::value; + + template + using OptionalCopyAssignmentEnabled = std::enable_if_t::value + && std::is_assignable::value + && NotConstructibleFromSimilarType::value>; + + template + using OptionalMoveAssignmentEnabled = std::enable_if_t::value + && std::is_nothrow_assignable::value + && NotConstructibleFromSimilarType::value>; + +public: + Optional() : placeholder() {} + + Optional (Nullopt) noexcept : placeholder() {} + + template ::value + && ! std::is_same, Optional>::value>> + Optional (U&& value) noexcept (noexcept (Value (std::forward (value)))) + : storage (std::forward (value)), valid (true) + { + } + + Optional (Optional&& other) noexcept (noexcept (std::declval().constructFrom (other))) + : placeholder() + { + constructFrom (other); + } + + Optional (const Optional& other) + : placeholder(), valid (other.valid) + { + if (valid) + new (&storage) Value (*other); + } + + template > + Optional (Optional&& other) noexcept (noexcept (std::declval().constructFrom (other))) + : placeholder() + { + constructFrom (other); + } + + template > + Optional (const Optional& other) + : placeholder(), valid (other.hasValue()) + { + if (valid) + new (&storage) Value (*other); + } + + Optional& operator= (Nullopt) noexcept + { + reset(); + return *this; + } + + template ::value + && std::is_nothrow_move_assignable::value>> + Optional& operator= (Optional&& other) noexcept (noexcept (std::declval().assign (std::declval()))) + { + assign (other); + return *this; + } + + template , Optional>::value + && std::is_constructible::value + && std::is_assignable::value + && (! std::is_scalar::value || ! std::is_same, Value>::value)>> + Optional& operator= (U&& value) + { + if (valid) + **this = std::forward (value); + else + new (&storage) Value (std::forward (value)); + + valid = true; + return *this; + } + + /** Maintains the strong exception safety guarantee. */ + Optional& operator= (const Optional& other) + { + auto copy = other; + assign (copy); + return *this; + } + + template > + Optional& operator= (Optional&& other) noexcept (noexcept (std::declval().assign (other))) + { + assign (other); + return *this; + } + + /** Maintains the strong exception safety guarantee. */ + template > + Optional& operator= (const Optional& other) + { + auto copy = other; + assign (copy); + return *this; + } + + ~Optional() noexcept + { + reset(); + } + + Value* operator->() noexcept { return reinterpret_cast< Value*> (&storage); } + const Value* operator->() const noexcept { return reinterpret_cast (&storage); } + + Value& operator*() noexcept { return *operator->(); } + const Value& operator*() const noexcept { return *operator->(); } + + explicit operator bool() const noexcept { return valid; } + bool hasValue() const noexcept { return valid; } + + void reset() + { + if (std::exchange (valid, false)) + operator*().~Value(); + } + + /** Like std::optional::value_or */ + template + Value orFallback (U&& fallback) const { return *this ? **this : std::forward (fallback); } + + template + Value& emplace (Args&&... args) + { + reset(); + new (&storage) Value (std::forward (args)...); + valid = true; + return **this; + } + + void swap (Optional& other) noexcept (std::is_nothrow_move_constructible::value + && detail::adlSwap::isNothrowSwappable) + { + if (hasValue() && other.hasValue()) + { + using std::swap; + swap (**this, *other); + } + else if (hasValue() || other.hasValue()) + { + (hasValue() ? other : *this).constructFrom (hasValue() ? *this : other); + } + } + +private: + template + void constructFrom (Optional& other) noexcept (noexcept (Value (std::move (*other)))) + { + if (! other.hasValue()) + return; + + new (&storage) Value (std::move (*other)); + valid = true; + other.reset(); + } + + template + void assign (Optional& other) noexcept (noexcept (std::declval() = std::move (*other)) && noexcept (std::declval().constructFrom (other))) + { + if (valid) + { + if (other.hasValue()) + { + **this = std::move (*other); + other.reset(); + } + else + { + reset(); + } + } + else + { + constructFrom (other); + } + } + + union + { + char placeholder; + Value storage; + }; + bool valid = false; +}; + +JUCE_END_IGNORE_WARNINGS_MSVC + +template +Optional> makeOptional (Value&& v) +{ + return std::forward (v); +} + +template +bool operator== (const Optional& lhs, const Optional& rhs) +{ + if (lhs.hasValue() != rhs.hasValue()) return false; + if (! lhs.hasValue()) return true; + return *lhs == *rhs; +} + +template +bool operator!= (const Optional& lhs, const Optional& rhs) +{ + if (lhs.hasValue() != rhs.hasValue()) return true; + if (! lhs.hasValue()) return false; + return *lhs != *rhs; +} + +template +bool operator< (const Optional& lhs, const Optional& rhs) +{ + if (! rhs.hasValue()) return false; + if (! lhs.hasValue()) return true; + return *lhs < *rhs; +} + +template +bool operator<= (const Optional& lhs, const Optional& rhs) +{ + if (! lhs.hasValue()) return true; + if (! rhs.hasValue()) return false; + return *lhs <= *rhs; +} + +template +bool operator> (const Optional& lhs, const Optional& rhs) +{ + if (! lhs.hasValue()) return false; + if (! rhs.hasValue()) return true; + return *lhs > *rhs; +} + +template +bool operator>= (const Optional& lhs, const Optional& rhs) +{ + if (! rhs.hasValue()) return true; + if (! lhs.hasValue()) return false; + return *lhs >= *rhs; +} + +template +bool operator== (const Optional& opt, Nullopt) noexcept { return ! opt.hasValue(); } +template +bool operator== (Nullopt, const Optional& opt) noexcept { return ! opt.hasValue(); } +template +bool operator!= (const Optional& opt, Nullopt) noexcept { return opt.hasValue(); } +template +bool operator!= (Nullopt, const Optional& opt) noexcept { return opt.hasValue(); } +template +bool operator< (const Optional&, Nullopt) noexcept { return false; } +template +bool operator< (Nullopt, const Optional& opt) noexcept { return opt.hasValue(); } +template +bool operator<= (const Optional& opt, Nullopt) noexcept { return ! opt.hasValue(); } +template +bool operator<= (Nullopt, const Optional&) noexcept { return true; } +template +bool operator> (const Optional& opt, Nullopt) noexcept { return opt.hasValue(); } +template +bool operator> (Nullopt, const Optional&) noexcept { return false; } +template +bool operator>= (const Optional&, Nullopt) noexcept { return true; } +template +bool operator>= (Nullopt, const Optional& opt) noexcept { return ! opt.hasValue(); } + +template +bool operator== (const Optional& opt, const U& value) { return opt.hasValue() ? *opt == value : false; } +template +bool operator== (const T& value, const Optional& opt) { return opt.hasValue() ? value == *opt : false; } +template +bool operator!= (const Optional& opt, const U& value) { return opt.hasValue() ? *opt != value : true; } +template +bool operator!= (const T& value, const Optional& opt) { return opt.hasValue() ? value != *opt : true; } +template +bool operator< (const Optional& opt, const U& value) { return opt.hasValue() ? *opt < value : true; } +template +bool operator< (const T& value, const Optional& opt) { return opt.hasValue() ? value < *opt : false; } +template +bool operator<= (const Optional& opt, const U& value) { return opt.hasValue() ? *opt <= value : true; } +template +bool operator<= (const T& value, const Optional& opt) { return opt.hasValue() ? value <= *opt : false; } +template +bool operator> (const Optional& opt, const U& value) { return opt.hasValue() ? *opt > value : false; } +template +bool operator> (const T& value, const Optional& opt) { return opt.hasValue() ? value > *opt : true; } +template +bool operator>= (const Optional& opt, const U& value) { return opt.hasValue() ? *opt >= value : false; } +template +bool operator>= (const T& value, const Optional& opt) { return opt.hasValue() ? value >= *opt : true; } + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_Optional_test.cpp juce-7.0.0~ds0/modules/juce_core/containers/juce_Optional_test.cpp --- juce-6.1.5~ds0/modules/juce_core/containers/juce_Optional_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_Optional_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,627 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +/* Not nested, so that ADL works for the swap function. */ +struct ThrowOnMoveOrSwap +{ + ThrowOnMoveOrSwap() = default; + ThrowOnMoveOrSwap (ThrowOnMoveOrSwap&&) { throw std::bad_alloc{}; } +}; +static void swap (ThrowOnMoveOrSwap&, ThrowOnMoveOrSwap&) { throw std::bad_alloc{}; } + +class OptionalUnitTest : public UnitTest +{ +public: + OptionalUnitTest() : UnitTest ("Optional", UnitTestCategories::containers) {} + + void runTest() override + { + beginTest ("Default-constructed optional is invalid"); + { + Optional o; + expect (! o.hasValue()); + } + + beginTest ("Constructing from Nullopt is invalid"); + { + Optional o (nullopt); + expect (! o.hasValue()); + } + + beginTest ("Optional constructed from value is valid"); + { + Optional o = 5; + expect (o.hasValue()); + expectEquals (*o, 5); + } + + using Ptr = std::shared_ptr; + const auto makePtr = [] { return std::make_shared(); }; + + beginTest ("Constructing from a moved optional calls appropriate member functions"); + { + auto ptr = makePtr(); + Optional original (ptr); + expect (ptr.use_count() == 2); + auto other = std::move (original); + expect (! original.hasValue()); + expect (other.hasValue()); + expect (ptr.use_count() == 2); + } + + beginTest ("Moving an empty optional to a populated one destroys the instance"); + { + auto ptr = makePtr(); + Optional original (ptr); + expect (ptr.use_count() == 2); + original = Optional(); + expect (ptr.use_count() == 1); + } + + beginTest ("Copying an empty optional to a populated one destroys the instance"); + { + auto ptr = makePtr(); + Optional original (ptr); + expect (ptr.use_count() == 2); + Optional empty; + original = empty; + expect (ptr.use_count() == 1); + } + + beginTest ("Moving a populated optional calls appropriate member functions"); + { + auto a = makePtr(); + auto b = makePtr(); + + Optional aOpt (a); + Optional bOpt (b); + + expect (a.use_count() == 2); + expect (b.use_count() == 2); + + aOpt = std::move (bOpt); + + expect (aOpt.hasValue()); + expect (! bOpt.hasValue()); + + expect (a.use_count() == 1); + expect (b.use_count() == 2); + } + + beginTest ("Copying a populated optional calls appropriate member functions"); + { + auto a = makePtr(); + auto b = makePtr(); + + Optional aOpt (a); + Optional bOpt (b); + + expect (a.use_count() == 2); + expect (b.use_count() == 2); + + aOpt = bOpt; + + expect (aOpt.hasValue()); + expect (bOpt.hasValue()); + + expect (a.use_count() == 1); + expect (b.use_count() == 3); + } + + beginTest ("Moving an empty optional to an empty one does nothing"); + { + Optional original; + original = Optional(); + expect (! original.hasValue()); + } + + beginTest ("Copying an empty optional to an empty one does nothing"); + { + Optional original; + Optional empty; + original = empty; + expect (! original.hasValue()); + expect (! empty.hasValue()); + } + + beginTest ("Moving a populated optional calls appropriate member functions"); + { + auto a = makePtr(); + + Optional aOpt (a); + Optional empty; + + expect (a.use_count() == 2); + + empty = std::move (aOpt); + + expect (empty.hasValue()); + expect (! aOpt.hasValue()); + + expect (a.use_count() == 2); + } + + beginTest ("Copying a populated optional calls appropriate member functions"); + { + auto a = makePtr(); + + Optional aOpt (a); + Optional empty; + + expect (a.use_count() == 2); + + empty = aOpt; + + expect (aOpt.hasValue()); + expect (empty.hasValue()); + + expect (a.use_count() == 3); + } + + struct ThrowOnCopy + { + ThrowOnCopy() = default; + + // Put into an invalid state and throw + ThrowOnCopy (const ThrowOnCopy&) + { + value = -100; + throw std::bad_alloc{}; + } + + // Put into an invalid state and throw + ThrowOnCopy& operator= (const ThrowOnCopy&) + { + value = -100; + throw std::bad_alloc{}; + } + + ThrowOnCopy (ThrowOnCopy&&) noexcept = default; + ThrowOnCopy& operator= (ThrowOnCopy&&) noexcept = default; + + ~ThrowOnCopy() = default; + + int value = 0; + }; + + beginTest ("Strong exception safety is maintained when forwarding over empty object"); + { + bool threw = false; + Optional a; + + try + { + ThrowOnCopy t; + a = t; + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (! a.hasValue()); // If construction failed, this object should still be well-formed but empty + } + + beginTest ("Weak exception safety is maintained when forwarding over populated object"); + { + bool threw = false; + Optional a = ThrowOnCopy(); + a->value = 5; + + try + { + ThrowOnCopy t; + a = t; + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (a.hasValue()); + expect (a->value == -100); // If we assign to an extant object, it's up to that object to provide an exception guarantee + } + + beginTest ("Strong exception safety is maintained when copying over empty object"); + { + bool threw = false; + Optional a; + + try + { + Optional t = ThrowOnCopy{}; + a = t; + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (! a.hasValue()); + } + + beginTest ("Strong exception safety is maintained when copying over populated object"); + { + bool threw = false; + Optional a = ThrowOnCopy(); + a->value = 5; + + try + { + Optional t = ThrowOnCopy{}; + a = t; + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (a.hasValue()); + expect (a->value == 5); + } + + beginTest ("Assigning from nullopt clears the instance"); + { + auto ptr = makePtr(); + Optional a (ptr); + expect (ptr.use_count() == 2); + a = nullopt; + expect (ptr.use_count() == 1); + } + + struct Foo {}; + struct Bar : Foo {}; + + beginTest ("Can be constructed from compatible type"); + { + Optional> opt { std::make_shared() }; + } + + beginTest ("Can be assigned from compatible type"); + { + Optional> opt; + opt = std::make_shared(); + } + + beginTest ("Can copy from compatible type"); + { + auto ptr = std::make_shared(); + Optional> bar (ptr); + Optional> foo (bar); + expect (ptr.use_count() == 3); + } + + beginTest ("Can move from compatible type"); + { + auto ptr = std::make_shared(); + Optional> foo (Optional> { ptr }); + expect (ptr.use_count() == 2); + } + + beginTest ("Can copy assign from compatible type"); + { + auto ptr = std::make_shared(); + Optional> bar (ptr); + Optional> foo; + foo = bar; + expect (ptr.use_count() == 3); + } + + beginTest ("Can move assign from compatible type"); + { + auto ptr = std::make_shared(); + Optional> foo; + foo = Optional> (ptr); + expect (ptr.use_count() == 2); + } + + beginTest ("An exception thrown during emplace leaves the optional without a value"); + { + Optional opt { ThrowOnCopy{} }; + bool threw = false; + + try + { + ThrowOnCopy t; + opt.emplace (t); + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (! opt.hasValue()); + } + + beginTest ("Swap does nothing to two empty optionals"); + { + Optional a, b; + expect (! a.hasValue()); + expect (! b.hasValue()); + + a.swap (b); + + expect (! a.hasValue()); + expect (! b.hasValue()); + } + + beginTest ("Swap transfers ownership if one optional contains a value"); + { + { + Ptr ptr = makePtr(); + Optional a, b = ptr; + expect (! a.hasValue()); + expect (b.hasValue()); + expect (ptr.use_count() == 2); + + a.swap (b); + + expect (a.hasValue()); + expect (! b.hasValue()); + expect (ptr.use_count() == 2); + } + + { + auto ptr = makePtr(); + Optional a = ptr, b; + expect (a.hasValue()); + expect (! b.hasValue()); + expect (ptr.use_count() == 2); + + a.swap (b); + + expect (! a.hasValue()); + expect (b.hasValue()); + expect (ptr.use_count() == 2); + } + } + + beginTest ("Swap calls std::swap to swap two populated optionals"); + { + auto x = makePtr(), y = makePtr(); + Optional a = x, b = y; + expect (a.hasValue()); + expect (b.hasValue()); + expect (x.use_count() == 2); + expect (y.use_count() == 2); + expect (*a == x); + expect (*b == y); + + a.swap (b); + + expect (a.hasValue()); + expect (b.hasValue()); + expect (x.use_count() == 2); + expect (y.use_count() == 2); + expect (*a == y); + expect (*b == x); + } + + beginTest ("An exception thrown during a swap leaves both objects in the previous populated state"); + { + { + Optional a, b; + a.emplace(); + + expect (a.hasValue()); + expect (! b.hasValue()); + + bool threw = false; + + try + { + a.swap (b); + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (a.hasValue()); + expect (! b.hasValue()); + } + + { + Optional a, b; + b.emplace(); + + expect (! a.hasValue()); + expect (b.hasValue()); + + bool threw = false; + + try + { + a.swap (b); + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (! a.hasValue()); + expect (b.hasValue()); + } + + { + Optional a, b; + a.emplace(); + b.emplace(); + + expect (a.hasValue()); + expect (b.hasValue()); + + bool threw = false; + + try + { + a.swap (b); + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (a.hasValue()); + expect (b.hasValue()); + } + } + + beginTest ("Relational tests"); + { + expect (Optional (1) == Optional (1)); + expect (Optional() == Optional()); + expect (! (Optional (1) == Optional())); + expect (! (Optional() == Optional (1))); + expect (! (Optional (1) == Optional (2))); + + expect (Optional (1) != Optional (2)); + expect (! (Optional() != Optional())); + expect (Optional (1) != Optional()); + expect (Optional() != Optional (1)); + expect (! (Optional (1) != Optional (1))); + + expect (Optional() < Optional (1)); + expect (! (Optional (1) < Optional())); + expect (! (Optional() < Optional())); + expect (Optional (1) < Optional (2)); + + expect (Optional() <= Optional (1)); + expect (! (Optional (1) <= Optional())); + expect (Optional() <= Optional()); + expect (Optional (1) <= Optional (2)); + + expect (! (Optional() > Optional (1))); + expect (Optional (1) > Optional()); + expect (! (Optional() > Optional())); + expect (! (Optional (1) > Optional (2))); + + expect (! (Optional() >= Optional (1))); + expect (Optional (1) >= Optional()); + expect (Optional() >= Optional()); + expect (! (Optional (1) >= Optional (2))); + + expect (Optional() == nullopt); + expect (! (Optional (1) == nullopt)); + expect (nullopt == Optional()); + expect (! (nullopt == Optional (1))); + + expect (! (Optional() != nullopt)); + expect (Optional (1) != nullopt); + expect (! (nullopt != Optional())); + expect (nullopt != Optional (1)); + + expect (! (Optional() < nullopt)); + expect (! (Optional (1) < nullopt)); + + expect (! (nullopt < Optional())); + expect (nullopt < Optional (1)); + + expect (Optional() <= nullopt); + expect (! (Optional (1) <= nullopt)); + + expect (nullopt <= Optional()); + expect (nullopt <= Optional (1)); + + expect (! (Optional() > nullopt)); + expect (Optional (1) > nullopt); + + expect (! (nullopt > Optional())); + expect (! (nullopt > Optional (1))); + + expect (Optional() >= nullopt); + expect (Optional (1) >= nullopt); + + expect (nullopt >= Optional()); + expect (! (nullopt >= Optional (1))); + + expect (! (Optional() == 5)); + expect (! (Optional (1) == 5)); + expect (Optional (1) == 1); + expect (! (5 == Optional())); + expect (! (5 == Optional (1))); + expect (1 == Optional (1)); + + expect (Optional() != 5); + expect (Optional (1) != 5); + expect (! (Optional (1) != 1)); + expect (5 != Optional()); + expect (5 != Optional (1)); + expect (! (1 != Optional (1))); + + expect (Optional() < 5); + expect (Optional (1) < 5); + expect (! (Optional (1) < 1)); + expect (! (Optional (1) < 0)); + + expect (! (5 < Optional())); + expect (! (5 < Optional (1))); + expect (! (1 < Optional (1))); + expect (0 < Optional (1)); + + expect (Optional() <= 5); + expect (Optional (1) <= 5); + expect (Optional (1) <= 1); + expect (! (Optional (1) <= 0)); + + expect (! (5 <= Optional())); + expect (! (5 <= Optional (1))); + expect (1 <= Optional (1)); + expect (0 <= Optional (1)); + + expect (! (Optional() > 5)); + expect (! (Optional (1) > 5)); + expect (! (Optional (1) > 1)); + expect (Optional (1) > 0); + + expect (5 > Optional()); + expect (5 > Optional (1)); + expect (! (1 > Optional (1))); + expect (! (0 > Optional (1))); + + expect (! (Optional() >= 5)); + expect (! (Optional (1) >= 5)); + expect (Optional (1) >= 1); + expect (Optional (1) >= 0); + + expect (5 >= Optional()); + expect (5 >= Optional (1)); + expect (1 >= Optional (1)); + expect (! (0 >= Optional (1))); + } + } +}; + +static OptionalUnitTest optionalUnitTest; + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_OwnedArray.cpp juce-7.0.0~ds0/modules/juce_core/containers/juce_OwnedArray.cpp --- juce-6.1.5~ds0/modules/juce_core/containers/juce_OwnedArray.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_OwnedArray.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_OwnedArray.h juce-7.0.0~ds0/modules/juce_core/containers/juce_OwnedArray.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_OwnedArray.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_OwnedArray.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_PropertySet.cpp juce-7.0.0~ds0/modules/juce_core/containers/juce_PropertySet.cpp --- juce-6.1.5~ds0/modules/juce_core/containers/juce_PropertySet.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_PropertySet.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_PropertySet.h juce-7.0.0~ds0/modules/juce_core/containers/juce_PropertySet.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_PropertySet.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_PropertySet.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_ReferenceCountedArray.cpp juce-7.0.0~ds0/modules/juce_core/containers/juce_ReferenceCountedArray.cpp --- juce-6.1.5~ds0/modules/juce_core/containers/juce_ReferenceCountedArray.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_ReferenceCountedArray.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_ReferenceCountedArray.h juce-7.0.0~ds0/modules/juce_core/containers/juce_ReferenceCountedArray.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_ReferenceCountedArray.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_ReferenceCountedArray.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_ScopedValueSetter.h juce-7.0.0~ds0/modules/juce_core/containers/juce_ScopedValueSetter.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_ScopedValueSetter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_ScopedValueSetter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h juce-7.0.0~ds0/modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_SortedSet.h juce-7.0.0~ds0/modules/juce_core/containers/juce_SortedSet.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_SortedSet.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_SortedSet.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_SparseSet.cpp juce-7.0.0~ds0/modules/juce_core/containers/juce_SparseSet.cpp --- juce-6.1.5~ds0/modules/juce_core/containers/juce_SparseSet.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_SparseSet.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_SparseSet.h juce-7.0.0~ds0/modules/juce_core/containers/juce_SparseSet.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_SparseSet.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_SparseSet.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_Variant.cpp juce-7.0.0~ds0/modules/juce_core/containers/juce_Variant.cpp --- juce-6.1.5~ds0/modules/juce_core/containers/juce_Variant.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_Variant.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/containers/juce_Variant.h juce-7.0.0~ds0/modules/juce_core/containers/juce_Variant.h --- juce-6.1.5~ds0/modules/juce_core/containers/juce_Variant.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/containers/juce_Variant.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_AndroidDocument.h juce-7.0.0~ds0/modules/juce_core/files/juce_AndroidDocument.h --- juce-6.1.5~ds0/modules/juce_core/files/juce_AndroidDocument.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_AndroidDocument.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,476 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2020 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +//============================================================================== +/** + Some information about a document. + + Each instance represents some information about the document at the point when the instance + was created. + + Instance information is not updated automatically. If you think some file information may + have changed, create a new instance. + + @tags{Core} +*/ +class AndroidDocumentInfo +{ +public: + AndroidDocumentInfo() = default; + + /** True if this file really exists. */ + bool exists() const { return isJuceFlagSet (flagExists); } + + /** True if this is a directory rather than a file. */ + bool isDirectory() const; + + /** True if this is a file rather than a directory. */ + bool isFile() const { return type.isNotEmpty() && ! isDirectory(); } + + /** True if this process has permission to read this file. + + If this returns true, and the AndroidDocument refers to a file rather than a directory, + then AndroidDocument::createInputStream should work on this document. + */ + bool canRead() const { return isJuceFlagSet (flagHasReadPermission) && type.isNotEmpty(); } + + /** True if this is a document that can be written, or a directory that can be modified. + + If this returns true, and the AndroidDocument refers to a file rather than a directory, + then AndroidDocument::createOutputStream should work on this document. + */ + bool canWrite() const + { + return isJuceFlagSet (flagHasWritePermission) + && type.isNotEmpty() + && (isNativeFlagSet (flagSupportsWrite) + || isNativeFlagSet (flagSupportsDelete) + || isNativeFlagSet (flagDirSupportsCreate)); + } + + /** True if this document can be removed completely from the filesystem. */ + bool canDelete() const { return isNativeFlagSet (flagSupportsDelete); } + + /** True if this is a directory and adding child documents is supported. */ + bool canCreateChildren() const { return isNativeFlagSet (flagDirSupportsCreate); } + + /** True if this document can be renamed. */ + bool canRename() const { return isNativeFlagSet (flagSupportsRename); } + + /** True if this document can be copied. */ + bool canCopy() const { return isNativeFlagSet (flagSupportsCopy); } + + /** True if this document can be moved. */ + bool canMove() const { return isNativeFlagSet (flagSupportsMove); } + + /** True if this document isn't a physical file on storage. */ + bool isVirtual() const { return isNativeFlagSet (flagVirtualDocument); } + + /** The user-facing name. + + This may or may not contain a file extension. For files identified by a URL, the MIME type + is stored separately. + */ + String getName() const { return name; } + + /** The MIME type of this document. */ + String getType() const { return isDirectory() ? String{} : type; } + + /** Timestamp when a document was last modified, in milliseconds since January 1, 1970 00:00:00.0 UTC. + + Use isLastModifiedValid() to determine whether or not the result of this + function is valid. + */ + int64 getLastModified() const { return isJuceFlagSet (flagValidModified) ? lastModified : 0; } + + /** True if the filesystem provided a modification time. */ + bool isLastModifiedValid() const { return isJuceFlagSet (flagValidModified); } + + /** The size of the document in bytes, if known. + + Use isSizeInBytesValid() to determine whether or not the result of this + function is valid. + */ + int64 getSizeInBytes() const { return isJuceFlagSet (flagValidSize) ? sizeInBytes : 0; } + + /** True if the filesystem provided a size in bytes. */ + bool isSizeInBytesValid() const { return isJuceFlagSet (flagValidSize); } + + /** @internal */ + class Args; + +private: + explicit AndroidDocumentInfo (Args); + + bool isNativeFlagSet (int flag) const { return (nativeFlags & flag) != 0; } + bool isJuceFlagSet (int flag) const { return (juceFlags & flag) != 0; } + + /* Native Android flags that might be set in the COLUMN_FLAGS for a particular document */ + enum + { + flagSupportsWrite = 0x0002, + flagSupportsDelete = 0x0004, + flagDirSupportsCreate = 0x0008, + flagSupportsRename = 0x0040, + flagSupportsCopy = 0x0080, + flagSupportsMove = 0x0100, + flagVirtualDocument = 0x0200, + }; + + /* Flags for other binary properties that aren't exposed in COLUMN_FLAGS */ + enum + { + flagExists = 1 << 0, + flagValidModified = 1 << 1, + flagValidSize = 1 << 2, + flagHasReadPermission = 1 << 3, + flagHasWritePermission = 1 << 4, + }; + + String name; + String type; + int64 lastModified = 0; + int64 sizeInBytes = 0; + int nativeFlags = 0, juceFlags = 0; +}; + +//============================================================================== +/** + Represents a permission granted to an application to read and/or write to a particular document + or tree. + + This class also contains static methods to request, revoke, and query the permissions of your + app. These functions are no-ops on all platforms other than Android. + + @tags{Core} +*/ +class AndroidDocumentPermission +{ +public: + /** The url of the document with persisted permissions. */ + URL getUrl() const { return url; } + + /** The time when the permissions were persisted, in milliseconds since January 1, 1970 00:00:00.0 UTC. */ + int64 getPersistedTime() const { return time; } + + /** True if the permission allows read access. */ + bool isReadPermission() const { return read; } + + /** True if the permission allows write access. */ + bool isWritePermission() const { return write; } + + /** Gives your app access to a particular document or tree, even after the device is rebooted. + + If you want to persist access to a folder selected through a native file chooser, make sure + to pass the exact URL returned by the file picker. Do NOT call AndroidDocument::fromTree + and then pass the result of getUrl to this function, as the resulting URL may differ from + the result of the file picker. + */ + static void takePersistentReadWriteAccess (const URL&); + + /** Revokes persistent access to a document or tree. */ + static void releasePersistentReadWriteAccess (const URL&); + + /** Returns all of the permissions that have previously been granted to the app, via + takePersistentReadWriteAccess(); + */ + static std::vector getPersistedPermissions(); + +private: + URL url; + int64 time = 0; + bool read = false, write = false; +}; + +//============================================================================== +/** + Provides access to a document on Android devices. + + In this context, a 'document' may be a file or a directory. + + The main purpose of this class is to provide access to files in shared storage on Android. + On newer Android versions, such files cannot be accessed directly by a file path, and must + instead be read and modified using a new URI-based DocumentsContract API. + + Example use-cases: + + - After showing the system open dialog to allow the user to open a file, pass the FileChooser's + URL result to AndroidDocument::fromDocument. Then, you can use getInfo() to retrieve + information about the file, and createInputStream to read from the file. Other functions allow + moving, copying, and deleting the file. + + - Similarly to the 'open' use-case, you may use createOutputStream to write to a file, normally + located using the system save dialog. + + - To allow reading or writing to a tree of files in shared storage, you can show the system + open dialog in 'selects directories' mode, and pass the resulting URL to + AndroidDocument::fromTree. Then, you can iterate the files in the directory, query them, + and create new files. This is a good way to store multiple files that the user can access from + other apps, and that will be persistent after uninstalling and reinstalling your app. + + Note that you probably do *not* need this class if your app only needs to access files in its + own internal sandbox. juce::File instances should work as expected in that case. + + AndroidDocument is a bit like the DocumentFile class from the androidx extension library, + in that it represents a single document, and is implemented using DocumentsContract functions. + + @tags{Core} +*/ +class AndroidDocument +{ +public: + /** Create a null document. */ + AndroidDocument(); + + /** Create an AndroidDocument representing a file or directory at a particular path. + + This is provided for use on older API versions (lower than 19), or on other platforms, so + that the same AndroidDocument API can be used regardless of the runtime platform version. + + If the runtime platform version is 19 or higher, and you wish to work with a URI obtained + from a native file picker, use fromDocument() or fromTree() instead. + + If this function fails, hasValue() will return false on the returned document. + */ + static AndroidDocument fromFile (const File& filePath); + + /** Create an AndroidDocument representing a single document. + + The argument should be a URL representing a document. Such URLs are returned by the system + file-picker when it is not in folder-selection mode. If you pass a tree URL, this function + will fail. + + This function may fail on Android devices with API level 18 or lower, and on non-Android + platforms. If this function fails, hasValue() will return false on the returned document. + If calling this function fails, you may want to retry creating an AndroidDocument + with fromFile(), passing the result of URL::getLocalFile(). + */ + static AndroidDocument fromDocument (const URL& documentUrl); + + /** Create an AndroidDocument representing the root of a tree of files. + + The argument should be a URL representing a tree. Such URLs are returned by the system + file-picker when it is in folder-selection mode. If you pass a URL referring to a document + inside a tree, this will return a document referring to the root of the tree. If you pass + a URL referring to a single file, this will fail. + + When targeting platform version 30 or later, access to the filesystem via file paths is + heavily restricted, and access to shared storage must use a new URI-based system instead. + At time of writing, apps uploaded to the Play Store must target API 30 or higher. + If you want read/write access to a shared folder, you must: + + - Use a native FileChooser in canSelectDirectories mode, to allow the user to select a + folder that your app can access. Your app will only have access to the contents of this + directory; it cannot escape to the filesystem root. The system will not allow the user + to grant access to certain locations, including filesystem roots and the Download folder. + - Pass the URI that the user selected to fromTree(), and use the resulting AndroidDocument + to read/write to the file system. + + This function may fail on Android devices with API level 20 or lower, and on non-Android + platforms. If this function fails, hasValue() will return false on the returned document. + */ + static AndroidDocument fromTree (const URL& treeUrl); + + AndroidDocument (const AndroidDocument&); + AndroidDocument (AndroidDocument&&) noexcept; + + AndroidDocument& operator= (const AndroidDocument&); + AndroidDocument& operator= (AndroidDocument&&) noexcept; + + ~AndroidDocument(); + + /** True if the URLs of the two documents match. */ + bool operator== (const AndroidDocument&) const; + + /** False if the URLs of the two documents match. */ + bool operator!= (const AndroidDocument&) const; + + /** Attempts to delete this document, and returns true on success. */ + bool deleteDocument() const; + + /** Renames the document, and returns true on success. + + This may cause the document's URI and metadata to change, so ensure to invalidate any + cached information about the document (URLs, AndroidDocumentInfo instances) after calling + this function. + */ + bool renameTo (const String& newDisplayName); + + /** Attempts to create a new nested document with a particular type and name. + + The type should be a standard MIME type string, e.g. "image/png", "text/plain". + + The file name doesn't need to contain an extension, as this information is passed via the + type argument. If this document is File-based rather than URL-based, then an appropriate + file extension will be chosen based on the MIME type. + + On failure, the returned AndroidDocument may be invalid, and will return false from hasValue(). + */ + AndroidDocument createChildDocumentWithTypeAndName (const String& type, const String& name) const; + + /** Attempts to create a new nested directory with a particular name. + + On failure, the returned AndroidDocument may be invalid, and will return false from hasValue(). + */ + AndroidDocument createChildDirectory (const String& name) const; + + /** True if this object actually refers to a document. + + If this function returns false, you *must not* call any function on this instance other + than the special member functions to copy, move, and/or destruct the instance. + */ + bool hasValue() const { return pimpl != nullptr; } + + /** Like hasValue(), but allows declaring AndroidDocument instances directly in 'if' statements. */ + explicit operator bool() const { return hasValue(); } + + /** Creates a stream for reading from this document. */ + std::unique_ptr createInputStream() const; + + /** Creates a stream for writing to this document. */ + std::unique_ptr createOutputStream() const; + + /** Returns the content URL describing this document. */ + URL getUrl() const; + + /** Fetches information about this document. */ + AndroidDocumentInfo getInfo() const; + + /** Experimental: Attempts to copy this document to a new parent, and returns an AndroidDocument + representing the copy. + + On failure, the returned AndroidDocument may be invalid, and will return false from hasValue(). + + This function may fail if the document doesn't allow copying, and when using URI-based + documents on devices with API level 23 or lower. On failure, the returned AndroidDocument + will return false from hasValue(). In testing, copying was not supported on the Android + emulator for API 24, 30, or 31, so there's a good chance this function won't work on real + devices. + + @see AndroidDocumentInfo::canCopy + */ + AndroidDocument copyDocumentToParentDocument (const AndroidDocument& target) const; + + /** Experimental: Attempts to move this document from one parent to another, and returns true on + success. + + This may cause the document's URI and metadata to change, so ensure to invalidate any + cached information about the document (URLs, AndroidDocumentInfo instances) after calling + this function. + + This function may fail if the document doesn't allow moving, and when using URI-based + documents on devices with API level 23 or lower. + */ + bool moveDocumentFromParentToParent (const AndroidDocument& currentParent, + const AndroidDocument& newParent); + + /** @internal */ + struct NativeInfo; + + /** @internal */ + NativeInfo getNativeInfo() const; + +private: + struct Utils; + class Pimpl; + + explicit AndroidDocument (std::unique_ptr); + + void swap (AndroidDocument& other) noexcept { std::swap (other.pimpl, pimpl); } + + std::unique_ptr pimpl; +}; + +//============================================================================== +/** + An iterator that visits child documents in a directory. + + Instances of this iterator can be created by calling makeRecursive() or + makeNonRecursive(). The results of these functions can additionally be used + in standard algorithms, and in range-for loops: + + @code + AndroidDocument findFileWithName (const AndroidDocument& parent, const String& name) + { + for (const auto& child : AndroidDocumentIterator::makeNonRecursive (parent)) + if (child.getInfo().getName() == name) + return child; + + return AndroidDocument(); + } + + std::vector findAllChildrenRecursive (const AndroidDocument& parent) + { + std::vector children; + std::copy (AndroidDocumentIterator::makeRecursive (doc), + AndroidDocumentIterator(), + std::back_inserter (children)); + return children; + } + @endcode + + @tags{Core} +*/ +class AndroidDocumentIterator final +{ +public: + using difference_type = std::ptrdiff_t; + using pointer = void; + using iterator_category = std::input_iterator_tag; + + /** Create an iterator that will visit each item in this directory. */ + static AndroidDocumentIterator makeNonRecursive (const AndroidDocument&); + + /** Create an iterator that will visit each item in this directory, and all nested directories. */ + static AndroidDocumentIterator makeRecursive (const AndroidDocument&); + + /** Creates an end/sentinel iterator. */ + AndroidDocumentIterator() = default; + + bool operator== (const AndroidDocumentIterator& other) const noexcept { return pimpl == nullptr && other.pimpl == nullptr; } + bool operator!= (const AndroidDocumentIterator& other) const noexcept { return ! operator== (other); } + + /** Returns the document to which this iterator points. */ + AndroidDocument operator*() const; + + /** Moves this iterator to the next position. */ + AndroidDocumentIterator& operator++(); + + /** Allows this iterator to be used directly in a range-for. */ + AndroidDocumentIterator begin() const { return *this; } + + /** Allows this iterator to be used directly in a range-for. */ + AndroidDocumentIterator end() const { return AndroidDocumentIterator{}; } + +private: + struct Utils; + struct Pimpl; + + explicit AndroidDocumentIterator (std::unique_ptr); + + std::shared_ptr pimpl; +}; + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_common_MimeTypes.cpp juce-7.0.0~ds0/modules/juce_core/files/juce_common_MimeTypes.cpp --- juce-6.1.5~ds0/modules/juce_core/files/juce_common_MimeTypes.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_common_MimeTypes.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,710 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +namespace juce +{ + +struct MimeTypeTableEntry +{ + const char* fileExtension, *mimeType; + + static MimeTypeTableEntry table[641]; +}; + +static StringArray getMatches (const String& toMatch, + const char* MimeTypeTableEntry::* matchField, + const char* MimeTypeTableEntry::* returnField) +{ + StringArray result; + + for (auto type : MimeTypeTableEntry::table) + if (toMatch == type.*matchField) + result.add (type.*returnField); + + return result; +} + +namespace MimeTypeTable +{ + +StringArray getMimeTypesForFileExtension (const String& fileExtension) +{ + return getMatches (fileExtension, &MimeTypeTableEntry::fileExtension, &MimeTypeTableEntry::mimeType); +} + +StringArray getFileExtensionsForMimeType (const String& mimeType) +{ + return getMatches (mimeType, &MimeTypeTableEntry::mimeType, &MimeTypeTableEntry::fileExtension); +} + +} // namespace MimeTypeTable + +//============================================================================== +MimeTypeTableEntry MimeTypeTableEntry::table[641] = +{ + {"3dm", "x-world/x-3dmf"}, + {"3dmf", "x-world/x-3dmf"}, + {"a", "application/octet-stream"}, + {"aab", "application/x-authorware-bin"}, + {"aam", "application/x-authorware-map"}, + {"aas", "application/x-authorware-seg"}, + {"abc", "text/vnd.abc"}, + {"acgi", "text/html"}, + {"afl", "video/animaflex"}, + {"ai", "application/postscript"}, + {"aif", "audio/aiff"}, + {"aif", "audio/x-aiff"}, + {"aifc", "audio/aiff"}, + {"aifc", "audio/x-aiff"}, + {"aiff", "audio/aiff"}, + {"aiff", "audio/x-aiff"}, + {"aim", "application/x-aim"}, + {"aip", "text/x-audiosoft-intra"}, + {"ani", "application/x-navi-animation"}, + {"aos", "application/x-nokia-9000-communicator-add-on-software"}, + {"aps", "application/mime"}, + {"arc", "application/octet-stream"}, + {"arj", "application/arj"}, + {"arj", "application/octet-stream"}, + {"art", "image/x-jg"}, + {"asf", "video/x-ms-asf"}, + {"asm", "text/x-asm"}, + {"asp", "text/asp"}, + {"asx", "application/x-mplayer2"}, + {"asx", "video/x-ms-asf"}, + {"asx", "video/x-ms-asf-plugin"}, + {"au", "audio/basic"}, + {"au", "audio/x-au"}, + {"avi", "application/x-troff-msvideo"}, + {"avi", "video/avi"}, + {"avi", "video/msvideo"}, + {"avi", "video/x-msvideo"}, + {"avs", "video/avs-video"}, + {"bcpio", "application/x-bcpio"}, + {"bin", "application/mac-binary"}, + {"bin", "application/macbinary"}, + {"bin", "application/octet-stream"}, + {"bin", "application/x-binary"}, + {"bin", "application/x-macbinary"}, + {"bm", "image/bmp"}, + {"bmp", "image/bmp"}, + {"bmp", "image/x-windows-bmp"}, + {"boo", "application/book"}, + {"book", "application/book"}, + {"boz", "application/x-bzip2"}, + {"bsh", "application/x-bsh"}, + {"bz", "application/x-bzip"}, + {"bz2", "application/x-bzip2"}, + {"c", "text/plain"}, + {"c", "text/x-c"}, + {"c++", "text/plain"}, + {"cat", "application/vnd.ms-pki.seccat"}, + {"cc", "text/plain"}, + {"cc", "text/x-c"}, + {"ccad", "application/clariscad"}, + {"cco", "application/x-cocoa"}, + {"cdf", "application/cdf"}, + {"cdf", "application/x-cdf"}, + {"cdf", "application/x-netcdf"}, + {"cer", "application/pkix-cert"}, + {"cer", "application/x-x509-ca-cert"}, + {"cha", "application/x-chat"}, + {"chat", "application/x-chat"}, + {"class", "application/java"}, + {"class", "application/java-byte-code"}, + {"class", "application/x-java-class"}, + {"com", "application/octet-stream"}, + {"com", "text/plain"}, + {"conf", "text/plain"}, + {"cpio", "application/x-cpio"}, + {"cpp", "text/x-c"}, + {"cpt", "application/mac-compactpro"}, + {"cpt", "application/x-compactpro"}, + {"cpt", "application/x-cpt"}, + {"crl", "application/pkcs-crl"}, + {"crl", "application/pkix-crl"}, + {"crt", "application/pkix-cert"}, + {"crt", "application/x-x509-ca-cert"}, + {"crt", "application/x-x509-user-cert"}, + {"csh", "application/x-csh"}, + {"csh", "text/x-script.csh"}, + {"css", "application/x-pointplus"}, + {"css", "text/css"}, + {"cxx", "text/plain"}, + {"dcr", "application/x-director"}, + {"deepv", "application/x-deepv"}, + {"def", "text/plain"}, + {"der", "application/x-x509-ca-cert"}, + {"dif", "video/x-dv"}, + {"dir", "application/x-director"}, + {"dl", "video/dl"}, + {"dl", "video/x-dl"}, + {"doc", "application/msword"}, + {"dot", "application/msword"}, + {"dp", "application/commonground"}, + {"drw", "application/drafting"}, + {"dump", "application/octet-stream"}, + {"dv", "video/x-dv"}, + {"dvi", "application/x-dvi"}, + {"dwf", "drawing/x-dwf"}, + {"dwf", "model/vnd.dwf"}, + {"dwg", "application/acad"}, + {"dwg", "image/vnd.dwg"}, + {"dwg", "image/x-dwg"}, + {"dxf", "application/dxf"}, + {"dxf", "image/vnd.dwg"}, + {"dxf", "image/x-dwg"}, + {"dxr", "application/x-director"}, + {"el", "text/x-script.elisp"}, + {"elc", "application/x-bytecode.elisp"}, + {"elc", "application/x-elc"}, + {"env", "application/x-envoy"}, + {"eps", "application/postscript"}, + {"es", "application/x-esrehber"}, + {"etx", "text/x-setext"}, + {"evy", "application/envoy"}, + {"evy", "application/x-envoy"}, + {"exe", "application/octet-stream"}, + {"f", "text/plain"}, + {"f", "text/x-fortran"}, + {"f77", "text/x-fortran"}, + {"f90", "text/plain"}, + {"f90", "text/x-fortran"}, + {"fdf", "application/vnd.fdf"}, + {"fif", "application/fractals"}, + {"fif", "image/fif"}, + {"fli", "video/fli"}, + {"fli", "video/x-fli"}, + {"flo", "image/florian"}, + {"flx", "text/vnd.fmi.flexstor"}, + {"fmf", "video/x-atomic3d-feature"}, + {"for", "text/plain"}, + {"for", "text/x-fortran"}, + {"fpx", "image/vnd.fpx"}, + {"fpx", "image/vnd.net-fpx"}, + {"frl", "application/freeloader"}, + {"funk", "audio/make"}, + {"g", "text/plain"}, + {"g3", "image/g3fax"}, + {"gif", "image/gif"}, + {"gl", "video/gl"}, + {"gl", "video/x-gl"}, + {"gsd", "audio/x-gsm"}, + {"gsm", "audio/x-gsm"}, + {"gsp", "application/x-gsp"}, + {"gss", "application/x-gss"}, + {"gtar", "application/x-gtar"}, + {"gz", "application/x-compressed"}, + {"gz", "application/x-gzip"}, + {"gzip", "application/x-gzip"}, + {"gzip", "multipart/x-gzip"}, + {"h", "text/plain"}, + {"h", "text/x-h"}, + {"hdf", "application/x-hdf"}, + {"help", "application/x-helpfile"}, + {"hgl", "application/vnd.hp-hpgl"}, + {"hh", "text/plain"}, + {"hh", "text/x-h"}, + {"hlb", "text/x-script"}, + {"hlp", "application/hlp"}, + {"hlp", "application/x-helpfile"}, + {"hlp", "application/x-winhelp"}, + {"hpg", "application/vnd.hp-hpgl"}, + {"hpgl", "application/vnd.hp-hpgl"}, + {"hqx", "application/binhex"}, + {"hqx", "application/binhex4"}, + {"hqx", "application/mac-binhex"}, + {"hqx", "application/mac-binhex40"}, + {"hqx", "application/x-binhex40"}, + {"hqx", "application/x-mac-binhex40"}, + {"hta", "application/hta"}, + {"htc", "text/x-component"}, + {"htm", "text/html"}, + {"html", "text/html"}, + {"htmls", "text/html"}, + {"htt", "text/webviewhtml"}, + {"htx", "text/html"}, + {"ice", "x-conference/x-cooltalk"}, + {"ico", "image/x-icon"}, + {"idc", "text/plain"}, + {"ief", "image/ief"}, + {"iefs", "image/ief"}, + {"iges", "application/iges"}, + {"iges", "model/iges"}, + {"igs", "application/iges"}, + {"igs", "model/iges"}, + {"ima", "application/x-ima"}, + {"imap", "application/x-httpd-imap"}, + {"inf", "application/inf"}, + {"ins", "application/x-internett-signup"}, + {"ip", "application/x-ip2"}, + {"isu", "video/x-isvideo"}, + {"it", "audio/it"}, + {"iv", "application/x-inventor"}, + {"ivr", "i-world/i-vrml"}, + {"ivy", "application/x-livescreen"}, + {"jam", "audio/x-jam"}, + {"jav", "text/plain"}, + {"jav", "text/x-java-source"}, + {"java", "text/plain"}, + {"java", "text/x-java-source"}, + {"jcm", "application/x-java-commerce"}, + {"jfif", "image/jpeg"}, + {"jfif", "image/pjpeg"}, + {"jpe", "image/jpeg"}, + {"jpe", "image/pjpeg"}, + {"jpeg", "image/jpeg"}, + {"jpeg", "image/pjpeg"}, + {"jpg", "image/jpeg"}, + {"jpg", "image/pjpeg"}, + {"jps", "image/x-jps"}, + {"js", "application/x-javascript"}, + {"jut", "image/jutvision"}, + {"kar", "audio/midi"}, + {"kar", "music/x-karaoke"}, + {"ksh", "application/x-ksh"}, + {"ksh", "text/x-script.ksh"}, + {"la", "audio/nspaudio"}, + {"la", "audio/x-nspaudio"}, + {"lam", "audio/x-liveaudio"}, + {"latex", "application/x-latex"}, + {"lha", "application/lha"}, + {"lha", "application/octet-stream"}, + {"lha", "application/x-lha"}, + {"lhx", "application/octet-stream"}, + {"list", "text/plain"}, + {"lma", "audio/nspaudio"}, + {"lma", "audio/x-nspaudio"}, + {"log", "text/plain"}, + {"lsp", "application/x-lisp"}, + {"lsp", "text/x-script.lisp"}, + {"lst", "text/plain"}, + {"lsx", "text/x-la-asf"}, + {"ltx", "application/x-latex"}, + {"lzh", "application/octet-stream"}, + {"lzh", "application/x-lzh"}, + {"lzx", "application/lzx"}, + {"lzx", "application/octet-stream"}, + {"lzx", "application/x-lzx"}, + {"m", "text/plain"}, + {"m", "text/x-m"}, + {"m1v", "video/mpeg"}, + {"m2a", "audio/mpeg"}, + {"m2v", "video/mpeg"}, + {"m3u", "audio/x-mpequrl"}, + {"man", "application/x-troff-man"}, + {"map", "application/x-navimap"}, + {"mar", "text/plain"}, + {"mbd", "application/mbedlet"}, + {"mc$", "application/x-magic-cap-package-1.0"}, + {"mcd", "application/mcad"}, + {"mcd", "application/x-mathcad"}, + {"mcf", "image/vasa"}, + {"mcf", "text/mcf"}, + {"mcp", "application/netmc"}, + {"me", "application/x-troff-me"}, + {"mht", "message/rfc822"}, + {"mhtml", "message/rfc822"}, + {"mid", "application/x-midi"}, + {"mid", "audio/midi"}, + {"mid", "audio/x-mid"}, + {"mid", "audio/x-midi"}, + {"mid", "music/crescendo"}, + {"mid", "x-music/x-midi"}, + {"midi", "application/x-midi"}, + {"midi", "audio/midi"}, + {"midi", "audio/x-mid"}, + {"midi", "audio/x-midi"}, + {"midi", "music/crescendo"}, + {"midi", "x-music/x-midi"}, + {"mif", "application/x-frame"}, + {"mif", "application/x-mif"}, + {"mime", "message/rfc822"}, + {"mime", "www/mime"}, + {"mjf", "audio/x-vnd.audioexplosion.mjuicemediafile"}, + {"mjpg", "video/x-motion-jpeg"}, + {"mm", "application/base64"}, + {"mm", "application/x-meme"}, + {"mme", "application/base64"}, + {"mod", "audio/mod"}, + {"mod", "audio/x-mod"}, + {"moov", "video/quicktime"}, + {"mov", "video/quicktime"}, + {"movie", "video/x-sgi-movie"}, + {"mp2", "audio/mpeg"}, + {"mp2", "audio/x-mpeg"}, + {"mp2", "video/mpeg"}, + {"mp2", "video/x-mpeg"}, + {"mp2", "video/x-mpeq2a"}, + {"mp3", "audio/mpeg"}, + {"mp3", "audio/mpeg3"}, + {"mp3", "audio/x-mpeg-3"}, + {"mp3", "video/mpeg"}, + {"mp3", "video/x-mpeg"}, + {"mpa", "audio/mpeg"}, + {"mpa", "video/mpeg"}, + {"mpc", "application/x-project"}, + {"mpe", "video/mpeg"}, + {"mpeg", "video/mpeg"}, + {"mpg", "audio/mpeg"}, + {"mpg", "video/mpeg"}, + {"mpga", "audio/mpeg"}, + {"mpp", "application/vnd.ms-project"}, + {"mpt", "application/x-project"}, + {"mpv", "application/x-project"}, + {"mpx", "application/x-project"}, + {"mrc", "application/marc"}, + {"ms", "application/x-troff-ms"}, + {"mv", "video/x-sgi-movie"}, + {"my", "audio/make"}, + {"mzz", "application/x-vnd.audioexplosion.mzz"}, + {"nap", "image/naplps"}, + {"naplps", "image/naplps"}, + {"nc", "application/x-netcdf"}, + {"ncm", "application/vnd.nokia.configuration-message"}, + {"nif", "image/x-niff"}, + {"niff", "image/x-niff"}, + {"nix", "application/x-mix-transfer"}, + {"nsc", "application/x-conference"}, + {"nvd", "application/x-navidoc"}, + {"o", "application/octet-stream"}, + {"oda", "application/oda"}, + {"omc", "application/x-omc"}, + {"omcd", "application/x-omcdatamaker"}, + {"omcr", "application/x-omcregerator"}, + {"p", "text/x-pascal"}, + {"p10", "application/pkcs10"}, + {"p10", "application/x-pkcs10"}, + {"p12", "application/pkcs-12"}, + {"p12", "application/x-pkcs12"}, + {"p7a", "application/x-pkcs7-signature"}, + {"p7c", "application/pkcs7-mime"}, + {"p7c", "application/x-pkcs7-mime"}, + {"p7m", "application/pkcs7-mime"}, + {"p7m", "application/x-pkcs7-mime"}, + {"p7r", "application/x-pkcs7-certreqresp"}, + {"p7s", "application/pkcs7-signature"}, + {"part", "application/pro_eng"}, + {"pas", "text/pascal"}, + {"pbm", "image/x-portable-bitmap"}, + {"pcl", "application/vnd.hp-pcl"}, + {"pcl", "application/x-pcl"}, + {"pct", "image/x-pict"}, + {"pcx", "image/x-pcx"}, + {"pdb", "chemical/x-pdb"}, + {"pdf", "application/pdf"}, + {"pfunk", "audio/make"}, + {"pfunk", "audio/make.my.funk"}, + {"pgm", "image/x-portable-graymap"}, + {"pgm", "image/x-portable-greymap"}, + {"pic", "image/pict"}, + {"pict", "image/pict"}, + {"pkg", "application/x-newton-compatible-pkg"}, + {"pko", "application/vnd.ms-pki.pko"}, + {"pl", "text/plain"}, + {"pl", "text/x-script.perl"}, + {"plx", "application/x-pixclscript"}, + {"pm", "image/x-xpixmap"}, + {"pm", "text/x-script.perl-module"}, + {"pm4", "application/x-pagemaker"}, + {"pm5", "application/x-pagemaker"}, + {"png", "image/png"}, + {"pnm", "application/x-portable-anymap"}, + {"pnm", "image/x-portable-anymap"}, + {"pot", "application/mspowerpoint"}, + {"pot", "application/vnd.ms-powerpoint"}, + {"pov", "model/x-pov"}, + {"ppa", "application/vnd.ms-powerpoint"}, + {"ppm", "image/x-portable-pixmap"}, + {"pps", "application/mspowerpoint"}, + {"pps", "application/vnd.ms-powerpoint"}, + {"ppt", "application/mspowerpoint"}, + {"ppt", "application/powerpoint"}, + {"ppt", "application/vnd.ms-powerpoint"}, + {"ppt", "application/x-mspowerpoint"}, + {"ppz", "application/mspowerpoint"}, + {"pre", "application/x-freelance"}, + {"prt", "application/pro_eng"}, + {"ps", "application/postscript"}, + {"psd", "application/octet-stream"}, + {"pvu", "paleovu/x-pv"}, + {"pwz", "application/vnd.ms-powerpoint"}, + {"py", "text/x-script.python"}, + {"pyc", "application/x-bytecode.python"}, + {"qcp", "audio/vnd.qcelp"}, + {"qd3", "x-world/x-3dmf"}, + {"qd3d", "x-world/x-3dmf"}, + {"qif", "image/x-quicktime"}, + {"qt", "video/quicktime"}, + {"qtc", "video/x-qtc"}, + {"qti", "image/x-quicktime"}, + {"qtif", "image/x-quicktime"}, + {"ra", "audio/x-pn-realaudio"}, + {"ra", "audio/x-pn-realaudio-plugin"}, + {"ra", "audio/x-realaudio"}, + {"ram", "audio/x-pn-realaudio"}, + {"ras", "application/x-cmu-raster"}, + {"ras", "image/cmu-raster"}, + {"ras", "image/x-cmu-raster"}, + {"rast", "image/cmu-raster"}, + {"rexx", "text/x-script.rexx"}, + {"rf", "image/vnd.rn-realflash"}, + {"rgb", "image/x-rgb"}, + {"rm", "application/vnd.rn-realmedia"}, + {"rm", "audio/x-pn-realaudio"}, + {"rmi", "audio/mid"}, + {"rmm", "audio/x-pn-realaudio"}, + {"rmp", "audio/x-pn-realaudio"}, + {"rmp", "audio/x-pn-realaudio-plugin"}, + {"rng", "application/ringing-tones"}, + {"rng", "application/vnd.nokia.ringing-tone"}, + {"rnx", "application/vnd.rn-realplayer"}, + {"roff", "application/x-troff"}, + {"rp", "image/vnd.rn-realpix"}, + {"rpm", "audio/x-pn-realaudio-plugin"}, + {"rt", "text/richtext"}, + {"rt", "text/vnd.rn-realtext"}, + {"rtf", "application/rtf"}, + {"rtf", "application/x-rtf"}, + {"rtf", "text/richtext"}, + {"rtx", "application/rtf"}, + {"rtx", "text/richtext"}, + {"rv", "video/vnd.rn-realvideo"}, + {"s", "text/x-asm"}, + {"s3m", "audio/s3m"}, + {"saveme", "application/octet-stream"}, + {"sbk", "application/x-tbook"}, + {"scm", "application/x-lotusscreencam"}, + {"scm", "text/x-script.guile"}, + {"scm", "text/x-script.scheme"}, + {"scm", "video/x-scm"}, + {"sdml", "text/plain"}, + {"sdp", "application/sdp"}, + {"sdp", "application/x-sdp"}, + {"sdr", "application/sounder"}, + {"sea", "application/sea"}, + {"sea", "application/x-sea"}, + {"set", "application/set"}, + {"sgm", "text/sgml"}, + {"sgm", "text/x-sgml"}, + {"sgml", "text/sgml"}, + {"sgml", "text/x-sgml"}, + {"sh", "application/x-bsh"}, + {"sh", "application/x-sh"}, + {"sh", "application/x-shar"}, + {"sh", "text/x-script.sh"}, + {"shar", "application/x-bsh"}, + {"shar", "application/x-shar"}, + {"shtml", "text/html"}, + {"shtml", "text/x-server-parsed-html"}, + {"sid", "audio/x-psid"}, + {"sit", "application/x-sit"}, + {"sit", "application/x-stuffit"}, + {"skd", "application/x-koan"}, + {"skm", "application/x-koan"}, + {"skp", "application/x-koan"}, + {"skt", "application/x-koan"}, + {"sl", "application/x-seelogo"}, + {"smi", "application/smil"}, + {"smil", "application/smil"}, + {"snd", "audio/basic"}, + {"snd", "audio/x-adpcm"}, + {"sol", "application/solids"}, + {"spc", "application/x-pkcs7-certificates"}, + {"spc", "text/x-speech"}, + {"spl", "application/futuresplash"}, + {"spr", "application/x-sprite"}, + {"sprite", "application/x-sprite"}, + {"src", "application/x-wais-source"}, + {"ssi", "text/x-server-parsed-html"}, + {"ssm", "application/streamingmedia"}, + {"sst", "application/vnd.ms-pki.certstore"}, + {"step", "application/step"}, + {"stl", "application/sla"}, + {"stl", "application/vnd.ms-pki.stl"}, + {"stl", "application/x-navistyle"}, + {"stp", "application/step"}, + {"sv4cpio,", "application/x-sv4cpio"}, + {"sv4crc", "application/x-sv4crc"}, + {"svf", "image/vnd.dwg"}, + {"svf", "image/x-dwg"}, + {"svr", "application/x-world"}, + {"svr", "x-world/x-svr"}, + {"swf", "application/x-shockwave-flash"}, + {"t", "application/x-troff"}, + {"talk", "text/x-speech"}, + {"tar", "application/x-tar"}, + {"tbk", "application/toolbook"}, + {"tbk", "application/x-tbook"}, + {"tcl", "application/x-tcl"}, + {"tcl", "text/x-script.tcl"}, + {"tcsh", "text/x-script.tcsh"}, + {"tex", "application/x-tex"}, + {"texi", "application/x-texinfo"}, + {"texinfo,", "application/x-texinfo"}, + {"text", "application/plain"}, + {"text", "text/plain"}, + {"tgz", "application/gnutar"}, + {"tgz", "application/x-compressed"}, + {"tif", "image/tiff"}, + {"tif", "image/x-tiff"}, + {"tiff", "image/tiff"}, + {"tiff", "image/x-tiff"}, + {"tr", "application/x-troff"}, + {"tsi", "audio/tsp-audio"}, + {"tsp", "application/dsptype"}, + {"tsp", "audio/tsplayer"}, + {"tsv", "text/tab-separated-values"}, + {"turbot", "image/florian"}, + {"txt", "text/plain"}, + {"uil", "text/x-uil"}, + {"uni", "text/uri-list"}, + {"unis", "text/uri-list"}, + {"unv", "application/i-deas"}, + {"uri", "text/uri-list"}, + {"uris", "text/uri-list"}, + {"ustar", "application/x-ustar"}, + {"ustar", "multipart/x-ustar"}, + {"uu", "application/octet-stream"}, + {"uu", "text/x-uuencode"}, + {"uue", "text/x-uuencode"}, + {"vcd", "application/x-cdlink"}, + {"vcs", "text/x-vcalendar"}, + {"vda", "application/vda"}, + {"vdo", "video/vdo"}, + {"vew", "application/groupwise"}, + {"viv", "video/vivo"}, + {"viv", "video/vnd.vivo"}, + {"vivo", "video/vivo"}, + {"vivo", "video/vnd.vivo"}, + {"vmd", "application/vocaltec-media-desc"}, + {"vmf", "application/vocaltec-media-file"}, + {"voc", "audio/voc"}, + {"voc", "audio/x-voc"}, + {"vos", "video/vosaic"}, + {"vox", "audio/voxware"}, + {"vqe", "audio/x-twinvq-plugin"}, + {"vqf", "audio/x-twinvq"}, + {"vql", "audio/x-twinvq-plugin"}, + {"vrml", "application/x-vrml"}, + {"vrml", "model/vrml"}, + {"vrml", "x-world/x-vrml"}, + {"vrt", "x-world/x-vrt"}, + {"vsd", "application/x-visio"}, + {"vst", "application/x-visio"}, + {"vsw", "application/x-visio"}, + {"w60", "application/wordperfect6.0"}, + {"w61", "application/wordperfect6.1"}, + {"w6w", "application/msword"}, + {"wav", "audio/wav"}, + {"wav", "audio/x-wav"}, + {"wb1", "application/x-qpro"}, + {"wbmp", "image/vnd.wap.wbmp"}, + {"web", "application/vnd.xara"}, + {"wiz", "application/msword"}, + {"wk1", "application/x-123"}, + {"wmf", "windows/metafile"}, + {"wml", "text/vnd.wap.wml"}, + {"wmlc", "application/vnd.wap.wmlc"}, + {"wmls", "text/vnd.wap.wmlscript"}, + {"wmlsc", "application/vnd.wap.wmlscriptc"}, + {"word", "application/msword"}, + {"wp", "application/wordperfect"}, + {"wp5", "application/wordperfect"}, + {"wp5", "application/wordperfect6.0"}, + {"wp6", "application/wordperfect"}, + {"wpd", "application/wordperfect"}, + {"wpd", "application/x-wpwin"}, + {"wq1", "application/x-lotus"}, + {"wri", "application/mswrite"}, + {"wri", "application/x-wri"}, + {"wrl", "application/x-world"}, + {"wrl", "model/vrml"}, + {"wrl", "x-world/x-vrml"}, + {"wrz", "model/vrml"}, + {"wrz", "x-world/x-vrml"}, + {"wsc", "text/scriplet"}, + {"wsrc", "application/x-wais-source"}, + {"wtk", "application/x-wintalk"}, + {"xbm", "image/x-xbitmap"}, + {"xbm", "image/x-xbm"}, + {"xbm", "image/xbm"}, + {"xdr", "video/x-amt-demorun"}, + {"xgz", "xgl/drawing"}, + {"xif", "image/vnd.xiff"}, + {"xl", "application/excel"}, + {"xla", "application/excel"}, + {"xla", "application/x-excel"}, + {"xla", "application/x-msexcel"}, + {"xlb", "application/excel"}, + {"xlb", "application/vnd.ms-excel"}, + {"xlb", "application/x-excel"}, + {"xlc", "application/excel"}, + {"xlc", "application/vnd.ms-excel"}, + {"xlc", "application/x-excel"}, + {"xld", "application/excel"}, + {"xld", "application/x-excel"}, + {"xlk", "application/excel"}, + {"xlk", "application/x-excel"}, + {"xll", "application/excel"}, + {"xll", "application/vnd.ms-excel"}, + {"xll", "application/x-excel"}, + {"xlm", "application/excel"}, + {"xlm", "application/vnd.ms-excel"}, + {"xlm", "application/x-excel"}, + {"xls", "application/excel"}, + {"xls", "application/vnd.ms-excel"}, + {"xls", "application/x-excel"}, + {"xls", "application/x-msexcel"}, + {"xlt", "application/excel"}, + {"xlt", "application/x-excel"}, + {"xlv", "application/excel"}, + {"xlv", "application/x-excel"}, + {"xlw", "application/excel"}, + {"xlw", "application/vnd.ms-excel"}, + {"xlw", "application/x-excel"}, + {"xlw", "application/x-msexcel"}, + {"xm", "audio/xm"}, + {"xml", "application/xml"}, + {"xml", "text/xml"}, + {"xmz", "xgl/movie"}, + {"xpix", "application/x-vnd.ls-xpix"}, + {"xpm", "image/x-xpixmap"}, + {"xpm", "image/xpm"}, + {"x-png", "image/png"}, + {"xsr", "video/x-amt-showrun"}, + {"xwd", "image/x-xwd"}, + {"xwd", "image/x-xwindowdump"}, + {"xyz", "chemical/x-pdb"}, + {"z", "application/x-compress"}, + {"z", "application/x-compressed"}, + {"zip", "application/x-compressed"}, + {"zip", "application/x-zip-compressed"}, + {"zip", "application/zip"}, + {"zip", "multipart/x-zip"}, + {"zoo", "application/octet-stream"} +}; + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_common_MimeTypes.h juce-7.0.0~ds0/modules/juce_core/files/juce_common_MimeTypes.h --- juce-6.1.5~ds0/modules/juce_core/files/juce_common_MimeTypes.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_common_MimeTypes.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,42 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2020 - Raw Material Software Limited + + 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 6 End-User License + Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + + End User License Agreement: www.juce.com/juce-6-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#pragma once + +namespace juce +{ + +namespace MimeTypeTable +{ + +/* @internal */ +StringArray getMimeTypesForFileExtension (const String& fileExtension); + +/* @internal */ +StringArray getFileExtensionsForMimeType (const String& mimeType); + +} // namespace MimeTypeTable + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_DirectoryIterator.cpp juce-7.0.0~ds0/modules/juce_core/files/juce_DirectoryIterator.cpp --- juce-6.1.5~ds0/modules/juce_core/files/juce_DirectoryIterator.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_DirectoryIterator.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -75,13 +75,26 @@ if (! filename.containsOnly (".")) { + const auto fullPath = File::createFileWithoutCheckingPath (path + filename); bool matches = false; if (isDirectory) { - if (isRecursive && ((whatToLookFor & File::ignoreHiddenFiles) == 0 || ! isHidden)) - subIterator.reset (new DirectoryIterator (File::createFileWithoutCheckingPath (path + filename), - true, wildCard, whatToLookFor)); + const auto mayRecurseIntoPossibleHiddenDir = [this, &isHidden] + { + return (whatToLookFor & File::ignoreHiddenFiles) == 0 || ! isHidden; + }; + + const auto mayRecurseIntoPossibleSymlink = [this, &fullPath] + { + return followSymlinks == File::FollowSymlinks::yes + || ! fullPath.isSymbolicLink() + || (followSymlinks == File::FollowSymlinks::noCycles + && knownPaths->find (fullPath.getLinkedTarget()) == knownPaths->end()); + }; + + if (isRecursive && mayRecurseIntoPossibleHiddenDir() && mayRecurseIntoPossibleSymlink()) + subIterator.reset (new DirectoryIterator (fullPath, true, wildCard, whatToLookFor, followSymlinks, knownPaths)); matches = (whatToLookFor & File::findDirectories) != 0; } @@ -99,7 +112,7 @@ if (matches) { - currentFile = File::createFileWithoutCheckingPath (path + filename); + currentFile = fullPath; if (isHiddenResult != nullptr) *isHiddenResult = isHidden; if (isDirResult != nullptr) *isDirResult = isDirectory; diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_DirectoryIterator.h juce-7.0.0~ds0/modules/juce_core/files/juce_DirectoryIterator.h --- juce-6.1.5~ds0/modules/juce_core/files/juce_DirectoryIterator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_DirectoryIterator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -34,6 +34,10 @@ A DirectoryIterator will search through a directory and its subdirectories using a wildcard filepattern match. + The iterator keeps track of directories that it has previously traversed, and will + skip any previously-seen directories in the case of cycles caused by symbolic links. + It is also possible to avoid following symbolic links altogether. + If you may be scanning a large number of files, it's usually smarter to use this class than File::findChildFiles() because it allows you to stop at any time, rather than having to wait for the entire scan to finish before getting the results. @@ -73,17 +77,10 @@ DirectoryIterator (const File& directory, bool recursive, const String& pattern = "*", - int type = File::findFiles) - : wildCards (parseWildcards (pattern)), - fileFinder (directory, (recursive || wildCards.size() > 1) ? "*" : pattern), - wildCard (pattern), - path (File::addTrailingSeparator (directory.getFullPathName())), - whatToLookFor (type), - isRecursive (recursive) + int type = File::findFiles, + File::FollowSymlinks follow = File::FollowSymlinks::yes) + : DirectoryIterator (directory, recursive, pattern, type, follow, nullptr) { - // you have to specify the type of files you're looking for! - jassert ((whatToLookFor & (File::findFiles | File::findDirectories)) != 0); - jassert (whatToLookFor > 0 && whatToLookFor <= 7); } /** Moves the iterator along to the next file. @@ -126,6 +123,39 @@ float getEstimatedProgress() const; private: + using KnownPaths = std::set; + + DirectoryIterator (const File& directory, + bool recursive, + const String& pattern, + int type, + File::FollowSymlinks follow, + KnownPaths* seenPaths) + : wildCards (parseWildcards (pattern)), + fileFinder (directory, (recursive || wildCards.size() > 1) ? "*" : pattern), + wildCard (pattern), + path (File::addTrailingSeparator (directory.getFullPathName())), + whatToLookFor (type), + isRecursive (recursive), + followSymlinks (follow), + knownPaths (seenPaths) + { + // you have to specify the type of files you're looking for! + jassert ((whatToLookFor & (File::findFiles | File::findDirectories)) != 0); + jassert (whatToLookFor > 0 && whatToLookFor <= 7); + + if (followSymlinks == File::FollowSymlinks::noCycles) + { + if (knownPaths == nullptr) + { + heapKnownPaths = std::make_unique(); + knownPaths = heapKnownPaths.get(); + } + + knownPaths->insert (directory); + } + } + //============================================================================== struct NativeIterator { @@ -152,6 +182,9 @@ bool hasBeenAdvanced = false; std::unique_ptr subIterator; File currentFile; + File::FollowSymlinks followSymlinks = File::FollowSymlinks::yes; + KnownPaths* knownPaths = nullptr; + std::unique_ptr heapKnownPaths; static StringArray parseWildcards (const String& pattern); static bool fileMatches (const StringArray& wildCards, const String& filename); diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_File.cpp juce-7.0.0~ds0/modules/juce_core/files/juce_File.cpp --- juce-6.1.5~ds0/modules/juce_core/files/juce_File.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_File.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -561,18 +561,18 @@ } //============================================================================== -Array File::findChildFiles (int whatToLookFor, bool searchRecursively, const String& wildcard) const +Array File::findChildFiles (int whatToLookFor, bool searchRecursively, const String& wildcard, FollowSymlinks followSymlinks) const { Array results; - findChildFiles (results, whatToLookFor, searchRecursively, wildcard); + findChildFiles (results, whatToLookFor, searchRecursively, wildcard, followSymlinks); return results; } -int File::findChildFiles (Array& results, int whatToLookFor, bool searchRecursively, const String& wildcard) const +int File::findChildFiles (Array& results, int whatToLookFor, bool searchRecursively, const String& wildcard, FollowSymlinks followSymlinks) const { int total = 0; - for (const auto& di : RangedDirectoryIterator (*this, searchRecursively, wildcard, whatToLookFor)) + for (const auto& di : RangedDirectoryIterator (*this, searchRecursively, wildcard, whatToLookFor, followSymlinks)) { results.add (di.getFile()); ++total; @@ -1146,11 +1146,18 @@ expect (home.getChildFile ("./../xyz") == home.getParentDirectory().getChildFile ("xyz")); expect (home.getChildFile ("a1/a2/a3/./../../a4") == home.getChildFile ("a1/a4")); + expect (! File().hasReadAccess()); + expect (! File().hasWriteAccess()); + + expect (! tempFile.hasReadAccess()); + { FileOutputStream fo (tempFile); fo.write ("0123456789", 10); } + expect (tempFile.hasReadAccess()); + expect (tempFile.exists()); expect (tempFile.getSize() == 10); expect (std::abs ((int) (tempFile.getLastModificationTime().toMilliseconds() - Time::getCurrentTime().toMilliseconds())) < 3000); diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_FileFilter.cpp juce-7.0.0~ds0/modules/juce_core/files/juce_FileFilter.cpp --- juce-6.1.5~ds0/modules/juce_core/files/juce_FileFilter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_FileFilter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_FileFilter.h juce-7.0.0~ds0/modules/juce_core/files/juce_FileFilter.h --- juce-6.1.5~ds0/modules/juce_core/files/juce_FileFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_FileFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_File.h juce-7.0.0~ds0/modules/juce_core/files/juce_File.h --- juce-6.1.5~ds0/modules/juce_core/files/juce_File.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_File.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -20,17 +20,13 @@ ============================================================================== */ -#if ! defined (DOXYGEN) && (JUCE_MAC || JUCE_IOS) - #if __LP64__ - using OSType = unsigned int; - #else - using OSType = unsigned long; - #endif -#endif - namespace juce { +#if ! DOXYGEN && (JUCE_MAC || JUCE_IOS) + using OSType = unsigned int; +#endif + //============================================================================== /** Represents a local file or directory. @@ -346,6 +342,12 @@ */ bool hasWriteAccess() const; + /** Checks whether a file can be read. + + @returns true if it's possible to read this file. + */ + bool hasReadAccess() const; + /** Changes the write-permission of a file or directory. @param shouldBeReadOnly whether to add or remove write-permission @@ -381,21 +383,21 @@ //============================================================================== /** Returns the last modification time of this file. - @returns the time, or an invalid time if the file doesn't exist. + @returns the time, or the Unix Epoch if the file doesn't exist. @see setLastModificationTime, getLastAccessTime, getCreationTime */ Time getLastModificationTime() const; /** Returns the last time this file was accessed. - @returns the time, or an invalid time if the file doesn't exist. + @returns the time, or the Unix Epoch if the file doesn't exist. @see setLastAccessTime, getLastModificationTime, getCreationTime */ Time getLastAccessTime() const; /** Returns the time that this file was created. - @returns the time, or an invalid time if the file doesn't exist. + @returns the time, or the Unix Epoch if the file doesn't exist. @see getLastModificationTime, getLastAccessTime */ Time getCreationTime() const; @@ -560,6 +562,23 @@ ignoreHiddenFiles = 4 /**< Add this flag to avoid returning any hidden files in the results. */ }; + enum class FollowSymlinks + { + /** Requests that a file system traversal should not follow any symbolic links. */ + no, + + /** Requests that a file system traversal may follow symbolic links, but should attempt to + skip any symbolic links to directories that may cause a cycle. + */ + noCycles, + + /** Requests that a file system traversal follow all symbolic links. Use with care, as this + may produce inconsistent results, or fail to terminate, if the filesystem contains cycles + due to symbolic links. + */ + yes + }; + /** Searches this directory for files matching a wildcard pattern. Assuming that this file is a directory, this method will search it @@ -572,13 +591,15 @@ @param searchRecursively if true, all subdirectories will be recursed into to do an exhaustive search @param wildCardPattern the filename pattern to search for, e.g. "*.txt" + @param followSymlinks the method that should be used to handle symbolic links @returns the set of files that were found @see getNumberOfChildFiles, RangedDirectoryIterator */ Array findChildFiles (int whatToLookFor, bool searchRecursively, - const String& wildCardPattern = "*") const; + const String& wildCardPattern = "*", + FollowSymlinks followSymlinks = FollowSymlinks::yes) const; /** Searches inside a directory for files matching a wildcard pattern. Note that there's a newer, better version of this method which returns the results @@ -586,7 +607,8 @@ mainly for legacy code to use. */ int findChildFiles (Array& results, int whatToLookFor, - bool searchRecursively, const String& wildCardPattern = "*") const; + bool searchRecursively, const String& wildCardPattern = "*", + FollowSymlinks followSymlinks = FollowSymlinks::yes) const; /** Searches inside a directory and counts how many files match a wildcard pattern. @@ -942,7 +964,10 @@ @see globalApplicationsDirectory */ - globalApplicationsDirectoryX86 + globalApplicationsDirectoryX86, + + /** On a Windows machine returns the %LOCALAPPDATA% folder. */ + windowsLocalAppData #endif }; diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_FileInputStream.cpp juce-7.0.0~ds0/modules/juce_core/files/juce_FileInputStream.cpp --- juce-6.1.5~ds0/modules/juce_core/files/juce_FileInputStream.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_FileInputStream.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_FileInputStream.h juce-7.0.0~ds0/modules/juce_core/files/juce_FileInputStream.h --- juce-6.1.5~ds0/modules/juce_core/files/juce_FileInputStream.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_FileInputStream.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_FileOutputStream.cpp juce-7.0.0~ds0/modules/juce_core/files/juce_FileOutputStream.cpp --- juce-6.1.5~ds0/modules/juce_core/files/juce_FileOutputStream.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_FileOutputStream.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_FileOutputStream.h juce-7.0.0~ds0/modules/juce_core/files/juce_FileOutputStream.h --- juce-6.1.5~ds0/modules/juce_core/files/juce_FileOutputStream.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_FileOutputStream.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_FileSearchPath.cpp juce-7.0.0~ds0/modules/juce_core/files/juce_FileSearchPath.cpp --- juce-6.1.5~ds0/modules/juce_core/files/juce_FileSearchPath.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_FileSearchPath.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_FileSearchPath.h juce-7.0.0~ds0/modules/juce_core/files/juce_FileSearchPath.h --- juce-6.1.5~ds0/modules/juce_core/files/juce_FileSearchPath.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_FileSearchPath.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_MemoryMappedFile.h juce-7.0.0~ds0/modules/juce_core/files/juce_MemoryMappedFile.h --- juce-6.1.5~ds0/modules/juce_core/files/juce_MemoryMappedFile.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_MemoryMappedFile.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_RangedDirectoryIterator.cpp juce-7.0.0~ds0/modules/juce_core/files/juce_RangedDirectoryIterator.cpp --- juce-6.1.5~ds0/modules/juce_core/files/juce_RangedDirectoryIterator.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_RangedDirectoryIterator.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -39,11 +39,13 @@ RangedDirectoryIterator::RangedDirectoryIterator (const File& directory, bool isRecursive, const String& wildCard, - int whatToLookFor) + int whatToLookFor, + File::FollowSymlinks followSymlinks) : iterator (new DirectoryIterator (directory, isRecursive, wildCard, - whatToLookFor)) + whatToLookFor, + followSymlinks)) { entry.iterator = iterator; increment(); diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_RangedDirectoryIterator.h juce-7.0.0~ds0/modules/juce_core/files/juce_RangedDirectoryIterator.h --- juce-6.1.5~ds0/modules/juce_core/files/juce_RangedDirectoryIterator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_RangedDirectoryIterator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -118,11 +118,13 @@ separated by a semi-colon or comma, e.g. "*.jpg;*.png" @param whatToLookFor a value from the File::TypesOfFileToFind enum, specifying whether to look for files, directories, or both. + @param followSymlinks the policy to use when symlinks are encountered */ RangedDirectoryIterator (const File& directory, bool isRecursive, const String& wildCard = "*", - int whatToLookFor = File::findFiles); + int whatToLookFor = File::findFiles, + File::FollowSymlinks followSymlinks = File::FollowSymlinks::yes); /** Returns true if both iterators are in their end/sentinel state, otherwise returns false. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_TemporaryFile.cpp juce-7.0.0~ds0/modules/juce_core/files/juce_TemporaryFile.cpp --- juce-6.1.5~ds0/modules/juce_core/files/juce_TemporaryFile.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_TemporaryFile.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -23,6 +23,23 @@ namespace juce { +// Using Random::getSystemRandom() can be a bit dangerous in multithreaded contexts! +class LockedRandom +{ +public: + int nextInt() + { + const ScopedLock lock (mutex); + return random.nextInt(); + } + +private: + CriticalSection mutex; + Random random; +}; + +static LockedRandom lockedRandom; + static File createTempFile (const File& parentDirectory, String name, const String& suffix, int optionFlags) { @@ -34,7 +51,7 @@ TemporaryFile::TemporaryFile (const String& suffix, const int optionFlags) : temporaryFile (createTempFile (File::getSpecialLocation (File::tempDirectory), - "temp_" + String::toHexString (Random::getSystemRandom().nextInt()), + "temp_" + String::toHexString (lockedRandom.nextInt()), suffix, optionFlags)), targetFile() { @@ -43,7 +60,7 @@ TemporaryFile::TemporaryFile (const File& target, const int optionFlags) : temporaryFile (createTempFile (target.getParentDirectory(), target.getFileNameWithoutExtension() - + "_temp" + String::toHexString (Random::getSystemRandom().nextInt()), + + "_temp" + String::toHexString (lockedRandom.nextInt()), target.getFileExtension(), optionFlags)), targetFile (target) { diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_TemporaryFile.h juce-7.0.0~ds0/modules/juce_core/files/juce_TemporaryFile.h --- juce-6.1.5~ds0/modules/juce_core/files/juce_TemporaryFile.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_TemporaryFile.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_WildcardFileFilter.cpp juce-7.0.0~ds0/modules/juce_core/files/juce_WildcardFileFilter.cpp --- juce-6.1.5~ds0/modules/juce_core/files/juce_WildcardFileFilter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_WildcardFileFilter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/files/juce_WildcardFileFilter.h juce-7.0.0~ds0/modules/juce_core/files/juce_WildcardFileFilter.h --- juce-6.1.5~ds0/modules/juce_core/files/juce_WildcardFileFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/files/juce_WildcardFileFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/javascript/juce_Javascript.cpp juce-7.0.0~ds0/modules/juce_core/javascript/juce_Javascript.cpp --- juce-6.1.5~ds0/modules/juce_core/javascript/juce_Javascript.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/javascript/juce_Javascript.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/javascript/juce_Javascript.h juce-7.0.0~ds0/modules/juce_core/javascript/juce_Javascript.h --- juce-6.1.5~ds0/modules/juce_core/javascript/juce_Javascript.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/javascript/juce_Javascript.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/javascript/juce_JSON.cpp juce-7.0.0~ds0/modules/juce_core/javascript/juce_JSON.cpp --- juce-6.1.5~ds0/modules/juce_core/javascript/juce_JSON.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/javascript/juce_JSON.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/javascript/juce_JSON.h juce-7.0.0~ds0/modules/juce_core/javascript/juce_JSON.h --- juce-6.1.5~ds0/modules/juce_core/javascript/juce_JSON.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/javascript/juce_JSON.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/juce_core.cpp juce-7.0.0~ds0/modules/juce_core/juce_core.cpp --- juce-6.1.5~ds0/modules/juce_core/juce_core.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/juce_core.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -128,6 +128,7 @@ //============================================================================== #include "containers/juce_AbstractFifo.cpp" #include "containers/juce_ArrayBase.cpp" +#include "containers/juce_ListenerList.cpp" #include "containers/juce_NamedValueSet.cpp" #include "containers/juce_OwnedArray.cpp" #include "containers/juce_PropertySet.cpp" @@ -248,6 +249,9 @@ #endif +#include "files/juce_common_MimeTypes.h" +#include "files/juce_common_MimeTypes.cpp" +#include "native/juce_android_AndroidDocument.cpp" #include "threads/juce_HighResolutionTimer.cpp" #include "threads/juce_WaitableEvent.cpp" #include "network/juce_URL.cpp" @@ -261,6 +265,8 @@ //============================================================================== #if JUCE_UNIT_TESTS #include "containers/juce_HashMap_test.cpp" + + #include "containers/juce_Optional_test.cpp" #endif //============================================================================== diff -Nru juce-6.1.5~ds0/modules/juce_core/juce_core.h juce-7.0.0~ds0/modules/juce_core/juce_core.h --- juce-6.1.5~ds0/modules/juce_core/juce_core.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/juce_core.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -32,7 +32,7 @@ ID: juce_core vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE core classes description: The essential set of basic JUCE classes, as required by all the other JUCE modules. Includes text, container, memory, threading and i/o functionality. website: http://www.juce.com/juce @@ -244,6 +244,7 @@ #include "memory/juce_ReferenceCountedObject.h" #include "memory/juce_ScopedPointer.h" #include "memory/juce_OptionalScopedPointer.h" +#include "containers/juce_Optional.h" #include "containers/juce_ScopedValueSetter.h" #include "memory/juce_Singleton.h" #include "memory/juce_WeakReference.h" @@ -342,6 +343,7 @@ #include "memory/juce_SharedResourcePointer.h" #include "memory/juce_AllocationHooks.h" #include "memory/juce_Reservoir.h" +#include "files/juce_AndroidDocument.h" #if JUCE_CORE_INCLUDE_OBJC_HELPERS && (JUCE_MAC || JUCE_IOS) #include "native/juce_mac_ObjCHelpers.h" diff -Nru juce-6.1.5~ds0/modules/juce_core/juce_core.mm juce-7.0.0~ds0/modules/juce_core/juce_core.mm --- juce-6.1.5~ds0/modules/juce_core/juce_core.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/juce_core.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/logging/juce_FileLogger.cpp juce-7.0.0~ds0/modules/juce_core/logging/juce_FileLogger.cpp --- juce-6.1.5~ds0/modules/juce_core/logging/juce_FileLogger.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/logging/juce_FileLogger.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/logging/juce_FileLogger.h juce-7.0.0~ds0/modules/juce_core/logging/juce_FileLogger.h --- juce-6.1.5~ds0/modules/juce_core/logging/juce_FileLogger.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/logging/juce_FileLogger.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/logging/juce_Logger.cpp juce-7.0.0~ds0/modules/juce_core/logging/juce_Logger.cpp --- juce-6.1.5~ds0/modules/juce_core/logging/juce_Logger.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/logging/juce_Logger.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/logging/juce_Logger.h juce-7.0.0~ds0/modules/juce_core/logging/juce_Logger.h --- juce-6.1.5~ds0/modules/juce_core/logging/juce_Logger.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/logging/juce_Logger.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/maths/juce_BigInteger.cpp juce-7.0.0~ds0/modules/juce_core/maths/juce_BigInteger.cpp --- juce-6.1.5~ds0/modules/juce_core/maths/juce_BigInteger.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/maths/juce_BigInteger.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/maths/juce_BigInteger.h juce-7.0.0~ds0/modules/juce_core/maths/juce_BigInteger.h --- juce-6.1.5~ds0/modules/juce_core/maths/juce_BigInteger.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/maths/juce_BigInteger.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/maths/juce_Expression.cpp juce-7.0.0~ds0/modules/juce_core/maths/juce_Expression.cpp --- juce-6.1.5~ds0/modules/juce_core/maths/juce_Expression.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/maths/juce_Expression.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/maths/juce_Expression.h juce-7.0.0~ds0/modules/juce_core/maths/juce_Expression.h --- juce-6.1.5~ds0/modules/juce_core/maths/juce_Expression.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/maths/juce_Expression.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/maths/juce_MathsFunctions.h juce-7.0.0~ds0/modules/juce_core/maths/juce_MathsFunctions.h --- juce-6.1.5~ds0/modules/juce_core/maths/juce_MathsFunctions.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/maths/juce_MathsFunctions.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -175,8 +175,8 @@ } /** Scans an array of values, returning the minimum value that it contains. */ -template -Type findMinimum (const Type* data, int numValues) +template +Type findMinimum (const Type* data, Size numValues) { if (numValues <= 0) return Type (0); @@ -195,8 +195,8 @@ } /** Scans an array of values, returning the maximum value that it contains. */ -template -Type findMaximum (const Type* values, int numValues) +template +Type findMaximum (const Type* values, Size numValues) { if (numValues <= 0) return Type (0); diff -Nru juce-6.1.5~ds0/modules/juce_core/maths/juce_NormalisableRange.h juce-7.0.0~ds0/modules/juce_core/maths/juce_NormalisableRange.h --- juce-6.1.5~ds0/modules/juce_core/maths/juce_NormalisableRange.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/maths/juce_NormalisableRange.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/maths/juce_Random.cpp juce-7.0.0~ds0/modules/juce_core/maths/juce_Random.cpp --- juce-6.1.5~ds0/modules/juce_core/maths/juce_Random.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/maths/juce_Random.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -32,10 +32,6 @@ setSeedRandomly(); } -Random::~Random() noexcept -{ -} - void Random::setSeed (const int64 newSeed) noexcept { if (this == &getSystemRandom()) diff -Nru juce-6.1.5~ds0/modules/juce_core/maths/juce_Random.h juce-7.0.0~ds0/modules/juce_core/maths/juce_Random.h --- juce-6.1.5~ds0/modules/juce_core/maths/juce_Random.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/maths/juce_Random.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -50,9 +50,6 @@ */ Random(); - /** Destructor. */ - ~Random() noexcept; - /** Returns the next random 32 bit integer. @returns a random integer from the full range 0x80000000 to 0x7fffffff */ diff -Nru juce-6.1.5~ds0/modules/juce_core/maths/juce_Range.h juce-7.0.0~ds0/modules/juce_core/maths/juce_Range.h --- juce-6.1.5~ds0/modules/juce_core/maths/juce_Range.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/maths/juce_Range.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -63,14 +63,14 @@ } /** Returns a range with a given start and length. */ - static Range withStartAndLength (const ValueType startValue, const ValueType length) noexcept + JUCE_NODISCARD static Range withStartAndLength (const ValueType startValue, const ValueType length) noexcept { jassert (length >= ValueType()); return Range (startValue, startValue + length); } /** Returns a range with the specified start position and a length of zero. */ - constexpr static Range emptyRange (const ValueType start) noexcept + JUCE_NODISCARD constexpr static Range emptyRange (const ValueType start) noexcept { return Range (start, start); } @@ -104,13 +104,13 @@ If the new start position is higher than the current end of the range, the end point will be pushed along to equal it, returning an empty range at the new position. */ - constexpr Range withStart (const ValueType newStart) const noexcept + JUCE_NODISCARD constexpr Range withStart (const ValueType newStart) const noexcept { return Range (newStart, jmax (newStart, end)); } /** Returns a range with the same length as this one, but moved to have the given start position. */ - constexpr Range movedToStartAt (const ValueType newStart) const noexcept + JUCE_NODISCARD constexpr Range movedToStartAt (const ValueType newStart) const noexcept { return Range (newStart, end + (newStart - start)); } @@ -130,13 +130,13 @@ If the new end position is below the current start of the range, the start point will be pushed back to equal the new end point. */ - constexpr Range withEnd (const ValueType newEnd) const noexcept + JUCE_NODISCARD constexpr Range withEnd (const ValueType newEnd) const noexcept { return Range (jmin (start, newEnd), newEnd); } /** Returns a range with the same length as this one, but moved to have the given end position. */ - constexpr Range movedToEndAt (const ValueType newEnd) const noexcept + JUCE_NODISCARD constexpr Range movedToEndAt (const ValueType newEnd) const noexcept { return Range (start + (newEnd - end), newEnd); } @@ -152,7 +152,7 @@ /** Returns a range with the same start as this one, but a different length. Lengths less than zero are treated as zero. */ - constexpr Range withLength (const ValueType newLength) const noexcept + JUCE_NODISCARD constexpr Range withLength (const ValueType newLength) const noexcept { return Range (start, start + newLength); } @@ -161,7 +161,7 @@ given amount. @returns The returned range will be (start - amount, end + amount) */ - constexpr Range expanded (ValueType amount) const noexcept + JUCE_NODISCARD constexpr Range expanded (ValueType amount) const noexcept { return Range (start - amount, end + amount); } @@ -231,21 +231,21 @@ /** Returns the range that is the intersection of the two ranges, or an empty range with an undefined start position if they don't overlap. */ - constexpr Range getIntersectionWith (Range other) const noexcept + JUCE_NODISCARD constexpr Range getIntersectionWith (Range other) const noexcept { return Range (jmax (start, other.start), jmin (end, other.end)); } /** Returns the smallest range that contains both this one and the other one. */ - constexpr Range getUnionWith (Range other) const noexcept + JUCE_NODISCARD constexpr Range getUnionWith (Range other) const noexcept { return Range (jmin (start, other.start), jmax (end, other.end)); } /** Returns the smallest range that contains both this one and the given value. */ - constexpr Range getUnionWith (const ValueType valueToInclude) const noexcept + JUCE_NODISCARD constexpr Range getUnionWith (const ValueType valueToInclude) const noexcept { return Range (jmin (valueToInclude, start), jmax (valueToInclude, end)); diff -Nru juce-6.1.5~ds0/modules/juce_core/maths/juce_StatisticsAccumulator.h juce-7.0.0~ds0/modules/juce_core/maths/juce_StatisticsAccumulator.h --- juce-6.1.5~ds0/modules/juce_core/maths/juce_StatisticsAccumulator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/maths/juce_StatisticsAccumulator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_AllocationHooks.cpp juce-7.0.0~ds0/modules/juce_core/memory/juce_AllocationHooks.cpp --- juce-6.1.5~ds0/modules/juce_core/memory/juce_AllocationHooks.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_AllocationHooks.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_AllocationHooks.h juce-7.0.0~ds0/modules/juce_core/memory/juce_AllocationHooks.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_AllocationHooks.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_AllocationHooks.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_Atomic.h juce-7.0.0~ds0/modules/juce_core/memory/juce_Atomic.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_Atomic.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_Atomic.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_ByteOrder.h juce-7.0.0~ds0/modules/juce_core/memory/juce_ByteOrder.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_ByteOrder.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_ByteOrder.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_ContainerDeletePolicy.h juce-7.0.0~ds0/modules/juce_core/memory/juce_ContainerDeletePolicy.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_ContainerDeletePolicy.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_ContainerDeletePolicy.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_HeapBlock.h juce-7.0.0~ds0/modules/juce_core/memory/juce_HeapBlock.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_HeapBlock.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_HeapBlock.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h juce-7.0.0~ds0/modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_LeakedObjectDetector.h juce-7.0.0~ds0/modules/juce_core/memory/juce_LeakedObjectDetector.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_LeakedObjectDetector.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_LeakedObjectDetector.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_MemoryBlock.cpp juce-7.0.0~ds0/modules/juce_core/memory/juce_MemoryBlock.cpp --- juce-6.1.5~ds0/modules/juce_core/memory/juce_MemoryBlock.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_MemoryBlock.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_MemoryBlock.h juce-7.0.0~ds0/modules/juce_core/memory/juce_MemoryBlock.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_MemoryBlock.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_MemoryBlock.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_Memory.h juce-7.0.0~ds0/modules/juce_core/memory/juce_Memory.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_Memory.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_Memory.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_OptionalScopedPointer.h juce-7.0.0~ds0/modules/juce_core/memory/juce_OptionalScopedPointer.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_OptionalScopedPointer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_OptionalScopedPointer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_ReferenceCountedObject.h juce-7.0.0~ds0/modules/juce_core/memory/juce_ReferenceCountedObject.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_ReferenceCountedObject.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_ReferenceCountedObject.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_Reservoir.h juce-7.0.0~ds0/modules/juce_core/memory/juce_Reservoir.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_Reservoir.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_Reservoir.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,19 +2,16 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_ScopedPointer.h juce-7.0.0~ds0/modules/juce_core/memory/juce_ScopedPointer.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_ScopedPointer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_ScopedPointer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_SharedResourcePointer.h juce-7.0.0~ds0/modules/juce_core/memory/juce_SharedResourcePointer.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_SharedResourcePointer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_SharedResourcePointer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_Singleton.h juce-7.0.0~ds0/modules/juce_core/memory/juce_Singleton.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_Singleton.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_Singleton.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -184,7 +184,7 @@ #define JUCE_DECLARE_SINGLETON(Classname, doNotRecreateAfterDeletion) \ \ static juce::SingletonHolder singletonHolder; \ - friend decltype (singletonHolder); \ + friend juce::SingletonHolder; \ \ static Classname* JUCE_CALLTYPE getInstance() { return singletonHolder.get(); } \ static Classname* JUCE_CALLTYPE getInstanceWithoutCreating() noexcept { return singletonHolder.instance; } \ diff -Nru juce-6.1.5~ds0/modules/juce_core/memory/juce_WeakReference.h juce-7.0.0~ds0/modules/juce_core/memory/juce_WeakReference.h --- juce-6.1.5~ds0/modules/juce_core/memory/juce_WeakReference.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/memory/juce_WeakReference.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/misc/juce_ConsoleApplication.cpp juce-7.0.0~ds0/modules/juce_core/misc/juce_ConsoleApplication.cpp --- juce-6.1.5~ds0/modules/juce_core/misc/juce_ConsoleApplication.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/misc/juce_ConsoleApplication.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/misc/juce_ConsoleApplication.h juce-7.0.0~ds0/modules/juce_core/misc/juce_ConsoleApplication.h --- juce-6.1.5~ds0/modules/juce_core/misc/juce_ConsoleApplication.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/misc/juce_ConsoleApplication.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/misc/juce_Functional.h juce-7.0.0~ds0/modules/juce_core/misc/juce_Functional.h --- juce-6.1.5~ds0/modules/juce_core/misc/juce_Functional.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/misc/juce_Functional.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -36,6 +36,9 @@ template struct EqualityComparableToNullptr() != nullptr)>> : std::true_type {}; + + template + constexpr bool shouldCheckAgainstNullptr = EqualityComparableToNullptr::value; } // namespace detail #endif @@ -51,15 +54,19 @@ struct NullCheckedInvocation { template ::value, int> = 0> + std::enable_if_t, int> = 0> static void invoke (Callable&& fn, Args&&... args) { + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Waddress") + if (fn != nullptr) fn (std::forward (args)...); + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE } template ::value, int> = 0> + std::enable_if_t, int> = 0> static void invoke (Callable&& fn, Args&&... args) { fn (std::forward (args)...); @@ -69,4 +76,20 @@ static void invoke (std::nullptr_t, Args&&...) {} }; +/** Can be used to disable template constructors that would otherwise cause ambiguity with + compiler-generated copy and move constructors. + + Adapted from https://ericniebler.com/2013/08/07/universal-references-and-the-copy-constructo/ +*/ +template +using DisableIfSameOrDerived = typename std::enable_if_t>::value>; + +/** Copies an object, sets one of the copy's members to the specified value, and then returns the copy. */ +template +Object withMember (Object copy, Member OtherObject::* member, Member&& value) +{ + copy.*member = std::forward (value); + return copy; +} + } // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_core/misc/juce_Result.cpp juce-7.0.0~ds0/modules/juce_core/misc/juce_Result.cpp --- juce-6.1.5~ds0/modules/juce_core/misc/juce_Result.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/misc/juce_Result.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/misc/juce_Result.h juce-7.0.0~ds0/modules/juce_core/misc/juce_Result.h --- juce-6.1.5~ds0/modules/juce_core/misc/juce_Result.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/misc/juce_Result.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/misc/juce_RuntimePermissions.cpp juce-7.0.0~ds0/modules/juce_core/misc/juce_RuntimePermissions.cpp --- juce-6.1.5~ds0/modules/juce_core/misc/juce_RuntimePermissions.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/misc/juce_RuntimePermissions.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/misc/juce_RuntimePermissions.h juce-7.0.0~ds0/modules/juce_core/misc/juce_RuntimePermissions.h --- juce-6.1.5~ds0/modules/juce_core/misc/juce_RuntimePermissions.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/misc/juce_RuntimePermissions.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/misc/juce_Uuid.cpp juce-7.0.0~ds0/modules/juce_core/misc/juce_Uuid.cpp --- juce-6.1.5~ds0/modules/juce_core/misc/juce_Uuid.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/misc/juce_Uuid.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/misc/juce_Uuid.h juce-7.0.0~ds0/modules/juce_core/misc/juce_Uuid.h --- juce-6.1.5~ds0/modules/juce_core/misc/juce_Uuid.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/misc/juce_Uuid.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/misc/juce_WindowsRegistry.h juce-7.0.0~ds0/modules/juce_core/misc/juce_WindowsRegistry.h --- juce-6.1.5~ds0/modules/juce_core/misc/juce_WindowsRegistry.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/misc/juce_WindowsRegistry.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/java/app/com/rmsl/juce/FragmentOverlay.java juce-7.0.0~ds0/modules/juce_core/native/java/app/com/rmsl/juce/FragmentOverlay.java --- juce-6.1.5~ds0/modules/juce_core/native/java/app/com/rmsl/juce/FragmentOverlay.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/java/app/com/rmsl/juce/FragmentOverlay.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/java/app/com/rmsl/juce/JuceHTTPStream.java juce-7.0.0~ds0/modules/juce_core/native/java/app/com/rmsl/juce/JuceHTTPStream.java --- juce-6.1.5~ds0/modules/juce_core/native/java/app/com/rmsl/juce/JuceHTTPStream.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/java/app/com/rmsl/juce/JuceHTTPStream.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/java/app/com/rmsl/juce/JuceInvocationHandler.java juce-7.0.0~ds0/modules/juce_core/native/java/app/com/rmsl/juce/JuceInvocationHandler.java --- juce-6.1.5~ds0/modules/juce_core/native/java/app/com/rmsl/juce/JuceInvocationHandler.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/java/app/com/rmsl/juce/JuceInvocationHandler.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/javacore/app/com/rmsl/juce/JuceApp.java juce-7.0.0~ds0/modules/juce_core/native/javacore/app/com/rmsl/juce/JuceApp.java --- juce-6.1.5~ds0/modules/juce_core/native/javacore/app/com/rmsl/juce/JuceApp.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/javacore/app/com/rmsl/juce/JuceApp.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/javacore/init/com/rmsl/juce/Java.java juce-7.0.0~ds0/modules/juce_core/native/javacore/init/com/rmsl/juce/Java.java --- juce-6.1.5~ds0/modules/juce_core/native/javacore/init/com/rmsl/juce/Java.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/javacore/init/com/rmsl/juce/Java.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_android_AndroidDocument.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_android_AndroidDocument.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_android_AndroidDocument.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_android_AndroidDocument.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,1085 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2020 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +/* This is mainly used to pass implementation information from AndroidDocument to + AndroidDocumentIterator. This needs to be defined in a .cpp because it uses the internal + GlobalRef type. + + To preserve encapsulation, this struct should only contain information that would normally be + public, were internal types not in use. +*/ +struct AndroidDocument::NativeInfo +{ + #if JUCE_ANDROID + GlobalRef uri; + #endif +}; + +//============================================================================== +struct AndroidDocumentDetail +{ + ~AndroidDocumentDetail() = delete; // This struct is a single-file namespace + + struct Opt + { + Opt() = default; + + explicit Opt (int64 v) : value (v), valid (true) {} + + int64 value = 0; + bool valid = false; + }; + + static constexpr auto dirMime = "vnd.android.document/directory"; + + #if JUCE_ANDROID + /* + A very basic type that acts a bit like an iterator, in that it can be incremented, and read-from. + + Instances of this type can be passed to the constructor of AndroidDirectoryIterator to provide + stdlib-like iterator facilities. + */ + template + class AndroidIteratorEngine + { + public: + AndroidIteratorEngine (Columns columnsIn, jobject uri) + : columns (std::move (columnsIn)), + cursor { LocalRef { getEnv()->CallObjectMethod (AndroidContentUriResolver::getContentResolver().get(), + ContentResolver.query, + uri, + columns.getColumnNames().get(), + nullptr, + nullptr, + nullptr) } } + { + // Creating the cursor may throw if the document doesn't exist. + // In that case, cursor will still be null. + jniCheckHasExceptionOccurredAndClear(); + } + + auto read() const { return columns.readFromCursor (cursor.get()); } + + bool increment() + { + if (cursor.get() == nullptr) + return false; + + return getEnv()->CallBooleanMethod (cursor.get(), AndroidCursor.moveToNext); + } + + private: + Columns columns; + GlobalRef cursor; + }; + + template + static LocalRef makeStringArray (std::index_sequence, Args&&... args) + { + auto* env = getEnv(); + LocalRef array { env->NewObjectArray (sizeof... (args), JavaString, nullptr) }; + + int unused[] { (env->SetObjectArrayElement (array.get(), Ix, args.get()), 0)... }; + ignoreUnused (unused); + + return array; + } + + template + static LocalRef makeStringArray (Args&&... args) + { + return makeStringArray (std::make_index_sequence(), std::forward (args)...); + } + + static URL uriToUrl (jobject uri) + { + return URL (juceString ((jstring) getEnv()->CallObjectMethod (uri, AndroidUri.toString))); + } + + struct Columns + { + GlobalRef treeUri; + GlobalRefImpl idColumn; + + auto getColumnNames() const + { + return makeStringArray (idColumn); + } + + auto readFromCursor (jobject cursor) const + { + auto* env = getEnv(); + const auto idColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, idColumn.get()); + + const auto documentUri = [&] + { + if (idColumnIndex < 0) + return LocalRef{}; + + LocalRef documentId { (jstring) env->CallObjectMethod (cursor, AndroidCursor.getString, idColumnIndex) }; + return LocalRef { getEnv()->CallStaticObjectMethod (DocumentsContract21, + DocumentsContract21.buildDocumentUriUsingTree, + treeUri.get(), + documentId.get()) }; + }(); + + return AndroidDocument::fromDocument (uriToUrl (documentUri)); + } + }; + + using DocumentsContractIteratorEngine = AndroidIteratorEngine; + + static DocumentsContractIteratorEngine makeDocumentsContractIteratorEngine (const GlobalRef& uri) + { + const LocalRef documentId { getEnv()->CallStaticObjectMethod (DocumentsContract19, + DocumentsContract19.getDocumentId, + uri.get()) }; + const LocalRef childrenUri { getEnv()->CallStaticObjectMethod (DocumentsContract21, + DocumentsContract21.buildChildDocumentsUriUsingTree, + uri.get(), + documentId.get()) }; + + return DocumentsContractIteratorEngine { Columns { GlobalRef { uri }, + GlobalRefImpl { javaString("document_id") } }, + childrenUri.get() }; + } + + class RecursiveEngine + { + public: + explicit RecursiveEngine (GlobalRef uri) + : engine (makeDocumentsContractIteratorEngine (uri)) {} + + AndroidDocument read() const + { + return subIterator != nullptr ? subIterator->read() : engine.read(); + } + + bool increment() + { + if (directory && subIterator == nullptr) + subIterator = std::make_unique (engine.read().getNativeInfo().uri); + + if (subIterator != nullptr) + { + if (subIterator->increment()) + return true; + + subIterator = nullptr; + } + + if (! engine.increment()) + return false; + + directory = engine.read().getInfo().isDirectory(); + return true; + } + + private: + DocumentsContractIteratorEngine engine; + std::unique_ptr subIterator; + bool directory = false; + }; + + enum { FLAG_GRANT_READ_URI_PERMISSION = 1, FLAG_GRANT_WRITE_URI_PERMISSION = 2 }; + + static void setPermissions (const URL& url, jmethodID func) + { + if (getAndroidSDKVersion() < 19) + return; + + const auto javaUri = urlToUri (url); + + if (const auto resolver = AndroidContentUriResolver::getContentResolver()) + { + const jint flags = FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION; + getEnv()->CallVoidMethod (resolver, func, javaUri.get(), flags); + jniCheckHasExceptionOccurredAndClear(); + } + } + #endif + + struct DirectoryIteratorEngine + { + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996) + DirectoryIteratorEngine (const File& dir, bool recursive) + : iterator (dir, recursive, "*", File::findFilesAndDirectories) {} + JUCE_END_IGNORE_WARNINGS_MSVC + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + auto read() const { return AndroidDocument::fromFile (iterator.getFile()); } + bool increment() { return iterator.next(); } + DirectoryIterator iterator; + }; + +}; + +//============================================================================== +class AndroidDocumentInfo::Args +{ +public: + using Detail = AndroidDocumentDetail; + + Args withName (String x) const { return with (&Args::name, std::move (x)); } + Args withType (String x) const { return with (&Args::type, std::move (x)); } + Args withFlags (int x) const { return with (&Args::flags, x); } + Args withSize (Detail::Opt x) const { return with (&Args::sizeInBytes, x); } + Args withModified (Detail::Opt x) const { return with (&Args::lastModified, x); } + Args withReadPermission (bool x) const { return with (&Args::readPermission, x); } + Args withWritePermission (bool x) const { return with (&Args::writePermission, x); } + + String name; + String type; + Detail::Opt sizeInBytes, lastModified; + int flags = 0; + bool readPermission = false, writePermission = false; + + static int getFlagsForFile (const File& file) + { + int flags = 0; + + if (file.hasReadAccess()) + flags |= AndroidDocumentInfo::flagSupportsCopy; + + if (file.hasWriteAccess()) + flags |= AndroidDocumentInfo::flagSupportsWrite + | AndroidDocumentInfo::flagDirSupportsCreate + | AndroidDocumentInfo::flagSupportsMove + | AndroidDocumentInfo::flagSupportsRename + | AndroidDocumentInfo::flagSupportsDelete; + + return flags; + } + + AndroidDocumentInfo build() const + { + return AndroidDocumentInfo (*this); + } + +private: + template + Args with (Value Args::* member, Value v) const + { + auto copy = *this; + copy.*member = std::move (v); + return copy; + } +}; + +AndroidDocumentInfo::AndroidDocumentInfo (Args args) + : name (args.name), + type (args.type), + lastModified (args.lastModified.value), + sizeInBytes (args.sizeInBytes.value), + nativeFlags (args.flags), + juceFlags (flagExists + | (args.lastModified.valid ? flagValidModified : 0) + | (args.sizeInBytes.valid ? flagValidSize : 0) + | (args.readPermission ? flagHasReadPermission : 0) + | (args.writePermission ? flagHasWritePermission : 0)) +{ +} + +bool AndroidDocumentInfo::isDirectory() const { return type == AndroidDocumentDetail::dirMime; } + +//============================================================================== +class AndroidDocument::Pimpl +{ +public: + Pimpl() = default; + Pimpl (const Pimpl&) = default; + Pimpl (Pimpl&&) noexcept = default; + Pimpl& operator= (const Pimpl&) = default; + Pimpl& operator= (Pimpl&&) noexcept = default; + + virtual ~Pimpl() = default; + virtual std::unique_ptr clone() const = 0; + virtual bool deleteDocument() const = 0; + virtual std::unique_ptr createInputStream() const = 0; + virtual std::unique_ptr createOutputStream() const = 0; + virtual AndroidDocumentInfo getInfo() const = 0; + virtual URL getUrl() const = 0; + virtual NativeInfo getNativeInfo() const = 0; + + virtual std::unique_ptr copyDocumentToParentDocument (const Pimpl&) const + { + // This function is not supported on the current platform. + jassertfalse; + return {}; + } + + virtual std::unique_ptr moveDocumentFromParentToParent (const Pimpl&, const Pimpl&) const + { + // This function is not supported on the current platform. + jassertfalse; + return {}; + } + + virtual std::unique_ptr renameTo (const String&) const + { + // This function is not supported on the current platform. + jassertfalse; + return {}; + } + + virtual std::unique_ptr createChildDocumentWithTypeAndName (const String&, const String&) const + { + // This function is not supported on the current platform. + jassertfalse; + return {}; + } + + File getFile() const { return getUrl().getLocalFile(); } + + static const Pimpl& getPimpl (const AndroidDocument& doc) { return *doc.pimpl; } +}; + +//============================================================================== +struct AndroidDocument::Utils +{ + using Detail = AndroidDocumentDetail; + + ~Utils() = delete; // This stuct is a single-file namespace + + #if JUCE_ANDROID + template struct VersionTag { int version; }; + + class MimeConverter + { + public: + String getMimeTypeFromExtension (const String& str) const + { + const auto javaStr = javaString (str); + return juceString ((jstring) getEnv()->CallObjectMethod (map.get(), + AndroidMimeTypeMap.getMimeTypeFromExtension, + javaStr.get())); + } + + String getExtensionFromMimeType (const String& str) const + { + const auto javaStr = javaString (str); + return juceString ((jstring) getEnv()->CallObjectMethod (map.get(), + AndroidMimeTypeMap.getExtensionFromMimeType, + javaStr.get())); + } + + private: + GlobalRef map { LocalRef { getEnv()->CallStaticObjectMethod (AndroidMimeTypeMap, + AndroidMimeTypeMap.getSingleton) } }; + }; + + class AndroidDocumentPimplApi19 : public Pimpl + { + public: + AndroidDocumentPimplApi19() = default; + + explicit AndroidDocumentPimplApi19 (const URL& uriIn) + : AndroidDocumentPimplApi19 (urlToUri (uriIn)) {} + + explicit AndroidDocumentPimplApi19 (const LocalRef& uriIn) + : uri (uriIn) {} + + std::unique_ptr clone() const override { return std::make_unique (*this); } + + bool deleteDocument() const override + { + if (const auto resolver = AndroidContentUriResolver::getContentResolver()) + { + return getEnv()->CallStaticBooleanMethod (DocumentsContract19, + DocumentsContract19.deleteDocument, + resolver.get(), + uri.get()); + } + + return false; + } + + std::unique_ptr createInputStream() const override + { + return makeStream (AndroidStreamHelpers::StreamKind::input); + } + + std::unique_ptr createOutputStream() const override + { + return makeStream (AndroidStreamHelpers::StreamKind::output); + } + + AndroidDocumentInfo getInfo() const override + { + struct Columns + { + auto getColumnNames() const + { + return Detail::makeStringArray (flagsColumn, nameColumn, mimeColumn, idColumn, modifiedColumn, sizeColumn); + } + + auto readFromCursor (jobject cursor) const + { + auto* env = getEnv(); + + const auto flagsColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, flagsColumn.get()); + const auto nameColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, nameColumn.get()); + const auto mimeColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, mimeColumn.get()); + const auto idColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, idColumn.get()); + const auto modColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, modifiedColumn.get()); + const auto sizeColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, sizeColumn.get()); + + const auto indices = { flagsColumnIndex, nameColumnIndex, mimeColumnIndex, idColumnIndex, modColumnIndex, sizeColumnIndex }; + + if (std::any_of (indices.begin(), indices.end(), [] (auto index) { return index < 0; })) + return AndroidDocumentInfo::Args{}; + + const LocalRef nameString { (jstring) env->CallObjectMethod (cursor, AndroidCursor.getString, nameColumnIndex) }; + const LocalRef mimeString { (jstring) env->CallObjectMethod (cursor, AndroidCursor.getString, mimeColumnIndex) }; + + const auto readOpt = [&] (int column) -> Detail::Opt + { + const auto missing = env->CallBooleanMethod (cursor, AndroidCursor.isNull, column); + + if (missing) + return {}; + + return Detail::Opt { env->CallLongMethod (cursor, AndroidCursor.getLong, column) }; + }; + + return AndroidDocumentInfo::Args{}.withName (juceString (nameString.get())) + .withType (juceString (mimeString.get())) + .withFlags (env->CallIntMethod (cursor, AndroidCursor.getInt, flagsColumnIndex)) + .withModified (readOpt (modColumnIndex)) + .withSize (readOpt (sizeColumnIndex)); + } + + GlobalRefImpl flagsColumn { javaString ("flags") }; + GlobalRefImpl nameColumn { javaString ("_display_name") }; + GlobalRefImpl mimeColumn { javaString ("mime_type") }; + GlobalRefImpl idColumn { javaString ("document_id") }; + GlobalRefImpl modifiedColumn { javaString ("last_modified") }; + GlobalRefImpl sizeColumn { javaString ("_size") }; + }; + + Detail::AndroidIteratorEngine iterator { Columns{}, uri }; + + if (! iterator.increment()) + return AndroidDocumentInfo{}; + + auto* env = getEnv(); + auto ctx = getAppContext(); + + const auto hasPermission = [&] (auto permission) + { + return env->CallIntMethod (ctx, AndroidContext.checkCallingOrSelfUriPermission, uri.get(), permission) == 0; + }; + + return iterator.read() + .withReadPermission (hasPermission (Detail::FLAG_GRANT_READ_URI_PERMISSION)) + .withWritePermission (hasPermission (Detail::FLAG_GRANT_WRITE_URI_PERMISSION)) + .build(); + } + + URL getUrl() const override + { + return Detail::uriToUrl (uri); + } + + NativeInfo getNativeInfo() const override { return { uri }; } + + private: + template + std::unique_ptr makeStream (AndroidStreamHelpers::StreamKind kind) const + { + auto stream = AndroidStreamHelpers::createStream (uri, kind); + + return stream.get() != nullptr ? std::make_unique (std::move (stream)) + : nullptr; + } + + GlobalRef uri; + }; + + //============================================================================== + class AndroidDocumentPimplApi21 : public AndroidDocumentPimplApi19 + { + public: + using AndroidDocumentPimplApi19::AndroidDocumentPimplApi19; + + std::unique_ptr clone() const override { return std::make_unique (*this); } + + std::unique_ptr createChildDocumentWithTypeAndName (const String& type, const String& name) const override + { + return Utils::createPimplForSdk (LocalRef { getEnv()->CallStaticObjectMethod (DocumentsContract21, + DocumentsContract21.createDocument, + AndroidContentUriResolver::getContentResolver().get(), + getNativeInfo().uri.get(), + javaString (type).get(), + javaString (name).get()) }); + } + + std::unique_ptr renameTo (const String& name) const override + { + if (const auto resolver = AndroidContentUriResolver::getContentResolver()) + { + return Utils::createPimplForSdk (LocalRef { getEnv()->CallStaticObjectMethod (DocumentsContract21, + DocumentsContract21.renameDocument, + resolver.get(), + getNativeInfo().uri.get(), + javaString (name).get()) }); + } + + return nullptr; + } + }; + + //============================================================================== + class AndroidDocumentPimplApi24 final : public AndroidDocumentPimplApi21 + { + public: + using AndroidDocumentPimplApi21::AndroidDocumentPimplApi21; + + std::unique_ptr clone() const override { return std::make_unique (*this); } + + std::unique_ptr copyDocumentToParentDocument (const Pimpl& target) const override + { + if (target.getNativeInfo().uri == nullptr) + { + // Cannot copy to a non-URI-based AndroidDocument + return {}; + } + + return Utils::createPimplForSdk (LocalRef { getEnv()->CallStaticObjectMethod (DocumentsContract24, + DocumentsContract24.copyDocument, + AndroidContentUriResolver::getContentResolver().get(), + getNativeInfo().uri.get(), + target.getNativeInfo().uri.get()) }); + } + + std::unique_ptr moveDocumentFromParentToParent (const Pimpl& currentParent, const Pimpl& newParent) const override + { + if (currentParent.getNativeInfo().uri == nullptr || newParent.getNativeInfo().uri == nullptr) + { + // Cannot move document between non-URI-based AndroidDocuments + return {}; + } + + return Utils::createPimplForSdk (LocalRef { getEnv()->CallStaticObjectMethod (DocumentsContract24, + DocumentsContract24.moveDocument, + AndroidContentUriResolver::getContentResolver().get(), + getNativeInfo().uri.get(), + currentParent.getNativeInfo().uri.get(), + newParent.getNativeInfo().uri.get()) }); + } + }; + + static std::unique_ptr createPimplForSdk (const LocalRef& uri) + { + if (jniCheckHasExceptionOccurredAndClear()) + return nullptr; + + return createPimplForSdkImpl (uri, + VersionTag { 24 }, + VersionTag { 21 }, + VersionTag { 19 }); + } + + static std::unique_ptr createPimplForSdkImpl (const LocalRef&) + { + // Failed to find a suitable implementation for this platform + jassertfalse; + return nullptr; + } + + template + static std::unique_ptr createPimplForSdkImpl (const LocalRef& uri, + VersionTag head, + VersionTag... tail) + { + if (head.version <= getAndroidSDKVersion()) + return std::make_unique (uri); + + return createPimplForSdkImpl (uri, tail...); + } + + #else + class MimeConverter + { + public: + static String getMimeTypeFromExtension (const String& str) + { + return MimeTypeTable::getMimeTypesForFileExtension (str)[0]; + } + + static String getExtensionFromMimeType (const String& str) + { + return MimeTypeTable::getFileExtensionsForMimeType (str)[0]; + } + }; + #endif + + //============================================================================== + class AndroidDocumentPimplFile final : public Pimpl + { + public: + explicit AndroidDocumentPimplFile (const File& f) + : file (f) + { + } + + std::unique_ptr clone() const override { return std::make_unique (*this); } + + bool deleteDocument() const override + { + return file.deleteRecursively (false); + } + + std::unique_ptr renameTo (const String& name) const override + { + const auto target = file.getSiblingFile (name); + + return file.moveFileTo (target) ? std::make_unique (target) + : nullptr; + } + + std::unique_ptr createInputStream() const override { return file.createInputStream(); } + + std::unique_ptr createOutputStream() const override + { + auto result = file.createOutputStream(); + result->setPosition (0); + result->truncate(); + return result; + } + + std::unique_ptr copyDocumentToParentDocument (const Pimpl& target) const override + { + const auto parent = target.getFile(); + + if (parent == File()) + return nullptr; + + const auto actual = parent.getChildFile (file.getFileName()); + + if (actual.exists()) + return nullptr; + + const auto success = file.isDirectory() ? file.copyDirectoryTo (actual) + : file.copyFileTo (actual); + + return success ? std::make_unique (actual) + : nullptr; + } + + std::unique_ptr createChildDocumentWithTypeAndName (const String& type, + const String& name) const override + { + const auto extension = mimeConverter.getExtensionFromMimeType (type); + const auto target = file.getChildFile (extension.isNotEmpty() ? name + "." + extension : name); + + if (! target.exists() && (type == Detail::dirMime ? target.createDirectory() : target.create())) + return std::make_unique (target); + + return nullptr; + } + + std::unique_ptr moveDocumentFromParentToParent (const Pimpl& currentParentPimpl, + const Pimpl& newParentPimpl) const override + { + const auto currentParent = currentParentPimpl.getFile(); + const auto newParent = newParentPimpl.getFile(); + + if (! file.isAChildOf (currentParent) || newParent == File()) + return nullptr; + + const auto target = newParent.getChildFile (file.getFileName()); + + if (target.exists() || ! file.moveFileTo (target)) + return nullptr; + + return std::make_unique (target); + } + + AndroidDocumentInfo getInfo() const override + { + if (! file.exists()) + return AndroidDocumentInfo{}; + + const auto size = file.getSize(); + const auto extension = file.getFileExtension().removeCharacters (".").toLowerCase(); + const auto type = file.isDirectory() ? Detail::dirMime + : mimeConverter.getMimeTypeFromExtension (extension); + + return AndroidDocumentInfo::Args{}.withName (file.getFileName()) + .withType (type.isNotEmpty() ? type : "application/octet-stream") + .withFlags (AndroidDocumentInfo::Args::getFlagsForFile (file)) + .withModified (Detail::Opt { file.getLastModificationTime().toMilliseconds() }) + .withSize (size != 0 ? Detail::Opt { size } : Detail::Opt{}) + .withReadPermission (file.hasReadAccess()) + .withWritePermission (file.hasWriteAccess()) + .build(); + } + + URL getUrl() const override { return URL (file); } + + NativeInfo getNativeInfo() const override { return {}; } + + private: + File file; + MimeConverter mimeConverter; + }; +}; + +//============================================================================== +void AndroidDocumentPermission::takePersistentReadWriteAccess (const URL& url) +{ + #if JUCE_ANDROID + AndroidDocumentDetail::setPermissions (url, ContentResolver19.takePersistableUriPermission); + #else + ignoreUnused (url); + #endif +} + +void AndroidDocumentPermission::releasePersistentReadWriteAccess (const URL& url) +{ + #if JUCE_ANDROID + AndroidDocumentDetail::setPermissions (url, ContentResolver19.releasePersistableUriPermission); + #else + ignoreUnused (url); + #endif +} + +std::vector AndroidDocumentPermission::getPersistedPermissions() +{ + #if ! JUCE_ANDROID + return {}; + #else + if (getAndroidSDKVersion() < 19) + return {}; + + auto* env = getEnv(); + const LocalRef permissions { env->CallObjectMethod (AndroidContentUriResolver::getContentResolver().get(), + ContentResolver19.getPersistedUriPermissions) }; + + if (permissions == nullptr) + return {}; + + std::vector result; + const auto size = env->CallIntMethod (permissions, JavaList.size); + + for (auto i = (decltype (size)) 0; i < size; ++i) + { + const LocalRef uriPermission { env->CallObjectMethod (permissions, JavaList.get, i) }; + + AndroidDocumentPermission permission; + permission.time = env->CallLongMethod (uriPermission, AndroidUriPermission.getPersistedTime); + permission.read = env->CallBooleanMethod (uriPermission, AndroidUriPermission.isReadPermission); + permission.write = env->CallBooleanMethod (uriPermission, AndroidUriPermission.isWritePermission); + permission.url = AndroidDocumentDetail::uriToUrl (env->CallObjectMethod (uriPermission, AndroidUriPermission.getUri)); + + result.push_back (std::move (permission)); + } + + return result; + #endif +} + +//============================================================================== +AndroidDocument::AndroidDocument() = default; + +AndroidDocument AndroidDocument::fromFile (const File& filePath) +{ + #if JUCE_ANDROID + const LocalRef info { getEnv()->CallObjectMethod (getAppContext(), AndroidContext.getApplicationInfo) }; + const auto targetSdkVersion = getEnv()->GetIntField (info.get(), AndroidApplicationInfo.targetSdkVersion); + + // At the current API level, plain file paths may not work for accessing files in shared + // locations. It's recommended to use fromDocument() or fromTree() instead when targeting this + // API level. + jassert (__ANDROID_API_Q__ <= targetSdkVersion); + #endif + + return AndroidDocument { filePath != File() ? std::make_unique (filePath) + : nullptr }; +} + +AndroidDocument AndroidDocument::fromDocument (const URL& documentUrl) +{ + #if JUCE_ANDROID + if (getAndroidSDKVersion() < 19) + { + // This function is unsupported on this platform. + jassertfalse; + return AndroidDocument{}; + } + + const auto javaUri = urlToUri (documentUrl); + + if (! getEnv()->CallStaticBooleanMethod (DocumentsContract19, + DocumentsContract19.isDocumentUri, + getAppContext().get(), + javaUri.get())) + { + return AndroidDocument{}; + } + + return AndroidDocument { Utils::createPimplForSdk (javaUri) }; + #else + ignoreUnused (documentUrl); + return AndroidDocument{}; + #endif +} + +AndroidDocument AndroidDocument::fromTree (const URL& treeUrl) +{ + #if JUCE_ANDROID + if (getAndroidSDKVersion() < 21) + { + // This function is unsupported on this platform. + jassertfalse; + return AndroidDocument{}; + } + + const auto javaUri = urlToUri (treeUrl); + LocalRef treeDocumentId { getEnv()->CallStaticObjectMethod (DocumentsContract21, + DocumentsContract21.getTreeDocumentId, + javaUri.get()) }; + + jniCheckHasExceptionOccurredAndClear(); + + if (treeDocumentId == nullptr) + { + jassertfalse; + return AndroidDocument{}; + } + + LocalRef documentUri { getEnv()->CallStaticObjectMethod (DocumentsContract21, + DocumentsContract21.buildDocumentUriUsingTree, + javaUri.get(), + treeDocumentId.get()) }; + + return AndroidDocument { Utils::createPimplForSdk (documentUri) }; + #else + ignoreUnused (treeUrl); + return AndroidDocument{}; + #endif +} + +AndroidDocument::AndroidDocument (const AndroidDocument& other) + : AndroidDocument (other.pimpl != nullptr ? other.pimpl->clone() : nullptr) {} + +AndroidDocument::AndroidDocument (std::unique_ptr pimplIn) + : pimpl (std::move (pimplIn)) {} + +AndroidDocument::AndroidDocument (AndroidDocument&&) noexcept = default; + +AndroidDocument& AndroidDocument::operator= (const AndroidDocument& other) +{ + AndroidDocument { other }.swap (*this); + return *this; +} + +AndroidDocument& AndroidDocument::operator= (AndroidDocument&&) noexcept = default; + +AndroidDocument::~AndroidDocument() = default; + +bool AndroidDocument::deleteDocument() const { return pimpl->deleteDocument(); } + +bool AndroidDocument::renameTo (const String& newDisplayName) +{ + jassert (hasValue()); + + auto renamed = pimpl->renameTo (newDisplayName); + + if (renamed == nullptr) + return false; + + pimpl = std::move (renamed); + return true; +} + +AndroidDocument AndroidDocument::copyDocumentToParentDocument (const AndroidDocument& target) const +{ + jassert (hasValue() && target.hasValue()); + return AndroidDocument { pimpl->copyDocumentToParentDocument (*target.pimpl) }; +} + +AndroidDocument AndroidDocument::createChildDocumentWithTypeAndName (const String& type, + const String& name) const +{ + jassert (hasValue()); + return AndroidDocument { pimpl->createChildDocumentWithTypeAndName (type, name) }; +} + +AndroidDocument AndroidDocument::createChildDirectory (const String& name) const +{ + return createChildDocumentWithTypeAndName (AndroidDocumentDetail::dirMime, name); +} + +bool AndroidDocument::moveDocumentFromParentToParent (const AndroidDocument& currentParent, + const AndroidDocument& newParent) +{ + jassert (hasValue() && currentParent.hasValue() && newParent.hasValue()); + auto moved = pimpl->moveDocumentFromParentToParent (*currentParent.pimpl, *newParent.pimpl); + + if (moved == nullptr) + return false; + + pimpl = std::move (moved); + return true; +} + +std::unique_ptr AndroidDocument::createInputStream() const +{ + jassert (hasValue()); + return pimpl->createInputStream(); +} + +std::unique_ptr AndroidDocument::createOutputStream() const +{ + jassert (hasValue()); + return pimpl->createOutputStream(); +} + +URL AndroidDocument::getUrl() const +{ + jassert (hasValue()); + return pimpl->getUrl(); +} + +AndroidDocumentInfo AndroidDocument::getInfo() const +{ + jassert (hasValue()); + return pimpl->getInfo(); +} + +bool AndroidDocument::operator== (const AndroidDocument& other) const +{ + return getUrl() == other.getUrl(); +} + +bool AndroidDocument::operator!= (const AndroidDocument& other) const +{ + return ! operator== (other); +} + +AndroidDocument::NativeInfo AndroidDocument::getNativeInfo() const +{ + jassert (hasValue()); + return pimpl->getNativeInfo(); +} + +//============================================================================== +struct AndroidDocumentIterator::Pimpl +{ + virtual ~Pimpl() = default; + virtual AndroidDocument read() const = 0; + virtual bool increment() = 0; +}; + +struct AndroidDocumentIterator::Utils +{ + using Detail = AndroidDocumentDetail; + + ~Utils() = delete; // This struct is a single-file namespace + + template + struct TemplatePimpl final : public Pimpl, public Engine + { + template + TemplatePimpl (Args&&... args) : Engine (std::forward (args)...) {} + + AndroidDocument read() const override { return Engine::read(); } + bool increment() override { return Engine::increment(); } + }; + + template + static AndroidDocumentIterator makeWithEngineInplace (Args&&... args) + { + return AndroidDocumentIterator { std::make_unique> (std::forward (args)...) }; + } + + template + static AndroidDocumentIterator makeWithEngine (Engine engine) + { + return AndroidDocumentIterator { std::make_unique> (std::move (engine)) }; + } + + static void increment (AndroidDocumentIterator& it) + { + if (it.pimpl == nullptr || ! it.pimpl->increment()) + it.pimpl = nullptr; + } +}; + +//============================================================================== +AndroidDocumentIterator AndroidDocumentIterator::makeNonRecursive (const AndroidDocument& dir) +{ + if (! dir.hasValue()) + return {}; + + using Detail = AndroidDocumentDetail; + + #if JUCE_ANDROID + if (21 <= getAndroidSDKVersion()) + { + if (auto uri = dir.getNativeInfo().uri) + return Utils::makeWithEngine (Detail::makeDocumentsContractIteratorEngine (uri)); + } + #endif + + return Utils::makeWithEngineInplace (dir.getUrl().getLocalFile(), false); +} + +AndroidDocumentIterator AndroidDocumentIterator::makeRecursive (const AndroidDocument& dir) +{ + if (! dir.hasValue()) + return {}; + + using Detail = AndroidDocumentDetail; + + #if JUCE_ANDROID + if (21 <= getAndroidSDKVersion()) + { + if (auto uri = dir.getNativeInfo().uri) + return Utils::makeWithEngine (Detail::RecursiveEngine { uri }); + } + #endif + + return Utils::makeWithEngineInplace (dir.getUrl().getLocalFile(), true); +} + +AndroidDocumentIterator::AndroidDocumentIterator (std::unique_ptr engine) + : pimpl (std::move (engine)) +{ + Utils::increment (*this); +} + +AndroidDocument AndroidDocumentIterator::operator*() const { return pimpl->read(); } + +AndroidDocumentIterator& AndroidDocumentIterator::operator++() +{ + Utils::increment (*this); + return *this; +} + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_android_Files.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_android_Files.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_android_Files.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_android_Files.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -33,18 +33,30 @@ #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (query, "query", "(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;") \ - METHOD (openInputStream, "openInputStream", "(Landroid/net/Uri;)Ljava/io/InputStream;") \ - METHOD (openOutputStream, "openOutputStream", "(Landroid/net/Uri;)Ljava/io/OutputStream;") + METHOD (query, "query", "(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;") \ + METHOD (openInputStream, "openInputStream", "(Landroid/net/Uri;)Ljava/io/InputStream;") \ + METHOD (openOutputStream, "openOutputStream", "(Landroid/net/Uri;)Ljava/io/OutputStream;") DECLARE_JNI_CLASS (ContentResolver, "android/content/ContentResolver") #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (takePersistableUriPermission, "takePersistableUriPermission", "(Landroid/net/Uri;I)V") \ + METHOD (releasePersistableUriPermission, "releasePersistableUriPermission", "(Landroid/net/Uri;I)V") \ + METHOD (getPersistedUriPermissions, "getPersistedUriPermissions", "()Ljava/util/List;") + +DECLARE_JNI_CLASS (ContentResolver19, "android/content/ContentResolver") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (moveToFirst, "moveToFirst", "()Z") \ + METHOD (moveToNext, "moveToNext", "()Z") \ METHOD (getColumnIndex, "getColumnIndex", "(Ljava/lang/String;)I") \ METHOD (getString, "getString", "(I)Ljava/lang/String;") \ - METHOD (close, "close", "()V") \ + METHOD (isNull, "isNull", "(I)Z") \ + METHOD (getInt, "getInt", "(I)I") \ + METHOD (getLong, "getLong", "(I)J") \ + METHOD (close, "close", "()V") DECLARE_JNI_CLASS (AndroidCursor, "android/database/Cursor") #undef JNI_CLASS_MEMBERS @@ -66,13 +78,72 @@ #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (close, "close", "()V") \ + METHOD (read, "read", "([B)I") + +DECLARE_JNI_CLASS (AndroidInputStream, "java/io/InputStream") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ FIELD (publicSourceDir, "publicSourceDir", "Ljava/lang/String;") \ - FIELD (dataDir, "dataDir", "Ljava/lang/String;") + FIELD (dataDir, "dataDir", "Ljava/lang/String;") \ + FIELD (targetSdkVersion, "targetSdkVersion", "I") DECLARE_JNI_CLASS (AndroidApplicationInfo, "android/content/pm/ApplicationInfo") #undef JNI_CLASS_MEMBERS -//============================================================================== +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (buildChildDocumentsUri, "buildChildDocumentsUri", "(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildDocumentUri, "buildDocumentUri", "(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildRecentDocumentsUri, "buildRecentDocumentsUri", "(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildRootUri, "buildRootUri", "(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildRootsUri, "buildRootsUri", "(Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildSearchDocumentsUri, "buildSearchDocumentsUri", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (deleteDocument, "deleteDocument", "(Landroid/content/ContentResolver;Landroid/net/Uri;)Z") \ + STATICMETHOD (getDocumentId, "getDocumentId", "(Landroid/net/Uri;)Ljava/lang/String;") \ + STATICMETHOD (getRootId, "getRootId", "(Landroid/net/Uri;)Ljava/lang/String;") \ + STATICMETHOD (isDocumentUri, "isDocumentUri", "(Landroid/content/Context;Landroid/net/Uri;)Z") + +DECLARE_JNI_CLASS_WITH_MIN_SDK (DocumentsContract19, "android/provider/DocumentsContract", 19) +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (buildChildDocumentsUriUsingTree, "buildChildDocumentsUriUsingTree", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildDocumentUriUsingTree, "buildDocumentUriUsingTree", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildTreeDocumentUri, "buildTreeDocumentUri", "(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (createDocument, "createDocument", "(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (getTreeDocumentId, "getTreeDocumentId", "(Landroid/net/Uri;)Ljava/lang/String;") \ + STATICMETHOD (renameDocument, "renameDocument", "(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;") + +DECLARE_JNI_CLASS_WITH_MIN_SDK (DocumentsContract21, "android/provider/DocumentsContract", 21) +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (copyDocument, "copyDocument", "(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;)Landroid/net/Uri;") \ + STATICMETHOD (moveDocument, "moveDocument", "(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;Landroid/net/Uri;)Landroid/net/Uri;") \ + STATICMETHOD (removeDocument, "removeDocument", "(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;)Z") + +DECLARE_JNI_CLASS_WITH_MIN_SDK (DocumentsContract24, "android/provider/DocumentsContract", 24) +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (getSingleton, "getSingleton", "()Landroid/webkit/MimeTypeMap;") \ + METHOD (getExtensionFromMimeType, "getExtensionFromMimeType", "(Ljava/lang/String;)Ljava/lang/String;") \ + METHOD (getMimeTypeFromExtension, "getMimeTypeFromExtension", "(Ljava/lang/String;)Ljava/lang/String;") + +DECLARE_JNI_CLASS (AndroidMimeTypeMap, "android/webkit/MimeTypeMap") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getPersistedTime, "getPersistedTime", "()J") \ + METHOD (getUri, "getUri", "()Landroid/net/Uri;") \ + METHOD (isReadPermission, "isReadPermission", "()Z") \ + METHOD (isWritePermission, "isWritePermission", "()Z") + +DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidUriPermission, "android/content/UriPermission", 19) +#undef JNI_CLASS_MEMBERS + + //============================================================================== static File juceFile (LocalRef obj) { auto* env = getEnv(); @@ -118,21 +189,9 @@ struct AndroidContentUriResolver { public: - static LocalRef getStreamForContentUri (const URL& url, bool inputStream) + static LocalRef getContentResolver() { - // only use this method for content URIs - jassert (url.getScheme() == "content"); - auto* env = getEnv(); - - LocalRef contentResolver (env->CallObjectMethod (getAppContext().get(), AndroidContext.getContentResolver)); - - if (contentResolver) - return LocalRef ((env->CallObjectMethod (contentResolver.get(), - inputStream ? ContentResolver.openInputStream - : ContentResolver.openOutputStream, - urlToUri (url).get()))); - - return LocalRef(); + return LocalRef (getEnv()->CallObjectMethod (getAppContext().get(), AndroidContext.getContentResolver)); } static File getLocalFileFromContentUri (const URL& url) @@ -160,18 +219,15 @@ auto downloadId = tokens[1]; if (type.equalsIgnoreCase ("raw")) - { return File (downloadId); - } - else if (type.equalsIgnoreCase ("downloads")) + + if (type.equalsIgnoreCase ("downloads")) { auto subDownloadPath = url.getSubPath().fromFirstOccurrenceOf ("tree/downloads", false, false); return File (getWellKnownFolder ("DIRECTORY_DOWNLOADS").getFullPathName() + "/" + subDownloadPath); } - else - { - return getLocalFileFromContentUri (URL ("content://downloads/public_downloads/" + documentId)); - } + + return getLocalFileFromContentUri (URL ("content://downloads/public_downloads/" + documentId)); } else if (authority == "com.android.providers.media.documents" && documentId.isNotEmpty()) { @@ -192,7 +248,7 @@ { auto uri = urlToUri (url); auto* env = getEnv(); - LocalRef contentResolver (env->CallObjectMethod (getAppContext().get(), AndroidContext.getContentResolver)); + const auto contentResolver = getContentResolver(); if (contentResolver == nullptr) return {}; @@ -216,7 +272,7 @@ { auto uri = urlToUri (url); auto* env = getEnv(); - LocalRef contentResolver (env->CallObjectMethod (getAppContext().get(), AndroidContext.getContentResolver)); + const auto contentResolver = getContentResolver(); if (contentResolver) { @@ -285,8 +341,7 @@ static File getPrimaryStorageDirectory() { - auto* env = getEnv(); - return juceFile (LocalRef (env->CallStaticObjectMethod (AndroidEnvironment, AndroidEnvironment.getExternalStorageDirectory))); + return juceFile (LocalRef (getEnv()->CallStaticObjectMethod (AndroidEnvironment, AndroidEnvironment.getExternalStorageDirectory))); } static Array getSecondaryStorageDirectories() @@ -433,10 +488,8 @@ //============================================================================== struct AndroidContentUriOutputStream : public OutputStream { - AndroidContentUriOutputStream (LocalRef&& outputStream) - : stream (outputStream) - { - } + explicit AndroidContentUriOutputStream (LocalRef&& streamIn) + : stream (std::move (streamIn)) {} ~AndroidContentUriOutputStream() override { @@ -479,12 +532,79 @@ int64 pos = 0; }; -OutputStream* juce_CreateContentURIOutputStream (const URL& url) +//============================================================================== +class CachedByteArray { - auto stream = AndroidContentUriResolver::getStreamForContentUri (url, false); +public: + CachedByteArray() = default; - return (stream.get() != nullptr ? new AndroidContentUriOutputStream (std::move (stream)) : nullptr); -} + explicit CachedByteArray (jsize sizeIn) + : byteArray { LocalRef { getEnv()->NewByteArray (sizeIn) } }, + size (sizeIn) {} + + jbyteArray getNativeArray() const { return byteArray.get(); } + jsize getSize() const { return size; } + +private: + GlobalRefImpl byteArray; + jsize size = 0; +}; + +//============================================================================== +struct AndroidContentUriInputStream : public InputStream +{ + explicit AndroidContentUriInputStream (LocalRef&& streamIn) + : stream (std::move (streamIn)) {} + + ~AndroidContentUriInputStream() override + { + getEnv()->CallVoidMethod (stream.get(), AndroidInputStream.close); + } + + int64 getTotalLength() override { return -1; } + + bool isExhausted() override { return exhausted; } + + int read (void* destBuffer, int maxBytesToRead) override + { + auto* env = getEnv(); + + if ((jsize) maxBytesToRead > byteArray.getSize()) + byteArray = CachedByteArray { (jsize) maxBytesToRead }; + + const auto result = env->CallIntMethod (stream.get(), AndroidInputStream.read, byteArray.getNativeArray()); + + if (result != -1) + { + pos += result; + + auto* rawBytes = env->GetByteArrayElements (byteArray.getNativeArray(), nullptr); + std::memcpy (destBuffer, rawBytes, static_cast (result)); + env->ReleaseByteArrayElements (byteArray.getNativeArray(), rawBytes, 0); + } + else + { + exhausted = true; + } + + return result; + } + + bool setPosition (int64 newPos) override + { + return (newPos == pos); + } + + int64 getPosition() override + { + return pos; + } + + CachedByteArray byteArray; + GlobalRef stream; + int64 pos = 0; + bool exhausted = false; +}; //============================================================================== class MediaScannerConnectionClient : public AndroidInterfaceImplementer diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_android_JNIHelpers.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_android_JNIHelpers.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_android_JNIHelpers.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_android_JNIHelpers.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -414,34 +414,51 @@ { auto* env = getEnv(); - auto methodName = juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName)); - - auto activity = env->GetArrayLength (args) > 0 ? env->GetObjectArrayElement (args, 0) : (jobject) nullptr; - auto bundle = env->GetArrayLength (args) > 1 ? env->GetObjectArrayElement (args, 1) : (jobject) nullptr; + struct Comparator + { + bool operator() (const char* a, const char* b) const + { + return CharPointer_ASCII { a }.compare (CharPointer_ASCII { b }) < 0; + } + }; - if (methodName == "onActivityPreCreated") { onActivityPreCreated (activity, bundle); return nullptr; } - else if (methodName == "onActivityPreDestroyed") { onActivityPreDestroyed (activity); return nullptr; } - else if (methodName == "onActivityPrePaused") { onActivityPrePaused (activity); return nullptr; } - else if (methodName == "onActivityPreResumed") { onActivityPreResumed (activity); return nullptr; } - else if (methodName == "onActivityPreSaveInstanceState") { onActivityPreSaveInstanceState (activity, bundle); return nullptr; } - else if (methodName == "onActivityPreStarted") { onActivityPreStarted (activity); return nullptr; } - else if (methodName == "onActivityPreStopped") { onActivityPreStopped (activity); return nullptr; } - else if (methodName == "onActivityCreated") { onActivityCreated (activity, bundle); return nullptr; } - else if (methodName == "onActivityDestroyed") { onActivityDestroyed (activity); return nullptr; } - else if (methodName == "onActivityPaused") { onActivityPaused (activity); return nullptr; } - else if (methodName == "onActivityResumed") { onActivityResumed (activity); return nullptr; } - else if (methodName == "onActivitySaveInstanceState") { onActivitySaveInstanceState (activity, bundle); return nullptr; } - else if (methodName == "onActivityStarted") { onActivityStarted (activity); return nullptr; } - else if (methodName == "onActivityStopped") { onActivityStopped (activity); return nullptr; } - else if (methodName == "onActivityPostCreated") { onActivityPostCreated (activity, bundle); return nullptr; } - else if (methodName == "onActivityPostDestroyed") { onActivityPostDestroyed (activity); return nullptr; } - else if (methodName == "onActivityPostPaused") { onActivityPostPaused (activity); return nullptr; } - else if (methodName == "onActivityPostResumed") { onActivityPostResumed (activity); return nullptr; } - else if (methodName == "onActivityPostSaveInstanceState") { onActivityPostSaveInstanceState (activity, bundle); return nullptr; } - else if (methodName == "onActivityPostStarted") { onActivityPostStarted (activity); return nullptr; } - else if (methodName == "onActivityPostStopped") { onActivityPostStopped (activity); return nullptr; } + static const std::map entries + { + { "onActivityConfigurationChanged", [] (auto& t, auto activity, auto ) { t.onActivityConfigurationChanged (activity); } }, + { "onActivityCreated", [] (auto& t, auto activity, auto bundle) { t.onActivityCreated (activity, bundle); } }, + { "onActivityDestroyed", [] (auto& t, auto activity, auto ) { t.onActivityDestroyed (activity); } }, + { "onActivityPaused", [] (auto& t, auto activity, auto ) { t.onActivityPaused (activity); } }, + { "onActivityPostCreated", [] (auto& t, auto activity, auto bundle) { t.onActivityPostCreated (activity, bundle); } }, + { "onActivityPostDestroyed", [] (auto& t, auto activity, auto ) { t.onActivityPostDestroyed (activity); } }, + { "onActivityPostPaused", [] (auto& t, auto activity, auto ) { t.onActivityPostPaused (activity); } }, + { "onActivityPostResumed", [] (auto& t, auto activity, auto ) { t.onActivityPostResumed (activity); } }, + { "onActivityPostSaveInstanceState", [] (auto& t, auto activity, auto bundle) { t.onActivityPostSaveInstanceState (activity, bundle); } }, + { "onActivityPostStarted", [] (auto& t, auto activity, auto ) { t.onActivityPostStarted (activity); } }, + { "onActivityPostStopped", [] (auto& t, auto activity, auto ) { t.onActivityPostStopped (activity); } }, + { "onActivityPreCreated", [] (auto& t, auto activity, auto bundle) { t.onActivityPreCreated (activity, bundle); } }, + { "onActivityPreDestroyed", [] (auto& t, auto activity, auto ) { t.onActivityPreDestroyed (activity); } }, + { "onActivityPrePaused", [] (auto& t, auto activity, auto ) { t.onActivityPrePaused (activity); } }, + { "onActivityPreResumed", [] (auto& t, auto activity, auto ) { t.onActivityPreResumed (activity); } }, + { "onActivityPreSaveInstanceState", [] (auto& t, auto activity, auto bundle) { t.onActivityPreSaveInstanceState (activity, bundle); } }, + { "onActivityPreStarted", [] (auto& t, auto activity, auto ) { t.onActivityPreStarted (activity); } }, + { "onActivityPreStopped", [] (auto& t, auto activity, auto ) { t.onActivityPreStopped (activity); } }, + { "onActivityResumed", [] (auto& t, auto activity, auto ) { t.onActivityResumed (activity); } }, + { "onActivitySaveInstanceState", [] (auto& t, auto activity, auto bundle) { t.onActivitySaveInstanceState (activity, bundle); } }, + { "onActivityStarted", [] (auto& t, auto activity, auto ) { t.onActivityStarted (activity); } }, + { "onActivityStopped", [] (auto& t, auto activity, auto ) { t.onActivityStopped (activity); } }, + }; + + const auto methodName = juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName)); + const auto iter = entries.find (methodName.toRawUTF8()); + + if (iter == entries.end()) + return AndroidInterfaceImplementer::invoke (proxy, method, args); + + const auto activity = env->GetArrayLength (args) > 0 ? env->GetObjectArrayElement (args, 0) : (jobject) nullptr; + const auto bundle = env->GetArrayLength (args) > 1 ? env->GetObjectArrayElement (args, 1) : (jobject) nullptr; + (iter->second) (*this, activity, bundle); - return AndroidInterfaceImplementer::invoke (proxy, method, args); + return nullptr; } //============================================================================== diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_android_JNIHelpers.h juce-7.0.0~ds0/modules/juce_core/native/juce_android_JNIHelpers.h --- juce-6.1.5~ds0/modules/juce_core/native/juce_android_JNIHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_android_JNIHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -31,11 +31,11 @@ class LocalRef { public: - explicit inline LocalRef() noexcept : obj (nullptr) {} - explicit inline LocalRef (JavaType o) noexcept : obj (o) {} - inline LocalRef (const LocalRef& other) noexcept : obj (retain (other.obj)) {} - inline LocalRef (LocalRef&& other) noexcept : obj (nullptr) { std::swap (obj, other.obj); } - ~LocalRef() { clear(); } + LocalRef() noexcept : obj (nullptr) {} + explicit LocalRef (JavaType o) noexcept : obj (o) {} + LocalRef (const LocalRef& other) noexcept : obj (retain (other.obj)) {} + LocalRef (LocalRef&& other) noexcept : obj (nullptr) { std::swap (obj, other.obj); } + ~LocalRef() { clear(); } void clear() { @@ -61,8 +61,8 @@ return *this; } - inline operator JavaType() const noexcept { return obj; } - inline JavaType get() const noexcept { return obj; } + operator JavaType() const noexcept { return obj; } + JavaType get() const noexcept { return obj; } private: JavaType obj; @@ -74,19 +74,19 @@ }; //============================================================================== -class GlobalRef +template +class GlobalRefImpl { public: - inline GlobalRef() noexcept : obj (nullptr) {} - inline explicit GlobalRef (const LocalRef& o) : obj (retain (o.get(), getEnv())) {} - inline explicit GlobalRef (const LocalRef& o, JNIEnv* env) : obj (retain (o.get(), env)) {} - inline GlobalRef (const GlobalRef& other) : obj (retain (other.obj, getEnv())) {} - inline GlobalRef (GlobalRef && other) noexcept : obj (nullptr) { std::swap (other.obj, obj); } - ~GlobalRef() { clear(); } - + GlobalRefImpl() noexcept : obj (nullptr) {} + explicit GlobalRefImpl (const LocalRef& o) : obj (retain (o.get(), getEnv())) {} + GlobalRefImpl (const LocalRef& o, JNIEnv* env) : obj (retain (o.get(), env)) {} + GlobalRefImpl (const GlobalRefImpl& other) : obj (retain (other.obj, getEnv())) {} + GlobalRefImpl (GlobalRefImpl&& other) noexcept : obj (nullptr) { std::swap (other.obj, obj); } + ~GlobalRefImpl() { clear(); } - inline void clear() { if (obj != nullptr) clear (getEnv()); } - inline void clear (JNIEnv* env) + void clear() { if (obj != nullptr) clear (getEnv()); } + void clear (JNIEnv* env) { if (obj != nullptr) { @@ -95,15 +95,15 @@ } } - inline GlobalRef& operator= (const GlobalRef& other) + GlobalRefImpl& operator= (const GlobalRefImpl& other) { - jobject newObj = retain (other.obj, getEnv()); + JavaType newObj = retain (other.obj, getEnv()); clear(); obj = newObj; return *this; } - inline GlobalRef& operator= (GlobalRef&& other) + GlobalRefImpl& operator= (GlobalRefImpl&& other) { clear(); std::swap (obj, other.obj); @@ -112,8 +112,8 @@ } //============================================================================== - inline operator jobject() const noexcept { return obj; } - inline jobject get() const noexcept { return obj; } + operator JavaType() const noexcept { return obj; } + JavaType get() const noexcept { return obj; } //============================================================================== #define DECLARE_CALL_TYPE_METHOD(returnType, typeName) \ @@ -147,14 +147,20 @@ private: //============================================================================== - jobject obj = nullptr; + JavaType obj = nullptr; - static jobject retain (jobject obj, JNIEnv* env) + static JavaType retain (JavaType obj, JNIEnv* env) { - return obj == nullptr ? nullptr : env->NewGlobalRef (obj); + return obj != nullptr ? static_cast (env->NewGlobalRef (obj)) + : nullptr; } }; +class GlobalRef : public GlobalRefImpl +{ +public: + using GlobalRefImpl::GlobalRefImpl; +}; //============================================================================== extern LocalRef getAppContext() noexcept; @@ -166,15 +172,15 @@ class JNIClassBase { public: - explicit JNIClassBase (const char* classPath, int minSDK, const void* byteCode, size_t byteCodeSize); + JNIClassBase (const char* classPath, int minSDK, const void* byteCode, size_t byteCodeSize); virtual ~JNIClassBase(); - inline operator jclass() const noexcept { return classRef; } + operator jclass() const noexcept { return classRef; } static void initialiseAllClasses (JNIEnv*); static void releaseAllClasses (JNIEnv*); - inline const char* getClassPath() const noexcept { return classPath; } + const char* getClassPath() const noexcept { return classPath; } protected: virtual void initialiseFields (JNIEnv*) = 0; @@ -252,6 +258,7 @@ METHOD (getApplicationContext, "getApplicationContext", "()Landroid/content/Context;") \ METHOD (getApplicationInfo, "getApplicationInfo", "()Landroid/content/pm/ApplicationInfo;") \ METHOD (checkCallingOrSelfPermission, "checkCallingOrSelfPermission", "(Ljava/lang/String;)I") \ + METHOD (checkCallingOrSelfUriPermission, "checkCallingOrSelfUriPermission", "(Landroid/net/Uri;I)I") \ METHOD (getCacheDir, "getCacheDir", "()Ljava/io/File;") DECLARE_JNI_CLASS (AndroidContext, "android/content/Context") @@ -392,6 +399,7 @@ METHOD (getAction, "getAction", "()Ljava/lang/String;") \ METHOD (getCategories, "getCategories", "()Ljava/util/Set;") \ METHOD (getData, "getData", "()Landroid/net/Uri;") \ + METHOD (getClipData, "getClipData", "()Landroid/content/ClipData;") \ METHOD (getExtras, "getExtras", "()Landroid/os/Bundle;") \ METHOD (getIntExtra, "getIntExtra", "(Ljava/lang/String;I)I") \ METHOD (getStringExtra, "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;") \ @@ -400,6 +408,7 @@ METHOD (putExtraString, "putExtra", "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;") \ METHOD (putExtraStrings, "putExtra", "(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/Intent;") \ METHOD (putExtraParcelable, "putExtra", "(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;") \ + METHOD (putExtraBool, "putExtra", "(Ljava/lang/String;Z)Landroid/content/Intent;") \ METHOD (putParcelableArrayListExtra, "putParcelableArrayListExtra", "(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;") \ METHOD (setAction, "setAction", "(Ljava/lang/String;)Landroid/content/Intent;") \ METHOD (setFlags, "setFlags", "(I)Landroid/content/Intent;") \ @@ -596,6 +605,9 @@ #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (get, "get", "([B)Ljava/nio/ByteBuffer;") \ METHOD (remaining, "remaining", "()I") \ + METHOD (hasArray, "hasArray", "()Z") \ + METHOD (array, "array", "()[B") \ + METHOD (setOrder, "order", "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;") \ STATICMETHOD (wrap, "wrap", "([B)Ljava/nio/ByteBuffer;") DECLARE_JNI_CLASS (JavaByteBuffer, "java/nio/ByteBuffer") @@ -837,15 +849,12 @@ { auto* env = getEnv(); - LocalRef exception (env->ExceptionOccurred()); - - if (exception != nullptr) - { - env->ExceptionClear(); - return true; - } - - return false; + const auto result = env->ExceptionCheck(); + #if JUCE_DEBUG + env->ExceptionDescribe(); + #endif + env->ExceptionClear(); + return result; } } @@ -917,6 +926,8 @@ virtual void onActivityPostStarted (jobject /*activity*/) {} virtual void onActivityPostStopped (jobject /*activity*/) {} + virtual void onActivityConfigurationChanged (jobject /*activity*/) {} + private: jobject invoke (jobject, jobject, jobjectArray) override; }; diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_android_Misc.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_android_Misc.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_android_Misc.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_android_Misc.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_android_Network.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_android_Network.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_android_Network.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_android_Network.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -200,14 +200,6 @@ //============================================================================== #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (close, "close", "()V") \ - METHOD (read, "read", "([BII)I") \ - -DECLARE_JNI_CLASS (AndroidInputStream, "java/io/InputStream") -#undef JNI_CLASS_MEMBERS - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (acquire, "acquire", "()V") \ METHOD (release, "release", "()V") \ @@ -246,6 +238,7 @@ return multicastLock; } +JUCE_API void JUCE_CALLTYPE acquireMulticastLock(); JUCE_API void JUCE_CALLTYPE acquireMulticastLock() { auto multicastLock = getMulticastLock(); @@ -254,6 +247,7 @@ getEnv()->CallVoidMethod (multicastLock.get(), AndroidMulticastLock.acquire); } +JUCE_API void JUCE_CALLTYPE releaseMulticastLock(); JUCE_API void JUCE_CALLTYPE releaseMulticastLock() { auto multicastLock = getMulticastLock(); @@ -318,6 +312,25 @@ return toString (false).fromLastOccurrenceOf ("/", false, true); } +struct AndroidStreamHelpers +{ + enum class StreamKind { output, input }; + + static LocalRef createStream (const GlobalRef& uri, StreamKind kind) + { + auto* env = getEnv(); + auto contentResolver = AndroidContentUriResolver::getContentResolver(); + + if (contentResolver == nullptr) + return {}; + + return LocalRef (env->CallObjectMethod (contentResolver.get(), + kind == StreamKind::input ? ContentResolver.openInputStream + : ContentResolver.openOutputStream, + uri.get())); + } +}; + //============================================================================== class WebInputStream::Pimpl { @@ -363,7 +376,8 @@ if (isContentURL) { - auto inputStream = AndroidContentUriResolver::getStreamForContentUri (url, true); + GlobalRef urlRef { urlToUri (url) }; + auto inputStream = AndroidStreamHelpers::createStream (urlRef, AndroidStreamHelpers::StreamKind::input); if (inputStream != nullptr) { diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_android_RuntimePermissions.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_android_RuntimePermissions.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_android_RuntimePermissions.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_android_RuntimePermissions.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_android_SystemStats.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_android_SystemStats.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_android_SystemStats.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_android_SystemStats.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_android_Threads.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_android_Threads.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_android_Threads.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_android_Threads.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -56,7 +56,7 @@ return nullptr; } -void JNICALL juce_JavainitialiseJUCE (JNIEnv* env, jobject /*jclass*/, jobject context) +static void JNICALL juce_JavainitialiseJUCE (JNIEnv* env, jobject /*jclass*/, jobject context) { Thread::initialiseJUCE (env, context); } diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_BasicNativeHeaders.h juce-7.0.0~ds0/modules/juce_core/native/juce_BasicNativeHeaders.h --- juce-6.1.5~ds0/modules/juce_core/native/juce_BasicNativeHeaders.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_BasicNativeHeaders.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -154,7 +154,20 @@ #include #include #include + #include + #include + + #if ! JUCE_CXX17_IS_AVAILABLE + #pragma push_macro ("WIN_NOEXCEPT") + #define WIN_NOEXCEPT + #endif + #include + + #if ! JUCE_CXX17_IS_AVAILABLE + #pragma pop_macro ("WIN_NOEXCEPT") + #endif + #include #include #include diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_curl_Network.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_curl_Network.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_curl_Network.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_curl_Network.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_intel_SharedCode.h juce-7.0.0~ds0/modules/juce_core/native/juce_intel_SharedCode.h --- juce-6.1.5~ds0/modules/juce_core/native/juce_intel_SharedCode.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_intel_SharedCode.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_linux_CommonFile.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_linux_CommonFile.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_linux_CommonFile.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_linux_CommonFile.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_linux_Files.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_linux_Files.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_linux_Files.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_linux_Files.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_linux_Network.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_linux_Network.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_linux_Network.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_linux_Network.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_linux_SystemStats.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_linux_SystemStats.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_linux_SystemStats.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_linux_SystemStats.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_linux_Threads.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_linux_Threads.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_linux_Threads.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_linux_Threads.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_mac_CFHelpers.h juce-7.0.0~ds0/modules/juce_core/native/juce_mac_CFHelpers.h --- juce-6.1.5~ds0/modules/juce_core/native/juce_mac_CFHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_mac_CFHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_mac_Files.mm juce-7.0.0~ds0/modules/juce_core/native/juce_mac_Files.mm --- juce-6.1.5~ds0/modules/juce_core/native/juce_mac_Files.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_mac_Files.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -528,8 +528,9 @@ File File::getContainerForSecurityApplicationGroupIdentifier (const String& appGroup) { - if (auto* url = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier: juceStringToNS (appGroup)]) - return File (nsStringToJuce ([url path])); + if (@available (macOS 10.8, *)) + if (auto* url = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier: juceStringToNS (appGroup)]) + return File (nsStringToJuce ([url path])); return File(); } diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_mac_Network.mm juce-7.0.0~ds0/modules/juce_core/native/juce_mac_Network.mm --- juce-6.1.5~ds0/modules/juce_core/native/juce_mac_Network.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_mac_Network.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -393,7 +393,7 @@ #endif //============================================================================== -class URLConnectionState : public URLConnectionStateBase +class API_AVAILABLE (macos (10.9)) URLConnectionState : public URLConnectionStateBase { public: URLConnectionState (NSURLRequest* req, const int maxRedirects) diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_mac_ObjCHelpers.h juce-7.0.0~ds0/modules/juce_core/native/juce_mac_ObjCHelpers.h --- juce-6.1.5~ds0/modules/juce_core/native/juce_mac_ObjCHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_mac_ObjCHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -164,7 +164,7 @@ DynamicObject::Ptr dynamicObject (new DynamicObject()); for (NSString* key in dictionary) - dynamicObject->setProperty (nsStringToJuce (key), nsObjectToVar (dictionary[key])); + dynamicObject->setProperty (nsStringToJuce (key), nsObjectToVar ([dictionary objectForKey: key])); return var (dynamicObject.get()); } @@ -306,6 +306,9 @@ bool operator== (const ObjCObjectHandle& other) const { return item == other.item; } bool operator!= (const ObjCObjectHandle& other) const { return ! (*this == other); } + bool operator== (std::nullptr_t) const { return item == nullptr; } + bool operator!= (std::nullptr_t) const { return ! (*this == nullptr); } + private: void swap (ObjCObjectHandle& other) noexcept { std::swap (other.item, item); } @@ -499,7 +502,7 @@ bool operator!= (const void* ptr) const { return ((const void*) block != ptr); } ~ObjCBlock() { if (block != nullptr) [block release]; } - operator BlockType() { return block; } + operator BlockType() const { return block; } private: BlockType block; diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_mac_Strings.mm juce-7.0.0~ds0/modules/juce_core/native/juce_mac_Strings.mm --- juce-6.1.5~ds0/modules/juce_core/native/juce_mac_Strings.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_mac_Strings.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_mac_SystemStats.mm juce-7.0.0~ds0/modules/juce_core/native/juce_mac_SystemStats.mm --- juce-6.1.5~ds0/modules/juce_core/native/juce_mac_SystemStats.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_mac_SystemStats.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_mac_Threads.mm juce-7.0.0~ds0/modules/juce_core/native/juce_mac_Threads.mm --- juce-6.1.5~ds0/modules/juce_core/native/juce_mac_Threads.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_mac_Threads.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_posix_IPAddress.h juce-7.0.0~ds0/modules/juce_core/native/juce_posix_IPAddress.h --- juce-6.1.5~ds0/modules/juce_core/native/juce_posix_IPAddress.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_posix_IPAddress.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_posix_NamedPipe.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_posix_NamedPipe.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_posix_NamedPipe.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_posix_NamedPipe.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -39,8 +39,8 @@ ~Pimpl() { - if (pipeIn != -1) ::close (pipeIn); - if (pipeOut != -1) ::close (pipeOut); + pipeIn .close(); + pipeOut.close(); if (createdPipe) { @@ -51,7 +51,7 @@ bool connect (int timeOutMilliseconds) { - return openPipe (true, getTimeoutEnd (timeOutMilliseconds)); + return openPipe (true, getTimeoutEnd (timeOutMilliseconds)) != invalidPipe; } int read (char* destBuffer, int maxBytesToRead, int timeOutMilliseconds) @@ -61,8 +61,10 @@ while (bytesRead < maxBytesToRead) { + const auto pipe = pipeIn.get(); + auto bytesThisTime = maxBytesToRead - bytesRead; - auto numRead = (int) ::read (pipeIn, destBuffer, (size_t) bytesThisTime); + auto numRead = (int) ::read (pipe, destBuffer, (size_t) bytesThisTime); if (numRead <= 0) { @@ -72,9 +74,9 @@ return -1; const int maxWaitingTime = 30; - waitForInput (pipeIn, timeoutEnd == 0 ? maxWaitingTime - : jmin (maxWaitingTime, - (int) (timeoutEnd - Time::getMillisecondCounter()))); + waitForInput (pipe, timeoutEnd == 0 ? maxWaitingTime + : jmin (maxWaitingTime, + (int) (timeoutEnd - Time::getMillisecondCounter()))); continue; } @@ -89,7 +91,9 @@ { auto timeoutEnd = getTimeoutEnd (timeOutMilliseconds); - if (! openPipe (false, timeoutEnd)) + const auto pipe = openPipe (false, timeoutEnd); + + if (pipe == invalidPipe) return -1; int bytesWritten = 0; @@ -97,7 +101,7 @@ while (bytesWritten < numBytesToWrite && ! hasExpired (timeoutEnd)) { auto bytesThisTime = numBytesToWrite - bytesWritten; - auto numWritten = (int) ::write (pipeOut, sourceBuffer, (size_t) bytesThisTime); + auto numWritten = (int) ::write (pipe, sourceBuffer, (size_t) bytesThisTime); if (numWritten < 0) { @@ -105,9 +109,9 @@ const int maxWaitingTime = 30; if (error == EWOULDBLOCK || error == EAGAIN) - waitToWrite (pipeOut, timeoutEnd == 0 ? maxWaitingTime - : jmin (maxWaitingTime, - (int) (timeoutEnd - Time::getMillisecondCounter()))); + waitToWrite (pipe, timeoutEnd == 0 ? maxWaitingTime + : jmin (maxWaitingTime, + (int) (timeoutEnd - Time::getMillisecondCounter()))); else return -1; @@ -134,8 +138,52 @@ return createdFifoIn && createdFifoOut; } + static constexpr auto invalidPipe = -1; + + class PipeDescriptor + { + public: + template + int get (Fn&& fn) + { + { + const ScopedReadLock l (mutex); + + if (descriptor != invalidPipe) + return descriptor; + } + + const ScopedWriteLock l (mutex); + return descriptor = fn(); + } + + void close() + { + { + const ScopedReadLock l (mutex); + + if (descriptor == invalidPipe) + return; + } + + const ScopedWriteLock l (mutex); + ::close (descriptor); + descriptor = invalidPipe; + } + + int get() + { + const ScopedReadLock l (mutex); + return descriptor; + } + + private: + ReadWriteLock mutex; + int descriptor = invalidPipe; + }; + const String pipeInName, pipeOutName; - int pipeIn = -1, pipeOut = -1; + PipeDescriptor pipeIn, pipeOut; bool createdFifoIn = false, createdFifoOut = false; const bool createdPipe; @@ -160,30 +208,25 @@ { auto p = ::open (name.toUTF8(), flags); - if (p != -1 || hasExpired (timeoutEnd) || stopReadOperation.load()) + if (p != invalidPipe || hasExpired (timeoutEnd) || stopReadOperation.load()) return p; Thread::sleep (2); } } - bool openPipe (bool isInput, uint32 timeoutEnd) + int openPipe (bool isInput, uint32 timeoutEnd) { auto& pipe = isInput ? pipeIn : pipeOut; - int flags = (isInput ? O_RDWR : O_WRONLY) | O_NONBLOCK; + const auto flags = (isInput ? O_RDWR : O_WRONLY) | O_NONBLOCK; const String& pipeName = isInput ? (createdPipe ? pipeInName : pipeOutName) : (createdPipe ? pipeOutName : pipeInName); - if (pipe == -1) + return pipe.get ([this, &pipeName, &flags, &timeoutEnd] { - pipe = openPipe (pipeName, flags, timeoutEnd); - - if (pipe == -1) - return false; - } - - return true; + return openPipe (pipeName, flags, timeoutEnd); + }); } static void waitForInput (int handle, int timeoutMsecs) noexcept @@ -204,20 +247,20 @@ void NamedPipe::close() { { - ScopedReadLock sl (lock); + const ScopedReadLock sl (lock); if (pimpl != nullptr) { pimpl->stopReadOperation = true; - char buffer[1] = { 0 }; - ssize_t done = ::write (pimpl->pipeIn, buffer, 1); + const char buffer[] { 0 }; + const auto done = ::write (pimpl->pipeIn.get(), buffer, numElementsInArray (buffer)); ignoreUnused (done); } } { - ScopedWriteLock sl (lock); + const ScopedWriteLock sl (lock); pimpl.reset(); } } diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_posix_SharedCode.h juce-7.0.0~ds0/modules/juce_core/native/juce_posix_SharedCode.h --- juce-6.1.5~ds0/modules/juce_core/native/juce_posix_SharedCode.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_posix_SharedCode.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -288,6 +288,12 @@ return false; } +bool File::hasReadAccess() const +{ + return fullPath.isNotEmpty() + && access (fullPath.toUTF8(), R_OK) == 0; +} + static bool setFileModeFlags (const String& fullPath, mode_t flags, bool shouldSet) noexcept { juce_statStruct info; diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_wasm_SystemStats.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_wasm_SystemStats.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_wasm_SystemStats.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_wasm_SystemStats.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_win32_ComSmartPtr.h juce-7.0.0~ds0/modules/juce_core/native/juce_win32_ComSmartPtr.h --- juce-6.1.5~ds0/modules/juce_core/native/juce_win32_ComSmartPtr.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_win32_ComSmartPtr.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_win32_Files.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_win32_Files.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_win32_Files.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_win32_Files.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -64,12 +64,12 @@ #endif //============================================================================== - DWORD getAtts (const String& path) noexcept + static DWORD getAtts (const String& path) noexcept { return GetFileAttributes (path.toWideCharPointer()); } - bool changeAtts (const String& path, DWORD bitsToSet, DWORD bitsToClear) noexcept + static bool changeAtts (const String& path, DWORD bitsToSet, DWORD bitsToClear) noexcept { auto oldAtts = getAtts (path); @@ -82,7 +82,7 @@ || SetFileAttributes (path.toWideCharPointer(), newAtts) != FALSE; } - int64 fileTimeToTime (const FILETIME* const ft) noexcept + static int64 fileTimeToTime (const FILETIME* const ft) noexcept { static_assert (sizeof (ULARGE_INTEGER) == sizeof (FILETIME), "ULARGE_INTEGER is too small to hold FILETIME: please report!"); @@ -90,7 +90,7 @@ return (int64) ((reinterpret_cast (ft)->QuadPart - 116444736000000000LL) / 10000); } - FILETIME* timeToFileTime (const int64 time, FILETIME* const ft) noexcept + static FILETIME* timeToFileTime (const int64 time, FILETIME* const ft) noexcept { if (time <= 0) return nullptr; @@ -99,7 +99,7 @@ return ft; } - String getDriveFromPath (String path) + static String getDriveFromPath (String path) { if (path.isNotEmpty() && path[1] == ':' && path[2] == 0) path << '\\'; @@ -115,7 +115,7 @@ return path; } - int64 getDiskSpaceInfo (const String& path, const bool total) + static int64 getDiskSpaceInfo (const String& path, const bool total) { ULARGE_INTEGER spc, tot, totFree; @@ -126,12 +126,12 @@ return 0; } - unsigned int getWindowsDriveType (const String& path) + static unsigned int getWindowsDriveType (const String& path) { return GetDriveType (getDriveFromPath (path).toWideCharPointer()); } - File getSpecialFolderPath (int type) + static File getSpecialFolderPath (int type) { WCHAR path[MAX_PATH + 256]; @@ -141,7 +141,7 @@ return {}; } - File getModuleFileName (HINSTANCE moduleHandle) + static File getModuleFileName (HINSTANCE moduleHandle) { WCHAR dest[MAX_PATH + 256]; dest[0] = 0; @@ -149,7 +149,7 @@ return File (String (dest)); } - Result getResultForLastError() + static Result getResultForLastError() { TCHAR messageBuffer[256] = {}; @@ -159,7 +159,84 @@ return Result::fail (String (messageBuffer)); } -} + + // The docs for the Windows security API aren't very clear. Some parts of the following + // function (the flags passed to GetNamedSecurityInfo, duplicating the primary access token) + // were guided by the example at https://blog.aaronballman.com/2011/08/how-to-check-access-rights/ + static bool hasFileAccess (const File& file, DWORD accessType) + { + const auto& path = file.getFullPathName(); + + if (path.isEmpty()) + return false; + + struct PsecurityDescriptorGuard + { + ~PsecurityDescriptorGuard() { if (psecurityDescriptor != nullptr) LocalFree (psecurityDescriptor); } + PSECURITY_DESCRIPTOR psecurityDescriptor = nullptr; + }; + + PsecurityDescriptorGuard descriptorGuard; + + if (GetNamedSecurityInfo (path.toWideCharPointer(), + SE_FILE_OBJECT, + OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, + nullptr, + nullptr, + nullptr, + nullptr, + &descriptorGuard.psecurityDescriptor) != ERROR_SUCCESS) + { + return false; + } + + struct HandleGuard + { + ~HandleGuard() { if (handle != INVALID_HANDLE_VALUE) CloseHandle (handle); } + HANDLE handle = nullptr; + }; + + HandleGuard primaryTokenGuard; + + if (! OpenProcessToken (GetCurrentProcess(), + TOKEN_IMPERSONATE | TOKEN_DUPLICATE | TOKEN_QUERY | STANDARD_RIGHTS_READ, + &primaryTokenGuard.handle)) + { + return false; + } + + HandleGuard duplicatedTokenGuard; + + if (! DuplicateToken (primaryTokenGuard.handle, + SecurityImpersonation, + &duplicatedTokenGuard.handle)) + { + return false; + } + + GENERIC_MAPPING mapping { FILE_GENERIC_READ, FILE_GENERIC_WRITE, FILE_GENERIC_EXECUTE, FILE_ALL_ACCESS }; + + MapGenericMask (&accessType, &mapping); + DWORD allowed = 0; + BOOL granted = false; + PRIVILEGE_SET set; + DWORD setSize = sizeof (set); + + if (! AccessCheck (descriptorGuard.psecurityDescriptor, + duplicatedTokenGuard.handle, + accessType, + &mapping, + &set, + &setSize, + &allowed, + &granted)) + { + return false; + } + + return granted != FALSE; + } +} // namespace WindowsFileHelpers //============================================================================== #if JUCE_ALLOW_STATIC_NULL_VARIABLES @@ -199,17 +276,25 @@ bool File::hasWriteAccess() const { - if (fullPath.isEmpty()) - return true; + if (exists()) + { + const auto attr = WindowsFileHelpers::getAtts (fullPath); - auto attr = WindowsFileHelpers::getAtts (fullPath); + return WindowsFileHelpers::hasFileAccess (*this, GENERIC_WRITE) + && (attr == INVALID_FILE_ATTRIBUTES + || (attr & FILE_ATTRIBUTE_DIRECTORY) != 0 + || (attr & FILE_ATTRIBUTE_READONLY) == 0); + } + + if ((! isDirectory()) && fullPath.containsChar (getSeparatorChar())) + return getParentDirectory().hasWriteAccess(); - // NB: According to MS, the FILE_ATTRIBUTE_READONLY attribute doesn't work for - // folders, and can be incorrectly set for some special folders, so we'll just say - // that folders are always writable. - return attr == INVALID_FILE_ATTRIBUTES - || (attr & FILE_ATTRIBUTE_DIRECTORY) != 0 - || (attr & FILE_ATTRIBUTE_READONLY) == 0; + return false; +} + +bool File::hasReadAccess() const +{ + return WindowsFileHelpers::hasFileAccess (*this, GENERIC_READ); } bool File::setFileReadOnlyInternal (bool shouldBeReadOnly) const @@ -618,17 +703,18 @@ switch (type) { - case userHomeDirectory: csidlType = CSIDL_PROFILE; break; - case userDocumentsDirectory: csidlType = CSIDL_PERSONAL; break; - case userDesktopDirectory: csidlType = CSIDL_DESKTOP; break; - case userApplicationDataDirectory: csidlType = CSIDL_APPDATA; break; - case commonApplicationDataDirectory: csidlType = CSIDL_COMMON_APPDATA; break; - case commonDocumentsDirectory: csidlType = CSIDL_COMMON_DOCUMENTS; break; - case globalApplicationsDirectory: csidlType = CSIDL_PROGRAM_FILES; break; - case globalApplicationsDirectoryX86: csidlType = CSIDL_PROGRAM_FILESX86; break; - case userMusicDirectory: csidlType = 0x0d; /*CSIDL_MYMUSIC*/ break; - case userMoviesDirectory: csidlType = 0x0e; /*CSIDL_MYVIDEO*/ break; - case userPicturesDirectory: csidlType = 0x27; /*CSIDL_MYPICTURES*/ break; + case userHomeDirectory: csidlType = CSIDL_PROFILE; break; + case userDocumentsDirectory: csidlType = CSIDL_PERSONAL; break; + case userDesktopDirectory: csidlType = CSIDL_DESKTOP; break; + case userApplicationDataDirectory: csidlType = CSIDL_APPDATA; break; + case commonApplicationDataDirectory: csidlType = CSIDL_COMMON_APPDATA; break; + case commonDocumentsDirectory: csidlType = CSIDL_COMMON_DOCUMENTS; break; + case globalApplicationsDirectory: csidlType = CSIDL_PROGRAM_FILES; break; + case globalApplicationsDirectoryX86: csidlType = CSIDL_PROGRAM_FILESX86; break; + case windowsLocalAppData: csidlType = CSIDL_LOCAL_APPDATA; break; + case userMusicDirectory: csidlType = 0x0d; /*CSIDL_MYMUSIC*/ break; + case userMoviesDirectory: csidlType = 0x0e; /*CSIDL_MYVIDEO*/ break; + case userPicturesDirectory: csidlType = 0x27; /*CSIDL_MYPICTURES*/ break; case tempDirectory: { diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_win32_Network.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_win32_Network.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_win32_Network.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_win32_Network.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_win32_Registry.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_win32_Registry.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_win32_Registry.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_win32_Registry.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_win32_SystemStats.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_win32_SystemStats.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_win32_SystemStats.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_win32_SystemStats.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -214,6 +214,7 @@ return 0; } #else + RTL_OSVERSIONINFOW getWindowsVersionInfo(); RTL_OSVERSIONINFOW getWindowsVersionInfo() { RTL_OSVERSIONINFOW versionInfo = {}; diff -Nru juce-6.1.5~ds0/modules/juce_core/native/juce_win32_Threads.cpp juce-7.0.0~ds0/modules/juce_core/native/juce_win32_Threads.cpp --- juce-6.1.5~ds0/modules/juce_core/native/juce_win32_Threads.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/native/juce_win32_Threads.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -197,6 +197,7 @@ // called when the app gains focus because Windows does weird things to process priority // when you swap apps, and this forces an update when the app is brought to the front. +void juce_repeatLastProcessPriority(); void juce_repeatLastProcessPriority() { if (lastProcessPriority >= 0) // (avoid changing this if it's not been explicitly set by the app..) @@ -265,6 +266,7 @@ ExitProcess (1); } +bool juce_isRunningInWine(); bool juce_isRunningInWine() { HMODULE ntdll = GetModuleHandleA ("ntdll"); diff -Nru juce-6.1.5~ds0/modules/juce_core/network/juce_IPAddress.cpp juce-7.0.0~ds0/modules/juce_core/network/juce_IPAddress.cpp --- juce-6.1.5~ds0/modules/juce_core/network/juce_IPAddress.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/network/juce_IPAddress.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/network/juce_IPAddress.h juce-7.0.0~ds0/modules/juce_core/network/juce_IPAddress.h --- juce-6.1.5~ds0/modules/juce_core/network/juce_IPAddress.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/network/juce_IPAddress.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/network/juce_MACAddress.cpp juce-7.0.0~ds0/modules/juce_core/network/juce_MACAddress.cpp --- juce-6.1.5~ds0/modules/juce_core/network/juce_MACAddress.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/network/juce_MACAddress.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/network/juce_MACAddress.h juce-7.0.0~ds0/modules/juce_core/network/juce_MACAddress.h --- juce-6.1.5~ds0/modules/juce_core/network/juce_MACAddress.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/network/juce_MACAddress.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/network/juce_NamedPipe.cpp juce-7.0.0~ds0/modules/juce_core/network/juce_NamedPipe.cpp --- juce-6.1.5~ds0/modules/juce_core/network/juce_NamedPipe.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/network/juce_NamedPipe.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/network/juce_NamedPipe.h juce-7.0.0~ds0/modules/juce_core/network/juce_NamedPipe.h --- juce-6.1.5~ds0/modules/juce_core/network/juce_NamedPipe.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/network/juce_NamedPipe.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/network/juce_Socket.cpp juce-7.0.0~ds0/modules/juce_core/network/juce_Socket.cpp --- juce-6.1.5~ds0/modules/juce_core/network/juce_Socket.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/network/juce_Socket.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/network/juce_Socket.h juce-7.0.0~ds0/modules/juce_core/network/juce_Socket.h --- juce-6.1.5~ds0/modules/juce_core/network/juce_Socket.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/network/juce_Socket.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/network/juce_URL.cpp juce-7.0.0~ds0/modules/juce_core/network/juce_URL.cpp --- juce-6.1.5~ds0/modules/juce_core/network/juce_URL.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/network/juce_URL.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -790,12 +790,13 @@ JUCE_END_IGNORE_WARNINGS_GCC_LIKE } -#if JUCE_ANDROID -OutputStream* juce_CreateContentURIOutputStream (const URL&); -#endif - std::unique_ptr URL::createOutputStream() const { + #if JUCE_ANDROID + if (auto stream = AndroidDocument::fromDocument (*this).createOutputStream()) + return stream; + #endif + if (isLocalFile()) { #if JUCE_IOS @@ -806,11 +807,7 @@ #endif } - #if JUCE_ANDROID - return std::unique_ptr (juce_CreateContentURIOutputStream (*this)); - #else return nullptr; - #endif } //============================================================================== diff -Nru juce-6.1.5~ds0/modules/juce_core/network/juce_URL.h juce-7.0.0~ds0/modules/juce_core/network/juce_URL.h --- juce-6.1.5~ds0/modules/juce_core/network/juce_URL.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/network/juce_URL.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -52,9 +52,6 @@ /** Creates URL referring to a local file on your disk using the file:// scheme. */ explicit URL (File localFile); - /** Destructor. */ - ~URL() = default; - /** Compares two URLs. All aspects of the URLs must be identical for them to match, including any parameters, @@ -147,7 +144,7 @@ @see withNewSubPath */ - URL withNewDomainAndPath (const String& newFullPath) const; + JUCE_NODISCARD URL withNewDomainAndPath (const String& newFullPath) const; /** Returns a new version of this URL with a different sub-path. @@ -156,7 +153,7 @@ @see withNewDomainAndPath */ - URL withNewSubPath (const String& newPath) const; + JUCE_NODISCARD URL withNewSubPath (const String& newPath) const; /** Attempts to return a URL which is the parent folder containing this URL. @@ -189,8 +186,8 @@ @see getParameterNames, getParameterValues */ - URL withParameter (const String& parameterName, - const String& parameterValue) const; + JUCE_NODISCARD URL withParameter (const String& parameterName, + const String& parameterValue) const; /** Returns a copy of this URL, with a set of GET or POST parameters added. @@ -198,7 +195,7 @@ @see withParameter */ - URL withParameters (const StringPairArray& parametersToAdd) const; + JUCE_NODISCARD URL withParameters (const StringPairArray& parametersToAdd) const; /** Returns a copy of this URL, with a file-upload type parameter added to it. @@ -211,9 +208,9 @@ @see withDataToUpload */ - URL withFileToUpload (const String& parameterName, - const File& fileToUpload, - const String& mimeType) const; + JUCE_NODISCARD URL withFileToUpload (const String& parameterName, + const File& fileToUpload, + const String& mimeType) const; /** Returns a copy of this URL, with a file-upload type parameter added to it. @@ -225,10 +222,10 @@ @see withFileToUpload */ - URL withDataToUpload (const String& parameterName, - const String& filename, - const MemoryBlock& fileContentToUpload, - const String& mimeType) const; + JUCE_NODISCARD URL withDataToUpload (const String& parameterName, + const String& filename, + const MemoryBlock& fileContentToUpload, + const String& mimeType) const; /** Returns an array of the names of all the URL's parameters. @@ -264,7 +261,7 @@ If no HTTP command is set when calling createInputStream() to read from this URL and some data has been set, it will do a POST request. */ - URL withPOSTData (const String& postData) const; + JUCE_NODISCARD URL withPOSTData (const String& postData) const; /** Returns a copy of this URL, with a block of data to send as the POST data. @@ -274,7 +271,7 @@ If no HTTP command is set when calling createInputStream() to read from this URL and some data has been set, it will do a POST request. */ - URL withPOSTData (const MemoryBlock& postData) const; + JUCE_NODISCARD URL withPOSTData (const MemoryBlock& postData) const; /** Returns the data that was set using withPOSTData(). */ String getPostData() const { return postData.toString(); } @@ -337,36 +334,36 @@ This can be useful for lengthy POST operations, so that you can provide user feedback. */ - InputStreamOptions withProgressCallback (std::function progressCallback) const; + JUCE_NODISCARD InputStreamOptions withProgressCallback (std::function progressCallback) const; /** A string that will be appended onto the headers that are used for the request. It must be a valid set of HTML header directives, separated by newlines. */ - InputStreamOptions withExtraHeaders (const String& extraHeaders) const; + JUCE_NODISCARD InputStreamOptions withExtraHeaders (const String& extraHeaders) const; /** Specifies a timeout for the request in milliseconds. If 0, this will use whatever default setting the OS chooses. If a negative number, it will be infinite. */ - InputStreamOptions withConnectionTimeoutMs (int connectionTimeoutMs) const; + JUCE_NODISCARD InputStreamOptions withConnectionTimeoutMs (int connectionTimeoutMs) const; /** If this is non-null, all the (key, value) pairs received as headers in the response will be stored in this array. */ - InputStreamOptions withResponseHeaders (StringPairArray* responseHeaders) const; + JUCE_NODISCARD InputStreamOptions withResponseHeaders (StringPairArray* responseHeaders) const; /** If this is non-null, it will get set to the http status code, if one is known, or 0 if a code isn't available. */ - InputStreamOptions withStatusCode (int* statusCode) const; + JUCE_NODISCARD InputStreamOptions withStatusCode (int* statusCode) const; /** Specifies the number of redirects that will be followed before returning a response. N.B. This will be ignored on Android which follows up to 5 redirects. */ - InputStreamOptions withNumRedirectsToFollow (int numRedirectsToFollow) const; + JUCE_NODISCARD InputStreamOptions withNumRedirectsToFollow (int numRedirectsToFollow) const; /** Specifies which HTTP request command to use. @@ -375,7 +372,7 @@ via withPOSTData(), withFileToUpload(), or withDataToUpload(). Otherwise it will be GET. */ - InputStreamOptions withHttpRequestCmd (const String& httpRequestCmd) const; + JUCE_NODISCARD InputStreamOptions withHttpRequestCmd (const String& httpRequestCmd) const; //============================================================================== ParameterHandling getParameterHandling() const noexcept { return parameterHandling; } @@ -459,7 +456,7 @@ bool usePost = false; /** Specifies headers to add to the request. */ - auto withExtraHeaders (String value) const { return with (&DownloadTaskOptions::extraHeaders, std::move (value)); } + JUCE_NODISCARD auto withExtraHeaders (String value) const { return with (&DownloadTaskOptions::extraHeaders, std::move (value)); } /** On iOS, specifies the container where the downloaded file will be stored. @@ -468,17 +465,17 @@ This is currently unused on other platforms. */ - auto withSharedContainer (String value) const { return with (&DownloadTaskOptions::sharedContainer, std::move (value)); } + JUCE_NODISCARD auto withSharedContainer (String value) const { return with (&DownloadTaskOptions::sharedContainer, std::move (value)); } /** Specifies an observer for the download task. */ - auto withListener (DownloadTaskListener* value) const { return with (&DownloadTaskOptions::listener, std::move (value)); } + JUCE_NODISCARD auto withListener (DownloadTaskListener* value) const { return with (&DownloadTaskOptions::listener, std::move (value)); } /** Specifies whether a post command should be used. */ - auto withUsePost (bool value) const { return with (&DownloadTaskOptions::usePost, value); } + JUCE_NODISCARD auto withUsePost (bool value) const { return with (&DownloadTaskOptions::usePost, value); } private: template - DownloadTaskOptions with (Member&& member, Value&& value) const + JUCE_NODISCARD DownloadTaskOptions with (Member&& member, Value&& value) const { auto copy = *this; copy.*member = std::forward (value); diff -Nru juce-6.1.5~ds0/modules/juce_core/network/juce_WebInputStream.cpp juce-7.0.0~ds0/modules/juce_core/network/juce_WebInputStream.cpp --- juce-6.1.5~ds0/modules/juce_core/network/juce_WebInputStream.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/network/juce_WebInputStream.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/network/juce_WebInputStream.h juce-7.0.0~ds0/modules/juce_core/network/juce_WebInputStream.h --- juce-6.1.5~ds0/modules/juce_core/network/juce_WebInputStream.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/network/juce_WebInputStream.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_BufferedInputStream.cpp juce-7.0.0~ds0/modules/juce_core/streams/juce_BufferedInputStream.cpp --- juce-6.1.5~ds0/modules/juce_core/streams/juce_BufferedInputStream.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_BufferedInputStream.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_BufferedInputStream.h juce-7.0.0~ds0/modules/juce_core/streams/juce_BufferedInputStream.h --- juce-6.1.5~ds0/modules/juce_core/streams/juce_BufferedInputStream.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_BufferedInputStream.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_FileInputSource.cpp juce-7.0.0~ds0/modules/juce_core/streams/juce_FileInputSource.cpp --- juce-6.1.5~ds0/modules/juce_core/streams/juce_FileInputSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_FileInputSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_FileInputSource.h juce-7.0.0~ds0/modules/juce_core/streams/juce_FileInputSource.h --- juce-6.1.5~ds0/modules/juce_core/streams/juce_FileInputSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_FileInputSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_InputSource.h juce-7.0.0~ds0/modules/juce_core/streams/juce_InputSource.h --- juce-6.1.5~ds0/modules/juce_core/streams/juce_InputSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_InputSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_InputStream.cpp juce-7.0.0~ds0/modules/juce_core/streams/juce_InputStream.cpp --- juce-6.1.5~ds0/modules/juce_core/streams/juce_InputStream.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_InputStream.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_InputStream.h juce-7.0.0~ds0/modules/juce_core/streams/juce_InputStream.h --- juce-6.1.5~ds0/modules/juce_core/streams/juce_InputStream.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_InputStream.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_MemoryInputStream.cpp juce-7.0.0~ds0/modules/juce_core/streams/juce_MemoryInputStream.cpp --- juce-6.1.5~ds0/modules/juce_core/streams/juce_MemoryInputStream.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_MemoryInputStream.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_MemoryInputStream.h juce-7.0.0~ds0/modules/juce_core/streams/juce_MemoryInputStream.h --- juce-6.1.5~ds0/modules/juce_core/streams/juce_MemoryInputStream.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_MemoryInputStream.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_MemoryOutputStream.cpp juce-7.0.0~ds0/modules/juce_core/streams/juce_MemoryOutputStream.cpp --- juce-6.1.5~ds0/modules/juce_core/streams/juce_MemoryOutputStream.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_MemoryOutputStream.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_MemoryOutputStream.h juce-7.0.0~ds0/modules/juce_core/streams/juce_MemoryOutputStream.h --- juce-6.1.5~ds0/modules/juce_core/streams/juce_MemoryOutputStream.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_MemoryOutputStream.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_OutputStream.cpp juce-7.0.0~ds0/modules/juce_core/streams/juce_OutputStream.cpp --- juce-6.1.5~ds0/modules/juce_core/streams/juce_OutputStream.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_OutputStream.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_OutputStream.h juce-7.0.0~ds0/modules/juce_core/streams/juce_OutputStream.h --- juce-6.1.5~ds0/modules/juce_core/streams/juce_OutputStream.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_OutputStream.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_SubregionStream.cpp juce-7.0.0~ds0/modules/juce_core/streams/juce_SubregionStream.cpp --- juce-6.1.5~ds0/modules/juce_core/streams/juce_SubregionStream.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_SubregionStream.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_SubregionStream.h juce-7.0.0~ds0/modules/juce_core/streams/juce_SubregionStream.h --- juce-6.1.5~ds0/modules/juce_core/streams/juce_SubregionStream.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_SubregionStream.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_URLInputSource.cpp juce-7.0.0~ds0/modules/juce_core/streams/juce_URLInputSource.cpp --- juce-6.1.5~ds0/modules/juce_core/streams/juce_URLInputSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_URLInputSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/streams/juce_URLInputSource.h juce-7.0.0~ds0/modules/juce_core/streams/juce_URLInputSource.h --- juce-6.1.5~ds0/modules/juce_core/streams/juce_URLInputSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/streams/juce_URLInputSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/system/juce_CompilerSupport.h juce-7.0.0~ds0/modules/juce_core/system/juce_CompilerSupport.h --- juce-6.1.5~ds0/modules/juce_core/system/juce_CompilerSupport.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/system/juce_CompilerSupport.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -72,8 +72,8 @@ // MSVC #if JUCE_MSVC - #if _MSC_FULL_VER < 190024210 // VS2015 - #error "JUCE requires Visual Studio 2015 Update 3 or later" + #if _MSC_FULL_VER < 191025017 // VS2017 + #error "JUCE requires Visual Studio 2017 or later" #endif #ifndef JUCE_EXCEPTIONS_DISABLED @@ -101,3 +101,9 @@ #define JUCE_DELETED_FUNCTION = delete #define JUCE_CONSTEXPR constexpr #endif + +#if JUCE_CXX17_IS_AVAILABLE + #define JUCE_NODISCARD [[nodiscard]] +#else + #define JUCE_NODISCARD +#endif diff -Nru juce-6.1.5~ds0/modules/juce_core/system/juce_CompilerWarnings.h juce-7.0.0~ds0/modules/juce_core/system/juce_CompilerWarnings.h --- juce-6.1.5~ds0/modules/juce_core/system/juce_CompilerWarnings.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/system/juce_CompilerWarnings.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/system/juce_PlatformDefs.h juce-7.0.0~ds0/modules/juce_core/system/juce_PlatformDefs.h --- juce-6.1.5~ds0/modules/juce_core/system/juce_PlatformDefs.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/system/juce_PlatformDefs.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/system/juce_StandardHeader.h juce-7.0.0~ds0/modules/juce_core/system/juce_StandardHeader.h --- juce-6.1.5~ds0/modules/juce_core/system/juce_StandardHeader.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/system/juce_StandardHeader.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -27,9 +27,9 @@ See also SystemStats::getJUCEVersion() for a string version. */ -#define JUCE_MAJOR_VERSION 6 -#define JUCE_MINOR_VERSION 1 -#define JUCE_BUILDNUMBER 5 +#define JUCE_MAJOR_VERSION 7 +#define JUCE_MINOR_VERSION 0 +#define JUCE_BUILDNUMBER 0 /** Current JUCE version number. @@ -41,6 +41,11 @@ */ #define JUCE_VERSION ((JUCE_MAJOR_VERSION << 16) + (JUCE_MINOR_VERSION << 8) + JUCE_BUILDNUMBER) +#if ! DOXYGEN +#define JUCE_VERSION_ID \ + volatile auto juceVersionId = "juce_version_" JUCE_STRINGIFY(JUCE_MAJOR_VERSION) "_" JUCE_STRINGIFY(JUCE_MINOR_VERSION) "_" JUCE_STRINGIFY(JUCE_BUILDNUMBER); \ + ignoreUnused (juceVersionId); +#endif //============================================================================== #include @@ -55,14 +60,16 @@ #include #include #include -#include #include #include #include #include +#include #include #include +#include #include +#include #include #include diff -Nru juce-6.1.5~ds0/modules/juce_core/system/juce_SystemStats.cpp juce-7.0.0~ds0/modules/juce_core/system/juce_SystemStats.cpp --- juce-6.1.5~ds0/modules/juce_core/system/juce_SystemStats.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/system/juce_SystemStats.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/system/juce_SystemStats.h juce-7.0.0~ds0/modules/juce_core/system/juce_SystemStats.h --- juce-6.1.5~ds0/modules/juce_core/system/juce_SystemStats.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/system/juce_SystemStats.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/system/juce_TargetPlatform.h juce-7.0.0~ds0/modules/juce_core/system/juce_TargetPlatform.h --- juce-6.1.5~ds0/modules/juce_core/system/juce_TargetPlatform.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/system/juce_TargetPlatform.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -144,8 +144,8 @@ #endif #if JUCE_MAC - #if ! defined (MAC_OS_X_VERSION_10_11) - #error "The 10.11 SDK (Xcode 7.3.1+) is required to build JUCE apps. You can create apps that run on macOS 10.7+ by changing the deployment target." + #if ! defined (MAC_OS_X_VERSION_10_14) + #error "The 10.14 SDK (Xcode 10.1+) is required to build JUCE apps. You can create apps that run on macOS 10.7+ by changing the deployment target." #elif MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7 #error "Building for OSX 10.6 is no longer supported!" #endif diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_Base64.cpp juce-7.0.0~ds0/modules/juce_core/text/juce_Base64.cpp --- juce-6.1.5~ds0/modules/juce_core/text/juce_Base64.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_Base64.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_Base64.h juce-7.0.0~ds0/modules/juce_core/text/juce_Base64.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_Base64.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_Base64.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_CharacterFunctions.cpp juce-7.0.0~ds0/modules/juce_core/text/juce_CharacterFunctions.cpp --- juce-6.1.5~ds0/modules/juce_core/text/juce_CharacterFunctions.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_CharacterFunctions.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_CharacterFunctions.h juce-7.0.0~ds0/modules/juce_core/text/juce_CharacterFunctions.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_CharacterFunctions.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_CharacterFunctions.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -500,10 +500,10 @@ while (! t.isEmpty()) { - auto hexValue = static_cast (CharacterFunctions::getHexDigitValue (t.getAndAdvance())); + auto hexValue = CharacterFunctions::getHexDigitValue (t.getAndAdvance()); if (hexValue >= 0) - result = static_cast (result << 4) | hexValue; + result = static_cast (result << 4) | static_cast (hexValue); } return result; diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_CharPointer_ASCII.h juce-7.0.0~ds0/modules/juce_core/text/juce_CharPointer_ASCII.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_CharPointer_ASCII.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_CharPointer_ASCII.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_CharPointer_UTF16.h juce-7.0.0~ds0/modules/juce_core/text/juce_CharPointer_UTF16.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_CharPointer_UTF16.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_CharPointer_UTF16.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_CharPointer_UTF32.h juce-7.0.0~ds0/modules/juce_core/text/juce_CharPointer_UTF32.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_CharPointer_UTF32.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_CharPointer_UTF32.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_CharPointer_UTF8.h juce-7.0.0~ds0/modules/juce_core/text/juce_CharPointer_UTF8.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_CharPointer_UTF8.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_CharPointer_UTF8.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_Identifier.cpp juce-7.0.0~ds0/modules/juce_core/text/juce_Identifier.cpp --- juce-6.1.5~ds0/modules/juce_core/text/juce_Identifier.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_Identifier.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_Identifier.h juce-7.0.0~ds0/modules/juce_core/text/juce_Identifier.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_Identifier.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_Identifier.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_LocalisedStrings.cpp juce-7.0.0~ds0/modules/juce_core/text/juce_LocalisedStrings.cpp --- juce-6.1.5~ds0/modules/juce_core/text/juce_LocalisedStrings.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_LocalisedStrings.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_LocalisedStrings.h juce-7.0.0~ds0/modules/juce_core/text/juce_LocalisedStrings.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_LocalisedStrings.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_LocalisedStrings.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_NewLine.h juce-7.0.0~ds0/modules/juce_core/text/juce_NewLine.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_NewLine.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_NewLine.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_StringArray.cpp juce-7.0.0~ds0/modules/juce_core/text/juce_StringArray.cpp --- juce-6.1.5~ds0/modules/juce_core/text/juce_StringArray.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_StringArray.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_StringArray.h juce-7.0.0~ds0/modules/juce_core/text/juce_StringArray.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_StringArray.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_StringArray.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_String.cpp juce-7.0.0~ds0/modules/juce_core/text/juce_String.cpp --- juce-6.1.5~ds0/modules/juce_core/text/juce_String.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_String.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -45,40 +45,40 @@ } //============================================================================== -// (Mirrors the structure of StringHolder, but without the atomic member, so can be statically constructed) -struct EmptyString +struct StringHolder { - int refCount; - size_t allocatedBytes; - String::CharPointerType::CharType text; + using CharPointerType = String::CharPointerType; + using CharType = String::CharPointerType::CharType; + + std::atomic refCount { 0 }; + size_t allocatedNumBytes = sizeof (CharType); + CharType text[1] { 0 }; }; -static const EmptyString emptyString { 0x3fffffff, sizeof (String::CharPointerType::CharType), 0 }; +constexpr StringHolder emptyString; //============================================================================== -class StringHolder +class StringHolderUtils { public: - StringHolder() = delete; - - using CharPointerType = String::CharPointerType; - using CharType = String::CharPointerType::CharType; + using CharPointerType = StringHolder::CharPointerType; + using CharType = StringHolder::CharType; - //============================================================================== static CharPointerType createUninitialisedBytes (size_t numBytes) { numBytes = (numBytes + 3) & ~(size_t) 3; - auto s = unalignedPointerCast (new char [sizeof (StringHolder) - sizeof (CharType) + numBytes]); - s->refCount.value = 0; + auto* bytes = new char [sizeof (StringHolder) - sizeof (CharType) + numBytes]; + auto s = unalignedPointerCast (bytes); + s->refCount = 0; s->allocatedNumBytes = numBytes; - return CharPointerType (s->text); + return CharPointerType (unalignedPointerCast (bytes + offsetof (StringHolder, text))); } template static CharPointerType createFromCharPointer (const CharPointer text) { if (text.getAddress() == nullptr || text.isEmpty()) - return CharPointerType (&(emptyString.text)); + return CharPointerType (emptyString.text); auto bytesNeeded = sizeof (CharType) + CharPointerType::getBytesRequiredFor (text); auto dest = createUninitialisedBytes (bytesNeeded); @@ -90,7 +90,7 @@ static CharPointerType createFromCharPointer (const CharPointer text, size_t maxChars) { if (text.getAddress() == nullptr || text.isEmpty() || maxChars == 0) - return CharPointerType (&(emptyString.text)); + return CharPointerType (emptyString.text); auto end = text; size_t numChars = 0; @@ -111,7 +111,7 @@ static CharPointerType createFromCharPointer (const CharPointer start, const CharPointer end) { if (start.getAddress() == nullptr || start.isEmpty()) - return CharPointerType (&(emptyString.text)); + return CharPointerType (emptyString.text); auto e = start; int numChars = 0; @@ -131,7 +131,7 @@ static CharPointerType createFromCharPointer (const CharPointerType start, const CharPointerType end) { if (start.getAddress() == nullptr || start.isEmpty()) - return CharPointerType (&(emptyString.text)); + return CharPointerType (emptyString.text); auto numBytes = (size_t) (reinterpret_cast (end.getAddress()) - reinterpret_cast (start.getAddress())); @@ -171,7 +171,7 @@ static int getReferenceCount (const CharPointerType text) noexcept { - return bufferFromText (text)->refCount.get() + 1; + return bufferFromText (text)->refCount + 1; } //============================================================================== @@ -186,7 +186,7 @@ return newText; } - if (b->allocatedNumBytes >= numBytes && b->refCount.get() <= 0) + if (b->allocatedNumBytes >= numBytes && b->refCount <= 0) return text; auto newText = createUninitialisedBytes (jmax (b->allocatedNumBytes, numBytes)); @@ -201,22 +201,18 @@ return bufferFromText (text)->allocatedNumBytes; } - //============================================================================== - Atomic refCount; - size_t allocatedNumBytes; - CharType text[1]; - private: - static StringHolder* bufferFromText (const CharPointerType text) noexcept + StringHolderUtils() = delete; + ~StringHolderUtils() = delete; + + static StringHolder* bufferFromText (const CharPointerType charPtr) noexcept { - // (Can't use offsetof() here because of warnings about this not being a POD) - return unalignedPointerCast (reinterpret_cast (text.getAddress()) - - (reinterpret_cast (reinterpret_cast (128)->text) - 128)); + return unalignedPointerCast (unalignedPointerCast (charPtr.getAddress()) - offsetof (StringHolder, text)); } static bool isEmptyString (StringHolder* other) { - return (other->refCount.get() & 0x30000000) != 0; + return other == &emptyString; } void compileTimeChecks() @@ -231,25 +227,22 @@ #else #error "native wchar_t size is unknown" #endif - - static_assert (sizeof (EmptyString) == sizeof (StringHolder), - "StringHolder is not large enough to hold an empty String"); } }; //============================================================================== -String::String() noexcept : text (&(emptyString.text)) +String::String() noexcept : text (emptyString.text) { } String::~String() noexcept { - StringHolder::release (text); + StringHolderUtils::release (text); } String::String (const String& other) noexcept : text (other.text) { - StringHolder::retain (text); + StringHolderUtils::retain (text); } void String::swapWith (String& other) noexcept @@ -259,20 +252,20 @@ void String::clear() noexcept { - StringHolder::release (text); - text = &(emptyString.text); + StringHolderUtils::release (text); + text = emptyString.text; } String& String::operator= (const String& other) noexcept { - StringHolder::retain (other.text); - StringHolder::release (text.atomicSwap (other.text)); + StringHolderUtils::retain (other.text); + StringHolderUtils::release (text.atomicSwap (other.text)); return *this; } String::String (String&& other) noexcept : text (other.text) { - other.text = &(emptyString.text); + other.text = emptyString.text; } String& String::operator= (String&& other) noexcept @@ -284,23 +277,23 @@ inline String::PreallocationBytes::PreallocationBytes (const size_t num) noexcept : numBytes (num) {} String::String (const PreallocationBytes& preallocationSize) - : text (StringHolder::createUninitialisedBytes (preallocationSize.numBytes + sizeof (CharPointerType::CharType))) + : text (StringHolderUtils::createUninitialisedBytes (preallocationSize.numBytes + sizeof (CharPointerType::CharType))) { } void String::preallocateBytes (const size_t numBytesNeeded) { - text = StringHolder::makeUniqueWithByteSize (text, numBytesNeeded + sizeof (CharPointerType::CharType)); + text = StringHolderUtils::makeUniqueWithByteSize (text, numBytesNeeded + sizeof (CharPointerType::CharType)); } int String::getReferenceCount() const noexcept { - return StringHolder::getReferenceCount (text); + return StringHolderUtils::getReferenceCount (text); } //============================================================================== String::String (const char* const t) - : text (StringHolder::createFromCharPointer (CharPointer_ASCII (t))) + : text (StringHolderUtils::createFromCharPointer (CharPointer_ASCII (t))) { /* If you get an assertion here, then you're trying to create a string from 8-bit data that contains values greater than 127. These can NOT be correctly converted to unicode @@ -323,7 +316,7 @@ } String::String (const char* const t, const size_t maxChars) - : text (StringHolder::createFromCharPointer (CharPointer_ASCII (t), maxChars)) + : text (StringHolderUtils::createFromCharPointer (CharPointer_ASCII (t), maxChars)) { /* If you get an assertion here, then you're trying to create a string from 8-bit data that contains values greater than 127. These can NOT be correctly converted to unicode @@ -345,23 +338,23 @@ jassert (t == nullptr || CharPointer_ASCII::isValidString (t, (int) maxChars)); } -String::String (const wchar_t* const t) : text (StringHolder::createFromCharPointer (castToCharPointer_wchar_t (t))) {} -String::String (const CharPointer_UTF8 t) : text (StringHolder::createFromCharPointer (t)) {} -String::String (const CharPointer_UTF16 t) : text (StringHolder::createFromCharPointer (t)) {} -String::String (const CharPointer_UTF32 t) : text (StringHolder::createFromCharPointer (t)) {} -String::String (const CharPointer_ASCII t) : text (StringHolder::createFromCharPointer (t)) {} - -String::String (CharPointer_UTF8 t, size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {} -String::String (CharPointer_UTF16 t, size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {} -String::String (CharPointer_UTF32 t, size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {} -String::String (const wchar_t* t, size_t maxChars) : text (StringHolder::createFromCharPointer (castToCharPointer_wchar_t (t), maxChars)) {} - -String::String (CharPointer_UTF8 start, CharPointer_UTF8 end) : text (StringHolder::createFromCharPointer (start, end)) {} -String::String (CharPointer_UTF16 start, CharPointer_UTF16 end) : text (StringHolder::createFromCharPointer (start, end)) {} -String::String (CharPointer_UTF32 start, CharPointer_UTF32 end) : text (StringHolder::createFromCharPointer (start, end)) {} +String::String (const wchar_t* const t) : text (StringHolderUtils::createFromCharPointer (castToCharPointer_wchar_t (t))) {} +String::String (const CharPointer_UTF8 t) : text (StringHolderUtils::createFromCharPointer (t)) {} +String::String (const CharPointer_UTF16 t) : text (StringHolderUtils::createFromCharPointer (t)) {} +String::String (const CharPointer_UTF32 t) : text (StringHolderUtils::createFromCharPointer (t)) {} +String::String (const CharPointer_ASCII t) : text (StringHolderUtils::createFromCharPointer (t)) {} + +String::String (CharPointer_UTF8 t, size_t maxChars) : text (StringHolderUtils::createFromCharPointer (t, maxChars)) {} +String::String (CharPointer_UTF16 t, size_t maxChars) : text (StringHolderUtils::createFromCharPointer (t, maxChars)) {} +String::String (CharPointer_UTF32 t, size_t maxChars) : text (StringHolderUtils::createFromCharPointer (t, maxChars)) {} +String::String (const wchar_t* t, size_t maxChars) : text (StringHolderUtils::createFromCharPointer (castToCharPointer_wchar_t (t), maxChars)) {} + +String::String (CharPointer_UTF8 start, CharPointer_UTF8 end) : text (StringHolderUtils::createFromCharPointer (start, end)) {} +String::String (CharPointer_UTF16 start, CharPointer_UTF16 end) : text (StringHolderUtils::createFromCharPointer (start, end)) {} +String::String (CharPointer_UTF32 start, CharPointer_UTF32 end) : text (StringHolderUtils::createFromCharPointer (start, end)) {} -String::String (const std::string& s) : text (StringHolder::createFromFixedLength (s.data(), s.size())) {} -String::String (StringRef s) : text (StringHolder::createFromCharPointer (s.text)) {} +String::String (const std::string& s) : text (StringHolderUtils::createFromFixedLength (s.data(), s.size())) {} +String::String (StringRef s) : text (StringHolderUtils::createFromCharPointer (s.text)) {} String String::charToString (juce_wchar character) { @@ -487,7 +480,7 @@ char buffer [charsNeededForInt]; auto* end = buffer + numElementsInArray (buffer); auto* start = numberToString (end, number); - return StringHolder::createFromFixedLength (start, (size_t) (end - start - 1)); + return StringHolderUtils::createFromFixedLength (start, (size_t) (end - start - 1)); } static String::CharPointerType createFromDouble (double number, int numberOfDecimalPlaces, bool useScientificNotation) @@ -495,7 +488,7 @@ char buffer [charsNeededForDouble]; size_t len; auto start = doubleToString (buffer, number, numberOfDecimalPlaces, useScientificNotation, len); - return StringHolder::createFromFixedLength (start, len); + return StringHolderUtils::createFromFixedLength (start, len); } } @@ -1322,7 +1315,7 @@ } StringCreationHelper (const String::CharPointerType s) - : source (s), allocatedBytes (StringHolder::getAllocatedNumBytes (s)) + : source (s), allocatedBytes (StringHolderUtils::getAllocatedNumBytes (s)) { result.preallocateBytes (allocatedBytes); dest = result.getCharPointer(); @@ -2467,6 +2460,9 @@ expect (String (StringRef ("abc")) == StringRef ("abc")); expect (String ("abc") + StringRef ("def") == "abcdef"); + expect (String ("0x00").getHexValue32() == 0); + expect (String ("0x100").getHexValue32() == 256); + String s2 ("123"); s2 << ((int) 4) << ((short) 5) << "678" << L"9" << '0'; s2 += "xyz"; diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_String.h juce-7.0.0~ds0/modules/juce_core/text/juce_String.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_String.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_String.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_StringPairArray.cpp juce-7.0.0~ds0/modules/juce_core/text/juce_StringPairArray.cpp --- juce-6.1.5~ds0/modules/juce_core/text/juce_StringPairArray.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_StringPairArray.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_StringPairArray.h juce-7.0.0~ds0/modules/juce_core/text/juce_StringPairArray.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_StringPairArray.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_StringPairArray.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_StringPool.cpp juce-7.0.0~ds0/modules/juce_core/text/juce_StringPool.cpp --- juce-6.1.5~ds0/modules/juce_core/text/juce_StringPool.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_StringPool.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_StringPool.h juce-7.0.0~ds0/modules/juce_core/text/juce_StringPool.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_StringPool.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_StringPool.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_StringRef.h juce-7.0.0~ds0/modules/juce_core/text/juce_StringRef.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_StringRef.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_StringRef.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_TextDiff.cpp juce-7.0.0~ds0/modules/juce_core/text/juce_TextDiff.cpp --- juce-6.1.5~ds0/modules/juce_core/text/juce_TextDiff.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_TextDiff.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/text/juce_TextDiff.h juce-7.0.0~ds0/modules/juce_core/text/juce_TextDiff.h --- juce-6.1.5~ds0/modules/juce_core/text/juce_TextDiff.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/text/juce_TextDiff.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_ChildProcess.cpp juce-7.0.0~ds0/modules/juce_core/threads/juce_ChildProcess.cpp --- juce-6.1.5~ds0/modules/juce_core/threads/juce_ChildProcess.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_ChildProcess.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_ChildProcess.h juce-7.0.0~ds0/modules/juce_core/threads/juce_ChildProcess.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_ChildProcess.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_ChildProcess.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_CriticalSection.h juce-7.0.0~ds0/modules/juce_core/threads/juce_CriticalSection.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_CriticalSection.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_CriticalSection.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_DynamicLibrary.h juce-7.0.0~ds0/modules/juce_core/threads/juce_DynamicLibrary.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_DynamicLibrary.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_DynamicLibrary.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_HighResolutionTimer.cpp juce-7.0.0~ds0/modules/juce_core/threads/juce_HighResolutionTimer.cpp --- juce-6.1.5~ds0/modules/juce_core/threads/juce_HighResolutionTimer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_HighResolutionTimer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_HighResolutionTimer.h juce-7.0.0~ds0/modules/juce_core/threads/juce_HighResolutionTimer.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_HighResolutionTimer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_HighResolutionTimer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_InterProcessLock.h juce-7.0.0~ds0/modules/juce_core/threads/juce_InterProcessLock.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_InterProcessLock.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_InterProcessLock.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_Process.h juce-7.0.0~ds0/modules/juce_core/threads/juce_Process.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_Process.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_Process.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_ReadWriteLock.cpp juce-7.0.0~ds0/modules/juce_core/threads/juce_ReadWriteLock.cpp --- juce-6.1.5~ds0/modules/juce_core/threads/juce_ReadWriteLock.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_ReadWriteLock.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_ReadWriteLock.h juce-7.0.0~ds0/modules/juce_core/threads/juce_ReadWriteLock.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_ReadWriteLock.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_ReadWriteLock.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -74,7 +74,7 @@ thread has it locked for writing, then this will fail and return false. @returns true if the lock is successfully gained. - @see exitRead, ScopedReadLock + @see exitRead, ScopedTryReadLock */ bool tryEnterRead() const noexcept; @@ -106,7 +106,7 @@ to obtain the lock. @returns true if the lock is successfully gained. - @see enterWrite + @see enterWrite, ScopedTryWriteLock */ bool tryEnterWrite() const noexcept; diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_ScopedLock.h juce-7.0.0~ds0/modules/juce_core/threads/juce_ScopedLock.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_ScopedLock.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_ScopedLock.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_ScopedReadLock.h juce-7.0.0~ds0/modules/juce_core/threads/juce_ScopedReadLock.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_ScopedReadLock.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_ScopedReadLock.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -81,4 +81,90 @@ JUCE_DECLARE_NON_COPYABLE (ScopedReadLock) }; +//============================================================================== +/** + Automatically locks and unlocks a ReadWriteLock object. + + Use one of these as a local variable to control access to a ReadWriteLock. + + e.g. @code + + ReadWriteLock myLock; + + for (;;) + { + const ScopedTryReadLock myScopedTryLock (myLock); + + // Unlike using a ScopedReadLock, this may fail to actually get the lock, so you + // should test this with the isLocked() method before doing your thread-unsafe + // action. + + if (myScopedTryLock.isLocked()) + { + ...do some stuff... + } + else + { + ..our attempt at locking failed because a write lock has already been issued.. + } + + // myLock gets unlocked here (if it was locked). + } + @endcode + + @see ReadWriteLock, ScopedTryWriteLock + + @tags{Core} +*/ +class JUCE_API ScopedTryReadLock +{ +public: + //============================================================================== + /** Creates a ScopedTryReadLock and calls ReadWriteLock::tryEnterRead() as soon as it is + created. When the ScopedTryReadLock object is destructed, the ReadWriteLock will be unlocked + (if it was successfully acquired). + + Make sure this object is created and destructed by the same thread, otherwise there are no + guarantees what will happen! Best just to use it as a local stack object, rather than creating + one with the new() operator. + */ + explicit ScopedTryReadLock (ReadWriteLock& lockIn) + : ScopedTryReadLock (lockIn, true) {} + + /** Creates a ScopedTryReadLock. + + If acquireLockOnInitialisation is true then as soon as it is created, this will call + ReadWriteLock::tryEnterRead(), and when the ScopedTryReadLock object is destructed, the + ReadWriteLock will be unlocked (if it was successfully acquired). + + Make sure this object is created and destructed by the same thread, otherwise there are no + guarantees what will happen! Best just to use it as a local stack object, rather than creating + one with the new() operator. + */ + ScopedTryReadLock (ReadWriteLock& lockIn, bool acquireLockOnInitialisation) noexcept + : lock (lockIn), lockWasSuccessful (acquireLockOnInitialisation && lock.tryEnterRead()) {} + + /** Destructor. + + The ReadWriteLock's exitRead() method will be called when the destructor is called. + + Make sure this object is created and destructed by the same thread, otherwise there are no + guarantees what will happen! + */ + ~ScopedTryReadLock() noexcept { if (lockWasSuccessful) lock.exitRead(); } + + /** Returns true if the mutex was successfully locked. */ + bool isLocked() const noexcept { return lockWasSuccessful; } + + /** Retry gaining the lock by calling tryEnter on the underlying lock. */ + bool retryLock() noexcept { return lockWasSuccessful = lock.tryEnterRead(); } + +private: + //============================================================================== + ReadWriteLock& lock; + bool lockWasSuccessful; + + JUCE_DECLARE_NON_COPYABLE (ScopedTryReadLock) +}; + } // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_ScopedWriteLock.h juce-7.0.0~ds0/modules/juce_core/threads/juce_ScopedWriteLock.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_ScopedWriteLock.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_ScopedWriteLock.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -81,4 +81,90 @@ JUCE_DECLARE_NON_COPYABLE (ScopedWriteLock) }; +//============================================================================== +/** + Automatically locks and unlocks a ReadWriteLock object. + + Use one of these as a local variable to control access to a ReadWriteLock. + + e.g. @code + + ReadWriteLock myLock; + + for (;;) + { + const ScopedTryWriteLock myScopedTryLock (myLock); + + // Unlike using a ScopedWriteLock, this may fail to actually get the lock, so you + // should test this with the isLocked() method before doing your thread-unsafe + // action. + + if (myScopedTryLock.isLocked()) + { + ...do some stuff... + } + else + { + ..our attempt at locking failed because some other thread has already locked the object.. + } + + // myLock gets unlocked here (if it was locked). + } + @endcode + + @see ReadWriteLock, ScopedTryWriteLock + + @tags{Core} +*/ +class JUCE_API ScopedTryWriteLock +{ +public: + //============================================================================== + /** Creates a ScopedTryWriteLock and calls ReadWriteLock::tryEnterWrite() immediately. + When the ScopedTryWriteLock object is destructed, the ReadWriteLock will be unlocked + (if it was successfully acquired). + + Make sure this object is created and destructed by the same thread, otherwise there are no + guarantees what will happen! Best just to use it as a local stack object, rather than creating + one with the new() operator. + */ + ScopedTryWriteLock (ReadWriteLock& lockIn) noexcept + : ScopedTryWriteLock (lockIn, true) {} + + /** Creates a ScopedTryWriteLock. + + If acquireLockOnInitialisation is true then as soon as it is created, this will call + ReadWriteLock::tryEnterWrite(), and when the ScopedTryWriteLock object is destructed, the + ReadWriteLock will be unlocked (if it was successfully acquired). + + Make sure this object is created and destructed by the same thread, otherwise there are no + guarantees what will happen! Best just to use it as a local stack object, rather than creating + one with the new() operator. + */ + ScopedTryWriteLock (ReadWriteLock& lockIn, bool acquireLockOnInitialisation) noexcept + : lock (lockIn), lockWasSuccessful (acquireLockOnInitialisation && lock.tryEnterWrite()) {} + + /** Destructor. + + The ReadWriteLock's exitWrite() method will be called when the destructor is called. + + Make sure this object is created and destructed by the same thread, + otherwise there are no guarantees what will happen! + */ + ~ScopedTryWriteLock() noexcept { if (lockWasSuccessful) lock.exitWrite(); } + + /** Returns true if the mutex was successfully locked. */ + bool isLocked() const noexcept { return lockWasSuccessful; } + + /** Retry gaining the lock by calling tryEnter on the underlying lock. */ + bool retryLock() noexcept { return lockWasSuccessful = lock.tryEnterWrite(); } + +private: + //============================================================================== + ReadWriteLock& lock; + bool lockWasSuccessful; + + JUCE_DECLARE_NON_COPYABLE (ScopedTryWriteLock) +}; + } diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_SpinLock.h juce-7.0.0~ds0/modules/juce_core/threads/juce_SpinLock.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_SpinLock.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_SpinLock.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_Thread.cpp juce-7.0.0~ds0/modules/juce_core/threads/juce_Thread.cpp --- juce-6.1.5~ds0/modules/juce_core/threads/juce_Thread.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_Thread.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_Thread.h juce-7.0.0~ds0/modules/juce_core/threads/juce_Thread.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_Thread.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_Thread.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_ThreadLocalValue.h juce-7.0.0~ds0/modules/juce_core/threads/juce_ThreadLocalValue.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_ThreadLocalValue.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_ThreadLocalValue.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_ThreadPool.cpp juce-7.0.0~ds0/modules/juce_core/threads/juce_ThreadPool.cpp --- juce-6.1.5~ds0/modules/juce_core/threads/juce_ThreadPool.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_ThreadPool.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_ThreadPool.h juce-7.0.0~ds0/modules/juce_core/threads/juce_ThreadPool.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_ThreadPool.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_ThreadPool.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_TimeSliceThread.cpp juce-7.0.0~ds0/modules/juce_core/threads/juce_TimeSliceThread.cpp --- juce-6.1.5~ds0/modules/juce_core/threads/juce_TimeSliceThread.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_TimeSliceThread.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_TimeSliceThread.h juce-7.0.0~ds0/modules/juce_core/threads/juce_TimeSliceThread.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_TimeSliceThread.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_TimeSliceThread.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_WaitableEvent.cpp juce-7.0.0~ds0/modules/juce_core/threads/juce_WaitableEvent.cpp --- juce-6.1.5~ds0/modules/juce_core/threads/juce_WaitableEvent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_WaitableEvent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/threads/juce_WaitableEvent.h juce-7.0.0~ds0/modules/juce_core/threads/juce_WaitableEvent.h --- juce-6.1.5~ds0/modules/juce_core/threads/juce_WaitableEvent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/threads/juce_WaitableEvent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/time/juce_PerformanceCounter.cpp juce-7.0.0~ds0/modules/juce_core/time/juce_PerformanceCounter.cpp --- juce-6.1.5~ds0/modules/juce_core/time/juce_PerformanceCounter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/time/juce_PerformanceCounter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/time/juce_PerformanceCounter.h juce-7.0.0~ds0/modules/juce_core/time/juce_PerformanceCounter.h --- juce-6.1.5~ds0/modules/juce_core/time/juce_PerformanceCounter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/time/juce_PerformanceCounter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/time/juce_RelativeTime.cpp juce-7.0.0~ds0/modules/juce_core/time/juce_RelativeTime.cpp --- juce-6.1.5~ds0/modules/juce_core/time/juce_RelativeTime.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/time/juce_RelativeTime.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/time/juce_RelativeTime.h juce-7.0.0~ds0/modules/juce_core/time/juce_RelativeTime.h --- juce-6.1.5~ds0/modules/juce_core/time/juce_RelativeTime.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/time/juce_RelativeTime.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/time/juce_Time.cpp juce-7.0.0~ds0/modules/juce_core/time/juce_Time.cpp --- juce-6.1.5~ds0/modules/juce_core/time/juce_Time.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/time/juce_Time.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/time/juce_Time.h juce-7.0.0~ds0/modules/juce_core/time/juce_Time.h --- juce-6.1.5~ds0/modules/juce_core/time/juce_Time.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/time/juce_Time.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/unit_tests/juce_UnitTestCategories.h juce-7.0.0~ds0/modules/juce_core/unit_tests/juce_UnitTestCategories.h --- juce-6.1.5~ds0/modules/juce_core/unit_tests/juce_UnitTestCategories.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/unit_tests/juce_UnitTestCategories.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -28,6 +28,7 @@ static const String analytics { "Analytics" }; static const String audio { "Audio" }; static const String audioProcessorParameters { "AudioProcessorParameters" }; + static const String audioProcessors { "AudioProcessors" }; static const String blocks { "Blocks" }; static const String compression { "Compression" }; static const String containers { "Containers" }; diff -Nru juce-6.1.5~ds0/modules/juce_core/unit_tests/juce_UnitTest.cpp juce-7.0.0~ds0/modules/juce_core/unit_tests/juce_UnitTest.cpp --- juce-6.1.5~ds0/modules/juce_core/unit_tests/juce_UnitTest.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/unit_tests/juce_UnitTest.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/unit_tests/juce_UnitTest.h juce-7.0.0~ds0/modules/juce_core/unit_tests/juce_UnitTest.h --- juce-6.1.5~ds0/modules/juce_core/unit_tests/juce_UnitTest.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/unit_tests/juce_UnitTest.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/xml/juce_XmlDocument.cpp juce-7.0.0~ds0/modules/juce_core/xml/juce_XmlDocument.cpp --- juce-6.1.5~ds0/modules/juce_core/xml/juce_XmlDocument.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/xml/juce_XmlDocument.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/xml/juce_XmlDocument.h juce-7.0.0~ds0/modules/juce_core/xml/juce_XmlDocument.h --- juce-6.1.5~ds0/modules/juce_core/xml/juce_XmlDocument.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/xml/juce_XmlDocument.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/xml/juce_XmlElement.cpp juce-7.0.0~ds0/modules/juce_core/xml/juce_XmlElement.cpp --- juce-6.1.5~ds0/modules/juce_core/xml/juce_XmlElement.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/xml/juce_XmlElement.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/xml/juce_XmlElement.h juce-7.0.0~ds0/modules/juce_core/xml/juce_XmlElement.h --- juce-6.1.5~ds0/modules/juce_core/xml/juce_XmlElement.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/xml/juce_XmlElement.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -144,8 +144,8 @@ int lineWrapLength = 60; /**< A maximum line length before wrapping is done. (If newLineChars is nullptr, this is ignored) */ const char* newLineChars = "\r\n"; /**< Allows the newline characters to be set. If you set this to nullptr, then the whole XML document will be placed on a single line. */ - TextFormat singleLine() const; /**< returns a copy of this format with newLineChars set to nullptr. */ - TextFormat withoutHeader() const; /**< returns a copy of this format with the addDefaultHeader flag set to false. */ + JUCE_NODISCARD TextFormat singleLine() const; /**< returns a copy of this format with newLineChars set to nullptr. */ + JUCE_NODISCARD TextFormat withoutHeader() const; /**< returns a copy of this format with the addDefaultHeader flag set to false. */ }; /** Returns a text version of this XML element. diff -Nru juce-6.1.5~ds0/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp juce-7.0.0~ds0/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp --- juce-6.1.5~ds0/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h juce-7.0.0~ds0/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h --- juce-6.1.5~ds0/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp juce-7.0.0~ds0/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp --- juce-6.1.5~ds0/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h juce-7.0.0~ds0/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h --- juce-6.1.5~ds0/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/zip/juce_ZipFile.cpp juce-7.0.0~ds0/modules/juce_core/zip/juce_ZipFile.cpp --- juce-6.1.5~ds0/modules/juce_core/zip/juce_ZipFile.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/zip/juce_ZipFile.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_core/zip/juce_ZipFile.h juce-7.0.0~ds0/modules/juce_core/zip/juce_ZipFile.h --- juce-6.1.5~ds0/modules/juce_core/zip/juce_ZipFile.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_core/zip/juce_ZipFile.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/encryption/juce_BlowFish.cpp juce-7.0.0~ds0/modules/juce_cryptography/encryption/juce_BlowFish.cpp --- juce-6.1.5~ds0/modules/juce_cryptography/encryption/juce_BlowFish.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/encryption/juce_BlowFish.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/encryption/juce_BlowFish.h juce-7.0.0~ds0/modules/juce_cryptography/encryption/juce_BlowFish.h --- juce-6.1.5~ds0/modules/juce_cryptography/encryption/juce_BlowFish.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/encryption/juce_BlowFish.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/encryption/juce_Primes.cpp juce-7.0.0~ds0/modules/juce_cryptography/encryption/juce_Primes.cpp --- juce-6.1.5~ds0/modules/juce_cryptography/encryption/juce_Primes.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/encryption/juce_Primes.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/encryption/juce_Primes.h juce-7.0.0~ds0/modules/juce_cryptography/encryption/juce_Primes.h --- juce-6.1.5~ds0/modules/juce_cryptography/encryption/juce_Primes.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/encryption/juce_Primes.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/encryption/juce_RSAKey.cpp juce-7.0.0~ds0/modules/juce_cryptography/encryption/juce_RSAKey.cpp --- juce-6.1.5~ds0/modules/juce_cryptography/encryption/juce_RSAKey.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/encryption/juce_RSAKey.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -44,10 +44,6 @@ } } -RSAKey::~RSAKey() -{ -} - bool RSAKey::operator== (const RSAKey& other) const noexcept { return part1 == other.part1 && part2 == other.part2; diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/encryption/juce_RSAKey.h juce-7.0.0~ds0/modules/juce_cryptography/encryption/juce_RSAKey.h --- juce-6.1.5~ds0/modules/juce_cryptography/encryption/juce_RSAKey.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/encryption/juce_RSAKey.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -107,9 +107,6 @@ */ explicit RSAKey (const String& stringRepresentation); - /** Destructor. */ - ~RSAKey(); - bool operator== (const RSAKey& other) const noexcept; bool operator!= (const RSAKey& other) const noexcept; diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/hashing/juce_MD5.cpp juce-7.0.0~ds0/modules/juce_cryptography/hashing/juce_MD5.cpp --- juce-6.1.5~ds0/modules/juce_cryptography/hashing/juce_MD5.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/hashing/juce_MD5.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/hashing/juce_MD5.h juce-7.0.0~ds0/modules/juce_cryptography/hashing/juce_MD5.h --- juce-6.1.5~ds0/modules/juce_cryptography/hashing/juce_MD5.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/hashing/juce_MD5.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/hashing/juce_SHA256.cpp juce-7.0.0~ds0/modules/juce_cryptography/hashing/juce_SHA256.cpp --- juce-6.1.5~ds0/modules/juce_cryptography/hashing/juce_SHA256.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/hashing/juce_SHA256.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/hashing/juce_SHA256.h juce-7.0.0~ds0/modules/juce_cryptography/hashing/juce_SHA256.h --- juce-6.1.5~ds0/modules/juce_cryptography/hashing/juce_SHA256.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/hashing/juce_SHA256.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/hashing/juce_Whirlpool.cpp juce-7.0.0~ds0/modules/juce_cryptography/hashing/juce_Whirlpool.cpp --- juce-6.1.5~ds0/modules/juce_cryptography/hashing/juce_Whirlpool.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/hashing/juce_Whirlpool.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/hashing/juce_Whirlpool.h juce-7.0.0~ds0/modules/juce_cryptography/hashing/juce_Whirlpool.h --- juce-6.1.5~ds0/modules/juce_cryptography/hashing/juce_Whirlpool.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/hashing/juce_Whirlpool.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/juce_cryptography.cpp juce-7.0.0~ds0/modules/juce_cryptography/juce_cryptography.cpp --- juce-6.1.5~ds0/modules/juce_cryptography/juce_cryptography.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/juce_cryptography.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/juce_cryptography.h juce-7.0.0~ds0/modules/juce_cryptography/juce_cryptography.h --- juce-6.1.5~ds0/modules/juce_cryptography/juce_cryptography.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/juce_cryptography.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_cryptography vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE cryptography classes description: Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc. website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/modules/juce_cryptography/juce_cryptography.mm juce-7.0.0~ds0/modules/juce_cryptography/juce_cryptography.mm --- juce-6.1.5~ds0/modules/juce_cryptography/juce_cryptography.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_cryptography/juce_cryptography.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp juce-7.0.0~ds0/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp --- juce-6.1.5~ds0/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h juce-7.0.0~ds0/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h --- juce-6.1.5~ds0/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp juce-7.0.0~ds0/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp --- juce-6.1.5~ds0/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/app_properties/juce_PropertiesFile.h juce-7.0.0~ds0/modules/juce_data_structures/app_properties/juce_PropertiesFile.h --- juce-6.1.5~ds0/modules/juce_data_structures/app_properties/juce_PropertiesFile.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/app_properties/juce_PropertiesFile.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/juce_data_structures.cpp juce-7.0.0~ds0/modules/juce_data_structures/juce_data_structures.cpp --- juce-6.1.5~ds0/modules/juce_data_structures/juce_data_structures.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/juce_data_structures.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/juce_data_structures.h juce-7.0.0~ds0/modules/juce_data_structures/juce_data_structures.h --- juce-6.1.5~ds0/modules/juce_data_structures/juce_data_structures.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/juce_data_structures.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_data_structures vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE data model helper classes description: Classes for undo/redo management, and smart data structures. website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/juce_data_structures.mm juce-7.0.0~ds0/modules/juce_data_structures/juce_data_structures.mm --- juce-6.1.5~ds0/modules/juce_data_structures/juce_data_structures.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/juce_data_structures.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/undomanager/juce_UndoableAction.h juce-7.0.0~ds0/modules/juce_data_structures/undomanager/juce_UndoableAction.h --- juce-6.1.5~ds0/modules/juce_data_structures/undomanager/juce_UndoableAction.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/undomanager/juce_UndoableAction.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/undomanager/juce_UndoManager.cpp juce-7.0.0~ds0/modules/juce_data_structures/undomanager/juce_UndoManager.cpp --- juce-6.1.5~ds0/modules/juce_data_structures/undomanager/juce_UndoManager.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/undomanager/juce_UndoManager.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/undomanager/juce_UndoManager.h juce-7.0.0~ds0/modules/juce_data_structures/undomanager/juce_UndoManager.h --- juce-6.1.5~ds0/modules/juce_data_structures/undomanager/juce_UndoManager.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/undomanager/juce_UndoManager.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/values/juce_CachedValue.cpp juce-7.0.0~ds0/modules/juce_data_structures/values/juce_CachedValue.cpp --- juce-6.1.5~ds0/modules/juce_data_structures/values/juce_CachedValue.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/values/juce_CachedValue.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/values/juce_CachedValue.h juce-7.0.0~ds0/modules/juce_data_structures/values/juce_CachedValue.h --- juce-6.1.5~ds0/modules/juce_data_structures/values/juce_CachedValue.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/values/juce_CachedValue.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/values/juce_Value.cpp juce-7.0.0~ds0/modules/juce_data_structures/values/juce_Value.cpp --- juce-6.1.5~ds0/modules/juce_data_structures/values/juce_Value.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/values/juce_Value.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/values/juce_Value.h juce-7.0.0~ds0/modules/juce_data_structures/values/juce_Value.h --- juce-6.1.5~ds0/modules/juce_data_structures/values/juce_Value.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/values/juce_Value.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -114,7 +114,8 @@ */ void referTo (const Value& valueToReferTo); - /** Returns true if this value and the other one are references to the same value. + /** Returns true if this object and the other one use the same underlying + ValueSource object. */ bool refersToSameSourceAs (const Value& other) const; diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/values/juce_ValueTree.cpp juce-7.0.0~ds0/modules/juce_data_structures/values/juce_ValueTree.cpp --- juce-6.1.5~ds0/modules/juce_data_structures/values/juce_ValueTree.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/values/juce_ValueTree.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/values/juce_ValueTree.h juce-7.0.0~ds0/modules/juce_data_structures/values/juce_ValueTree.h --- juce-6.1.5~ds0/modules/juce_data_structures/values/juce_ValueTree.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/values/juce_ValueTree.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h juce-7.0.0~ds0/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h --- juce-6.1.5~ds0/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp juce-7.0.0~ds0/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp --- juce-6.1.5~ds0/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp juce-7.0.0~ds0/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp --- juce-6.1.5~ds0/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h juce-7.0.0~ds0/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h --- juce-6.1.5~ds0/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/containers/juce_AudioBlock.h juce-7.0.0~ds0/modules/juce_dsp/containers/juce_AudioBlock.h --- juce-6.1.5~ds0/modules/juce_dsp/containers/juce_AudioBlock.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/containers/juce_AudioBlock.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -341,12 +341,11 @@ size_t numElements = std::numeric_limits::max()) const { auto dstlen = static_cast (dst.getNumSamples()) / sizeFactor; - auto n = static_cast (jmin (numSamples - srcPos, dstlen - dstPos, numElements) * sizeFactor); + auto n = jmin (numSamples - srcPos, dstlen - dstPos, numElements) * sizeFactor; auto maxChannels = jmin (static_cast (dst.getNumChannels()), static_cast (numChannels)); for (size_t ch = 0; ch < maxChannels; ++ch) - FloatVectorOperations::copy (dst.getWritePointer (static_cast (ch), - static_cast (dstPos * sizeFactor)), + FloatVectorOperations::copy (dst.getWritePointer ((int) ch, (int) (dstPos * sizeFactor)), getDataPointer (ch) + (srcPos * sizeFactor), n); } @@ -524,7 +523,7 @@ if (numChannels == 0) return {}; - auto n = static_cast (numSamples * sizeFactor); + auto n = numSamples * sizeFactor; auto minmax = FloatVectorOperations::findMinAndMax (getDataPointer (0), n); for (size_t ch = 1; ch < numChannels; ++ch) @@ -601,7 +600,7 @@ //============================================================================== void JUCE_VECTOR_CALLTYPE clearInternal() const noexcept { - auto n = static_cast (numSamples * sizeFactor); + auto n = numSamples * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::clear (getDataPointer (ch), n); @@ -609,7 +608,7 @@ void JUCE_VECTOR_CALLTYPE fillInternal (NumericType value) const noexcept { - auto n = static_cast (numSamples * sizeFactor); + auto n = numSamples * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::fill (getDataPointer (ch), value, n); @@ -619,8 +618,7 @@ void copyFromInternal (const AudioBlock& src) const noexcept { auto maxChannels = jmin (src.numChannels, numChannels); - auto n = static_cast (jmin (src.numSamples * src.sizeFactor, - numSamples * sizeFactor)); + auto n = jmin (src.numSamples * src.sizeFactor, numSamples * sizeFactor); for (size_t ch = 0; ch < maxChannels; ++ch) FloatVectorOperations::copy (getDataPointer (ch), src.getDataPointer (ch), n); @@ -630,13 +628,12 @@ void copyFromInternal (const AudioBuffer& src, size_t srcPos, size_t dstPos, size_t numElements) const { auto srclen = static_cast (src.getNumSamples()) / sizeFactor; - auto n = static_cast (jmin (srclen - srcPos, numSamples - dstPos, numElements) * sizeFactor); + auto n = jmin (srclen - srcPos, numSamples - dstPos, numElements) * sizeFactor; auto maxChannels = jmin (static_cast (src.getNumChannels()), static_cast (numChannels)); for (size_t ch = 0; ch < maxChannels; ++ch) FloatVectorOperations::copy (getDataPointer (ch) + (dstPos * sizeFactor), - src.getReadPointer (static_cast (ch), - static_cast (srcPos * sizeFactor)), + src.getReadPointer ((int) ch, (int) (srcPos * sizeFactor)), n); } @@ -655,7 +652,7 @@ //============================================================================== void JUCE_VECTOR_CALLTYPE addInternal (NumericType value) const noexcept { - auto n = static_cast (numSamples * sizeFactor); + auto n = numSamples * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::add (getDataPointer (ch), value, n); @@ -665,7 +662,7 @@ void addInternal (AudioBlock src) const noexcept { jassert (numChannels == src.numChannels); - auto n = static_cast (jmin (numSamples, src.numSamples) * sizeFactor); + auto n = jmin (numSamples, src.numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::add (getDataPointer (ch), src.getDataPointer (ch), n); @@ -675,7 +672,7 @@ void JUCE_VECTOR_CALLTYPE replaceWithSumOfInternal (AudioBlock src, NumericType value) const noexcept { jassert (numChannels == src.numChannels); - auto n = static_cast (jmin (numSamples, src.numSamples) * sizeFactor); + auto n = jmin (numSamples, src.numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::add (getDataPointer (ch), src.getDataPointer (ch), value, n); @@ -685,7 +682,7 @@ void replaceWithSumOfInternal (AudioBlock src1, AudioBlock src2) const noexcept { jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels); - auto n = static_cast (jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor); + auto n = jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::add (getDataPointer (ch), src1.getDataPointer (ch), src2.getDataPointer (ch), n); @@ -701,7 +698,7 @@ void subtractInternal (AudioBlock src) const noexcept { jassert (numChannels == src.numChannels); - auto n = static_cast (jmin (numSamples, src.numSamples) * sizeFactor); + auto n = jmin (numSamples, src.numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::subtract (getDataPointer (ch), src.getDataPointer (ch), n); @@ -717,7 +714,7 @@ void replaceWithDifferenceOfInternal (AudioBlock src1, AudioBlock src2) const noexcept { jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels); - auto n = static_cast (jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor); + auto n = jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::subtract (getDataPointer (ch), src1.getDataPointer (ch), src2.getDataPointer (ch), n); @@ -726,7 +723,7 @@ //============================================================================== void JUCE_VECTOR_CALLTYPE multiplyByInternal (NumericType value) const noexcept { - auto n = static_cast (numSamples * sizeFactor); + auto n = numSamples * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::multiply (getDataPointer (ch), value, n); @@ -736,7 +733,7 @@ void multiplyByInternal (AudioBlock src) const noexcept { jassert (numChannels == src.numChannels); - auto n = static_cast (jmin (numSamples, src.numSamples) * sizeFactor); + auto n = jmin (numSamples, src.numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::multiply (getDataPointer (ch), src.getDataPointer (ch), n); @@ -746,7 +743,7 @@ void JUCE_VECTOR_CALLTYPE replaceWithProductOfInternal (AudioBlock src, NumericType value) const noexcept { jassert (numChannels == src.numChannels); - auto n = static_cast (jmin (numSamples, src.numSamples) * sizeFactor); + auto n = jmin (numSamples, src.numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::multiply (getDataPointer (ch), src.getDataPointer (ch), value, n); @@ -756,7 +753,7 @@ void replaceWithProductOfInternal (AudioBlock src1, AudioBlock src2) const noexcept { jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels); - auto n = static_cast (jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor); + auto n = jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::multiply (getDataPointer (ch), src1.getDataPointer (ch), src2.getDataPointer (ch), n); @@ -809,7 +806,7 @@ void JUCE_VECTOR_CALLTYPE addProductOfInternal (AudioBlock src, NumericType factor) const noexcept { jassert (numChannels == src.numChannels); - auto n = static_cast (jmin (numSamples, src.numSamples) * sizeFactor); + auto n = jmin (numSamples, src.numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::addWithMultiply (getDataPointer (ch), src.getDataPointer (ch), factor, n); @@ -819,7 +816,7 @@ void addProductOfInternal (AudioBlock src1, AudioBlock src2) const noexcept { jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels); - auto n = static_cast (jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor); + auto n = jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::addWithMultiply (getDataPointer (ch), src1.getDataPointer (ch), src2.getDataPointer (ch), n); @@ -835,7 +832,7 @@ void replaceWithNegativeOfInternal (AudioBlock src) const noexcept { jassert (numChannels == src.numChannels); - auto n = static_cast (jmin (numSamples, src.numSamples) * sizeFactor); + auto n = jmin (numSamples, src.numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::negate (getDataPointer (ch), src.getDataPointer (ch), n); @@ -845,7 +842,7 @@ void replaceWithAbsoluteValueOfInternal (AudioBlock src) const noexcept { jassert (numChannels == src.numChannels); - auto n = static_cast (jmin (numSamples, src.numSamples) * sizeFactor); + auto n = jmin (numSamples, src.numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::abs (getDataPointer (ch), src.getDataPointer (ch), n); @@ -856,7 +853,7 @@ void replaceWithMinOfInternal (AudioBlock src1, AudioBlock src2) const noexcept { jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels); - auto n = static_cast (jmin (src1.numSamples, src2.numSamples, numSamples) * sizeFactor); + auto n = jmin (src1.numSamples, src2.numSamples, numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::min (getDataPointer (ch), src1.getDataPointer (ch), src2.getDataPointer (ch), n); @@ -866,7 +863,7 @@ void replaceWithMaxOfInternal (AudioBlock src1, AudioBlock src2) const noexcept { jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels); - auto n = static_cast (jmin (src1.numSamples, src2.numSamples, numSamples) * sizeFactor); + auto n = jmin (src1.numSamples, src2.numSamples, numSamples) * sizeFactor; for (size_t ch = 0; ch < numChannels; ++ch) FloatVectorOperations::max (getDataPointer (ch), src1.getDataPointer (ch), src2.getDataPointer (ch), n); diff -Nru juce-6.1.5~ds0/modules/juce_dsp/containers/juce_AudioBlock_test.cpp juce-7.0.0~ds0/modules/juce_dsp/containers/juce_AudioBlock_test.cpp --- juce-6.1.5~ds0/modules/juce_dsp/containers/juce_AudioBlock_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/containers/juce_AudioBlock_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/containers/juce_FixedSizeFunction.h juce-7.0.0~ds0/modules/juce_dsp/containers/juce_FixedSizeFunction.h --- juce-6.1.5~ds0/modules/juce_dsp/containers/juce_FixedSizeFunction.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/containers/juce_FixedSizeFunction.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp juce-7.0.0~ds0/modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp --- juce-6.1.5~ds0/modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -204,6 +204,9 @@ throw std::runtime_error { "this was meant to happen" }; } + BadConstructor (const BadConstructor&) = default; + BadConstructor& operator= (const BadConstructor&) = delete; + ~BadConstructor() noexcept { counts.destructions += 1; } void operator()() const noexcept { counts.calls += 1; } diff -Nru juce-6.1.5~ds0/modules/juce_dsp/containers/juce_SIMDRegister.h juce-7.0.0~ds0/modules/juce_dsp/containers/juce_SIMDRegister.h --- juce-6.1.5~ds0/modules/juce_dsp/containers/juce_SIMDRegister.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/containers/juce_SIMDRegister.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -116,9 +116,6 @@ /** Constructs an object from a scalar type by broadcasting it to all elements. */ inline SIMDRegister (Type s) noexcept { *this = s; } - /** Destructor. */ - inline ~SIMDRegister() noexcept = default; - //============================================================================== /** Returns the number of elements in this vector. */ static constexpr size_t size() noexcept { return SIMDNumElements; } diff -Nru juce-6.1.5~ds0/modules/juce_dsp/containers/juce_SIMDRegister_Impl.h juce-7.0.0~ds0/modules/juce_dsp/containers/juce_SIMDRegister_Impl.h --- juce-6.1.5~ds0/modules/juce_dsp/containers/juce_SIMDRegister_Impl.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/containers/juce_SIMDRegister_Impl.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -33,9 +33,10 @@ template struct SIMDRegister::ElementAccess { - operator Type() const { return simd.get (idx); } - ElementAccess& operator= (Type scalar) noexcept { simd.set (idx, scalar); return *this; } - ElementAccess& operator= (ElementAccess& o) noexcept { return operator= ((Type) o); } + ElementAccess (const ElementAccess&) = default; + operator Type() const { return simd.get (idx); } + ElementAccess& operator= (Type scalar) noexcept { simd.set (idx, scalar); return *this; } + ElementAccess& operator= (const ElementAccess& o) noexcept { return operator= ((Type) o); } private: friend struct SIMDRegister; diff -Nru juce-6.1.5~ds0/modules/juce_dsp/containers/juce_SIMDRegister_test.cpp juce-7.0.0~ds0/modules/juce_dsp/containers/juce_SIMDRegister_test.cpp --- juce-6.1.5~ds0/modules/juce_dsp/containers/juce_SIMDRegister_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/containers/juce_SIMDRegister_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -39,7 +39,6 @@ { return static_cast (std::is_signed::value ? (random.nextFloat() * 16.0) - 8.0 : (random.nextFloat() * 8.0)); - } }; @@ -49,59 +48,32 @@ static type next (Random& random) { return static_cast (random.nextInt64()); - } }; - template struct RandomValue { static type next (Random& random) { return RandomPrimitive::next (random); } }; template - struct RandomValue> + struct RandomValue { - static std::complex next (Random& random) - { - return {RandomPrimitive::next (random), RandomPrimitive::next (random)}; - } + static type next (Random& random) { return RandomPrimitive::next (random); } }; - template - struct VecFiller - { - static void fill (type* dst, const int size, Random& random) - { - for (int i = 0; i < size; ++i) - dst[i] = RandomValue::next (random); - } - }; - - // We need to specialise for complex types: otherwise GCC 6 gives - // us an ICE internal compiler error after which the compiler seg faults. - template - struct VecFiller> + struct RandomValue> { - static void fill (std::complex* dst, const int size, Random& random) + static std::complex next (Random& random) { - for (int i = 0; i < size; ++i) - dst[i] = std::complex (RandomValue::next (random), RandomValue::next (random)); + return {RandomPrimitive::next (random), RandomPrimitive::next (random)}; } }; template - struct VecFiller> + static void fillVec (type* dst, Random& random) { - static SIMDRegister fill (Random& random) + std::generate_n (dst, SIMDRegister::SIMDNumElements, [&] { - constexpr int size = (int) SIMDRegister::SIMDNumElements; - #ifdef _MSC_VER - __declspec(align(sizeof (SIMDRegister))) type elements[size]; - #else - type elements[(size_t) size] __attribute__((aligned(sizeof (SIMDRegister)))); - #endif - - VecFiller::fill (elements, size, random); - return SIMDRegister::fromRawArray (elements); - } - }; + return RandomValue::next (random); + }); + } // Avoid visual studio warning template @@ -127,7 +99,7 @@ { return difference (a - b); } -} +} // namespace SIMDRegister_test_internal // These tests need to be strictly run on all platforms supported by JUCE as the // SIMD code is highly platform dependent. @@ -135,6 +107,8 @@ class SIMDRegisterUnitTests : public UnitTest { public: + template struct Tag {}; + SIMDRegisterUnitTests() : UnitTest ("SIMDRegister UnitTests", UnitTestCategories::dsp) {} @@ -290,7 +264,7 @@ struct InitializationTest { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { u.expect (allValuesEqualTo (SIMDRegister::expand (static_cast (23)), 23)); @@ -300,7 +274,7 @@ #else type elements[SIMDRegister::SIMDNumElements] __attribute__((aligned(sizeof (SIMDRegister)))); #endif - SIMDRegister_test_internal::VecFiller::fill (elements, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (elements, random); SIMDRegister a (SIMDRegister::fromRawArray (elements)); u.expect (vecEqualToArray (a, elements)); @@ -316,13 +290,13 @@ struct AccessTest { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { // set-up SIMDRegister a; type array [SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (array, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array, random); // Test non-const access operator for (size_t i = 0; i < SIMDRegister::SIMDNumElements; ++i) @@ -342,7 +316,7 @@ struct OperatorTests { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { for (int n = 0; n < 100; ++n) { @@ -355,9 +329,9 @@ type array_b [SIMDRegister::SIMDNumElements]; type array_c [SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_c, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (array_c, random); copy (a, array_a); copy (b, array_b); copy (c, array_c); @@ -370,9 +344,9 @@ u.expect (vecEqualToArray (a, array_a)); u.expect (vecEqualToArray (b, array_b)); - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_c, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (array_c, random); copy (a, array_a); copy (b, array_b); copy (c, array_c); @@ -386,9 +360,9 @@ u.expect (vecEqualToArray (b, array_b)); // set-up again - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_c, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (array_c, random); copy (a, array_a); copy (b, array_b); copy (c, array_c); // test out-of-place with both params being vectors @@ -418,7 +392,7 @@ struct BitOperatorTests { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { typedef typename SIMDRegister::vMaskType vMaskType; typedef typename SIMDRegister::MaskType MaskType; @@ -438,7 +412,7 @@ } a, b; vMaskType bitmask = vMaskType::expand (static_cast (1) << (sizeof (MaskType) - 1)); - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); copy (a.floatVersion, array_a); copy (b.floatVersion, array_a); @@ -466,9 +440,9 @@ type float_a [SIMDRegister::SIMDNumElements]; type float_c [SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (float_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (float_c, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (float_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (float_c, random); memcpy (array_a, float_a, sizeof (type) * SIMDRegister::SIMDNumElements); memcpy (array_c, float_c, sizeof (type) * SIMDRegister::SIMDNumElements); @@ -484,9 +458,9 @@ u.expect (vecEqualToArray (a, float_a)); u.expect (vecEqualToArray (b, array_b)); - SIMDRegister_test_internal::VecFiller::fill (float_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (float_c, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (float_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (float_c, random); memcpy (array_a, float_a, sizeof (type) * SIMDRegister::SIMDNumElements); memcpy (array_c, float_c, sizeof (type) * SIMDRegister::SIMDNumElements); copy (a, float_a); copy (b, array_b); copy (c, float_c); @@ -502,9 +476,9 @@ u.expect (vecEqualToArray (b, array_b)); // set-up again - SIMDRegister_test_internal::VecFiller::fill (float_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (float_c, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (float_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (float_c, random); memcpy (array_a, float_a, sizeof (type) * SIMDRegister::SIMDNumElements); memcpy (array_c, float_c, sizeof (type) * SIMDRegister::SIMDNumElements); copy (a, float_a); copy (b, array_b); copy (c, float_c); @@ -542,7 +516,7 @@ struct CheckComparisonOps { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { typedef typename SIMDRegister::vMaskType vMaskType; typedef typename SIMDRegister::MaskType MaskType; @@ -560,8 +534,8 @@ MaskType array_ge [SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); // do check for (size_t j = 0; j < SIMDRegister::SIMDNumElements; ++j) @@ -598,8 +572,8 @@ do { - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); } while (std::equal (array_a, array_a + SIMDRegister::SIMDNumElements, array_b)); copy (a, array_a); @@ -609,7 +583,7 @@ u.expect (! (a == b)); u.expect (! (b == a)); - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); copy (a, array_a); copy (b, array_a); @@ -635,7 +609,7 @@ struct CheckMultiplyAdd { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { // set-up type array_a [SIMDRegister::SIMDNumElements]; @@ -643,10 +617,10 @@ type array_c [SIMDRegister::SIMDNumElements]; type array_d [SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_c, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_d, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (array_c, random); + SIMDRegister_test_internal::fillVec (array_d, random); // check for (size_t i = 0; i < SIMDRegister::SIMDNumElements; ++i) @@ -667,7 +641,7 @@ struct CheckMinMax { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { for (int i = 0; i < 100; ++i) { @@ -717,17 +691,14 @@ struct CheckSum { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { type array [SIMDRegister::SIMDNumElements]; - type sumCheck = 0; - SIMDRegister_test_internal::VecFiller::fill (array, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array, random); - for (size_t j = 0; j < SIMDRegister::SIMDNumElements; ++j) - { - sumCheck += array[j]; - } + using AddedType = decltype (type{} + type{}); + const auto sumCheck = (type) std::accumulate (std::begin (array), std::end (array), AddedType{}); SIMDRegister a; copy (a, array); @@ -739,12 +710,12 @@ struct CheckAbs { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { type inArray[SIMDRegister::SIMDNumElements]; type outArray[SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (inArray, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (inArray, random); SIMDRegister a; copy (a, inArray); @@ -762,12 +733,12 @@ struct CheckTruncate { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { type inArray[SIMDRegister::SIMDNumElements]; type outArray[SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (inArray, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (inArray, random); SIMDRegister a; copy (a, inArray); @@ -783,7 +754,7 @@ struct CheckBoolEquals { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { bool is_signed = std::is_signed::value; type array [SIMDRegister::SIMDNumElements]; @@ -802,14 +773,14 @@ u.expect (a != value); u.expect (! (a == value)); - SIMDRegister_test_internal::VecFiller::fill (array, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array, random); copy (a, array); copy (b, array); u.expect (a == b); u.expect (! (a != b)); - SIMDRegister_test_internal::VecFiller::fill (array, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array, random); copy (b, array); u.expect (a != b); @@ -819,96 +790,96 @@ //============================================================================== template - void runTestFloatingPoint (const char* unitTestName) + void runTestFloatingPoint (const char* unitTestName, TheTest) { beginTest (unitTestName); Random random = getRandom(); - TheTest::template run (*this, random); - TheTest::template run (*this, random); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag{}); } //============================================================================== template - void runTestForAllTypes (const char* unitTestName) + void runTestForAllTypes (const char* unitTestName, TheTest) { beginTest (unitTestName); Random random = getRandom(); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run(*this, random); - TheTest::template run (*this, random); - TheTest::template run(*this, random); - TheTest::template run (*this, random); - TheTest::template run(*this, random); - TheTest::template run> (*this, random); - TheTest::template run> (*this, random); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag> {}); + TheTest::run (*this, random, Tag>{}); } template - void runTestNonComplex (const char* unitTestName) + void runTestNonComplex (const char* unitTestName, TheTest) { beginTest (unitTestName); Random random = getRandom(); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run(*this, random); - TheTest::template run (*this, random); - TheTest::template run(*this, random); - TheTest::template run (*this, random); - TheTest::template run(*this, random); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag{}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag{}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag{}); } template - void runTestSigned (const char* unitTestName) + void runTestSigned (const char* unitTestName, TheTest) { beginTest (unitTestName); Random random = getRandom(); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag{}); + TheTest::run (*this, random, Tag{}); + TheTest::run (*this, random, Tag{}); } void runTest() { - runTestForAllTypes ("InitializationTest"); + runTestForAllTypes ("InitializationTest", InitializationTest{}); - runTestForAllTypes ("AccessTest"); + runTestForAllTypes ("AccessTest", AccessTest{}); - runTestForAllTypes> ("AdditionOperators"); - runTestForAllTypes> ("SubtractionOperators"); - runTestForAllTypes> ("MultiplicationOperators"); + runTestForAllTypes ("AdditionOperators", OperatorTests{}); + runTestForAllTypes ("SubtractionOperators", OperatorTests{}); + runTestForAllTypes ("MultiplicationOperators", OperatorTests{}); - runTestForAllTypes> ("BitANDOperators"); - runTestForAllTypes> ("BitOROperators"); - runTestForAllTypes> ("BitXOROperators"); + runTestForAllTypes ("BitANDOperators", BitOperatorTests{}); + runTestForAllTypes ("BitOROperators", BitOperatorTests{}); + runTestForAllTypes ("BitXOROperators", BitOperatorTests{}); - runTestNonComplex ("CheckComparisons"); - runTestNonComplex ("CheckBoolEquals"); - runTestNonComplex ("CheckMinMax"); + runTestNonComplex ("CheckComparisons", CheckComparisonOps{}); + runTestNonComplex ("CheckBoolEquals", CheckBoolEquals{}); + runTestNonComplex ("CheckMinMax", CheckMinMax{}); - runTestForAllTypes ("CheckMultiplyAdd"); - runTestForAllTypes ("CheckSum"); + runTestForAllTypes ("CheckMultiplyAdd", CheckMultiplyAdd{}); + runTestForAllTypes ("CheckSum", CheckSum{}); - runTestSigned ("CheckAbs"); + runTestSigned ("CheckAbs", CheckAbs{}); - runTestFloatingPoint ("CheckTruncate"); + runTestFloatingPoint ("CheckTruncate", CheckTruncate{}); } }; diff -Nru juce-6.1.5~ds0/modules/juce_dsp/filter_design/juce_FilterDesign.cpp juce-7.0.0~ds0/modules/juce_dsp/filter_design/juce_FilterDesign.cpp --- juce-6.1.5~ds0/modules/juce_dsp/filter_design/juce_FilterDesign.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/filter_design/juce_FilterDesign.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/filter_design/juce_FilterDesign.h juce-7.0.0~ds0/modules/juce_dsp/filter_design/juce_FilterDesign.h --- juce-6.1.5~ds0/modules/juce_dsp/filter_design/juce_FilterDesign.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/filter_design/juce_FilterDesign.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_Convolution.cpp juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_Convolution.cpp --- juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_Convolution.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_Convolution.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_Convolution.h juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_Convolution.h --- juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_Convolution.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_Convolution.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_Convolution_test.cpp juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_Convolution_test.cpp --- juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_Convolution_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_Convolution_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_FFT.cpp juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_FFT.cpp --- juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_FFT.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_FFT.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_FFT.h juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_FFT.h --- juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_FFT.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_FFT.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_FFT_test.cpp juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_FFT_test.cpp --- juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_FFT_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_FFT_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_Windowing.cpp juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_Windowing.cpp --- juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_Windowing.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_Windowing.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_Windowing.h juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_Windowing.h --- juce-6.1.5~ds0/modules/juce_dsp/frequency/juce_Windowing.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/frequency/juce_Windowing.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/juce_dsp.cpp juce-7.0.0~ds0/modules/juce_dsp/juce_dsp.cpp --- juce-6.1.5~ds0/modules/juce_dsp/juce_dsp.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/juce_dsp.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/juce_dsp.h juce-7.0.0~ds0/modules/juce_dsp/juce_dsp.h --- juce-6.1.5~ds0/modules/juce_dsp/juce_dsp.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/juce_dsp.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_dsp vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE DSP classes description: Classes for audio buffer manipulation, digital audio processing, filtering, oversampling, fast math functions etc. website: http://www.juce.com/juce @@ -93,7 +93,7 @@ #ifndef JUCE_VECTOR_CALLTYPE // __vectorcall does not work on 64-bit due to internal compiler error in - // release mode in both VS2015 and VS2017. Re-enable when Microsoft fixes this + // release mode VS2017. Re-enable when Microsoft fixes this #if _MSC_VER && JUCE_USE_SIMD && ! (defined(_M_X64) || defined(__amd64__)) #define JUCE_VECTOR_CALLTYPE __vectorcall #else diff -Nru juce-6.1.5~ds0/modules/juce_dsp/juce_dsp.mm juce-7.0.0~ds0/modules/juce_dsp/juce_dsp.mm --- juce-6.1.5~ds0/modules/juce_dsp/juce_dsp.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/juce_dsp.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/maths/juce_FastMathApproximations.h juce-7.0.0~ds0/modules/juce_dsp/maths/juce_FastMathApproximations.h --- juce-6.1.5~ds0/modules/juce_dsp/maths/juce_FastMathApproximations.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/maths/juce_FastMathApproximations.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/maths/juce_LogRampedValue.h juce-7.0.0~ds0/modules/juce_dsp/maths/juce_LogRampedValue.h --- juce-6.1.5~ds0/modules/juce_dsp/maths/juce_LogRampedValue.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/maths/juce_LogRampedValue.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/maths/juce_LogRampedValue_test.cpp juce-7.0.0~ds0/modules/juce_dsp/maths/juce_LogRampedValue_test.cpp --- juce-6.1.5~ds0/modules/juce_dsp/maths/juce_LogRampedValue_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/maths/juce_LogRampedValue_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/maths/juce_LookupTable.cpp juce-7.0.0~ds0/modules/juce_dsp/maths/juce_LookupTable.cpp --- juce-6.1.5~ds0/modules/juce_dsp/maths/juce_LookupTable.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/maths/juce_LookupTable.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/maths/juce_LookupTable.h juce-7.0.0~ds0/modules/juce_dsp/maths/juce_LookupTable.h --- juce-6.1.5~ds0/modules/juce_dsp/maths/juce_LookupTable.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/maths/juce_LookupTable.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/maths/juce_Matrix.cpp juce-7.0.0~ds0/modules/juce_dsp/maths/juce_Matrix.cpp --- juce-6.1.5~ds0/modules/juce_dsp/maths/juce_Matrix.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/maths/juce_Matrix.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/maths/juce_Matrix.h juce-7.0.0~ds0/modules/juce_dsp/maths/juce_Matrix.h --- juce-6.1.5~ds0/modules/juce_dsp/maths/juce_Matrix.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/maths/juce_Matrix.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/maths/juce_Matrix_test.cpp juce-7.0.0~ds0/modules/juce_dsp/maths/juce_Matrix_test.cpp --- juce-6.1.5~ds0/modules/juce_dsp/maths/juce_Matrix_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/maths/juce_Matrix_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/maths/juce_Phase.h juce-7.0.0~ds0/modules/juce_dsp/maths/juce_Phase.h --- juce-6.1.5~ds0/modules/juce_dsp/maths/juce_Phase.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/maths/juce_Phase.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/maths/juce_Polynomial.h juce-7.0.0~ds0/modules/juce_dsp/maths/juce_Polynomial.h --- juce-6.1.5~ds0/modules/juce_dsp/maths/juce_Polynomial.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/maths/juce_Polynomial.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/maths/juce_SpecialFunctions.cpp juce-7.0.0~ds0/modules/juce_dsp/maths/juce_SpecialFunctions.cpp --- juce-6.1.5~ds0/modules/juce_dsp/maths/juce_SpecialFunctions.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/maths/juce_SpecialFunctions.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/maths/juce_SpecialFunctions.h juce-7.0.0~ds0/modules/juce_dsp/maths/juce_SpecialFunctions.h --- juce-6.1.5~ds0/modules/juce_dsp/maths/juce_SpecialFunctions.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/maths/juce_SpecialFunctions.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp juce-7.0.0~ds0/modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp --- juce-6.1.5~ds0/modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/native/juce_avx_SIMDNativeOps.h juce-7.0.0~ds0/modules/juce_dsp/native/juce_avx_SIMDNativeOps.h --- juce-6.1.5~ds0/modules/juce_dsp/native/juce_avx_SIMDNativeOps.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/native/juce_avx_SIMDNativeOps.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h juce-7.0.0~ds0/modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h --- juce-6.1.5~ds0/modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp juce-7.0.0~ds0/modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp --- juce-6.1.5~ds0/modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/native/juce_neon_SIMDNativeOps.h juce-7.0.0~ds0/modules/juce_dsp/native/juce_neon_SIMDNativeOps.h --- juce-6.1.5~ds0/modules/juce_dsp/native/juce_neon_SIMDNativeOps.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/native/juce_neon_SIMDNativeOps.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp juce-7.0.0~ds0/modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp --- juce-6.1.5~ds0/modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/native/juce_sse_SIMDNativeOps.h juce-7.0.0~ds0/modules/juce_dsp/native/juce_sse_SIMDNativeOps.h --- juce-6.1.5~ds0/modules/juce_dsp/native/juce_sse_SIMDNativeOps.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/native/juce_sse_SIMDNativeOps.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -106,11 +106,13 @@ static forcedinline float JUCE_VECTOR_CALLTYPE sum (__m128 a) noexcept { #if defined(__SSE4__) - __m128 retval = _mm_dp_ps (a, _mm_loadu_ps (kOne), 0xff); + const auto retval = _mm_dp_ps (a, _mm_loadu_ps (kOne), 0xff); #elif defined(__SSE3__) - __m128 retval = _mm_hadd_ps (_mm_hadd_ps (a, a), a); + const auto shuffled = _mm_movehdup_ps (a); + const auto sums = _mm_add_ps (a, shuffled); + const auto retval = _mm_add_ss (sums, _mm_movehl_ps (shuffled, sums)); #else - __m128 retval = _mm_add_ps (_mm_shuffle_ps (a, a, 0x4e), a); + auto retval = _mm_add_ps (_mm_shuffle_ps (a, a, 0x4e), a); retval = _mm_add_ps (retval, _mm_shuffle_ps (retval, retval, 0xb1)); #endif return _mm_cvtss_f32 (retval); diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_BallisticsFilter.cpp juce-7.0.0~ds0/modules/juce_dsp/processors/juce_BallisticsFilter.cpp --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_BallisticsFilter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_BallisticsFilter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_BallisticsFilter.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_BallisticsFilter.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_BallisticsFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_BallisticsFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_DelayLine.cpp juce-7.0.0~ds0/modules/juce_dsp/processors/juce_DelayLine.cpp --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_DelayLine.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_DelayLine.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_DelayLine.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_DelayLine.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_DelayLine.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_DelayLine.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_DryWetMixer.cpp juce-7.0.0~ds0/modules/juce_dsp/processors/juce_DryWetMixer.cpp --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_DryWetMixer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_DryWetMixer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_DryWetMixer.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_DryWetMixer.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_DryWetMixer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_DryWetMixer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_FIRFilter.cpp juce-7.0.0~ds0/modules/juce_dsp/processors/juce_FIRFilter.cpp --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_FIRFilter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_FIRFilter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_FIRFilter.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_FIRFilter.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_FIRFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_FIRFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_FIRFilter_test.cpp juce-7.0.0~ds0/modules/juce_dsp/processors/juce_FIRFilter_test.cpp --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_FIRFilter_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_FIRFilter_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp juce-7.0.0~ds0/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_IIRFilter.cpp juce-7.0.0~ds0/modules/juce_dsp/processors/juce_IIRFilter.cpp --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_IIRFilter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_IIRFilter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_IIRFilter.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_IIRFilter.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_IIRFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_IIRFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_IIRFilter_Impl.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_IIRFilter_Impl.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_IIRFilter_Impl.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_IIRFilter_Impl.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp juce-7.0.0~ds0/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_Oversampling.cpp juce-7.0.0~ds0/modules/juce_dsp/processors/juce_Oversampling.cpp --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_Oversampling.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_Oversampling.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_Oversampling.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_Oversampling.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_Oversampling.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_Oversampling.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_Panner.cpp juce-7.0.0~ds0/modules/juce_dsp/processors/juce_Panner.cpp --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_Panner.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_Panner.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_Panner.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_Panner.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_Panner.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_Panner.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_ProcessContext.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_ProcessContext.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_ProcessContext.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_ProcessContext.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -146,7 +146,7 @@ using AudioBlockType = AudioBlock; using ConstAudioBlockType = AudioBlock; - /** Creates a ProcessContextReplacing that uses the given input and output blocks. + /** Creates a ProcessContextNonReplacing that uses the given input and output blocks. Note that the caller must not delete these blocks while they are still in use by this object! */ ProcessContextNonReplacing (const ConstAudioBlockType& input, AudioBlockType& output) noexcept diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_ProcessorChain.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_ProcessorChain.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_ProcessorChain.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_ProcessorChain.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_ProcessorChain_test.cpp juce-7.0.0~ds0/modules/juce_dsp/processors/juce_ProcessorChain_test.cpp --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_ProcessorChain_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_ProcessorChain_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_ProcessorDuplicator.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_ProcessorDuplicator.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_ProcessorDuplicator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_ProcessorDuplicator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_ProcessorWrapper.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_ProcessorWrapper.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_ProcessorWrapper.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_ProcessorWrapper.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_StateVariableFilter.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_StateVariableFilter.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_StateVariableFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_StateVariableFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp juce-7.0.0~ds0/modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/processors/juce_StateVariableTPTFilter.h juce-7.0.0~ds0/modules/juce_dsp/processors/juce_StateVariableTPTFilter.h --- juce-6.1.5~ds0/modules/juce_dsp/processors/juce_StateVariableTPTFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/processors/juce_StateVariableTPTFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Bias.h juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Bias.h --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Bias.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Bias.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Chorus.cpp juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Chorus.cpp --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Chorus.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Chorus.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Chorus.h juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Chorus.h --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Chorus.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Chorus.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Compressor.cpp juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Compressor.cpp --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Compressor.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Compressor.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Compressor.h juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Compressor.h --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Compressor.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Compressor.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Gain.h juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Gain.h --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Gain.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Gain.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_LadderFilter.cpp juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_LadderFilter.cpp --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_LadderFilter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_LadderFilter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_LadderFilter.h juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_LadderFilter.h --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_LadderFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_LadderFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Limiter.cpp juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Limiter.cpp --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Limiter.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Limiter.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Limiter.h juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Limiter.h --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Limiter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Limiter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_NoiseGate.cpp juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_NoiseGate.cpp --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_NoiseGate.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_NoiseGate.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_NoiseGate.h juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_NoiseGate.h --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_NoiseGate.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_NoiseGate.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Oscillator.h juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Oscillator.h --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Oscillator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Oscillator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Phaser.cpp juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Phaser.cpp --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Phaser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Phaser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Phaser.h juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Phaser.h --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Phaser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Phaser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Reverb.h juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Reverb.h --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_Reverb.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_Reverb.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_WaveShaper.h juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_WaveShaper.h --- juce-6.1.5~ds0/modules/juce_dsp/widgets/juce_WaveShaper.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_dsp/widgets/juce_WaveShaper.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -71,7 +71,7 @@ }; //============================================================================== -#if JUCE_CXX17_IS_AVAILABLE +#if JUCE_CXX17_IS_AVAILABLE && ! ((JUCE_MAC || JUCE_IOS) && JUCE_CLANG && __clang_major__ < 10) template static WaveShaper, Functor> CreateWaveShaper (Functor functionToUse) { return {functionToUse}; } #else diff -Nru juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp --- juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_ActionBroadcaster.h juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_ActionBroadcaster.h --- juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_ActionBroadcaster.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_ActionBroadcaster.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_ActionListener.h juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_ActionListener.h --- juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_ActionListener.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_ActionListener.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp --- juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_AsyncUpdater.h juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_AsyncUpdater.h --- juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_AsyncUpdater.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_AsyncUpdater.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp --- juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h --- juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -86,6 +86,7 @@ { public: ChangeBroadcasterCallback(); + ~ChangeBroadcasterCallback() override { cancelPendingUpdate(); } void handleAsyncUpdate() override; ChangeBroadcaster* owner; diff -Nru juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_ChangeListener.h juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_ChangeListener.h --- juce-6.1.5~ds0/modules/juce_events/broadcasters/juce_ChangeListener.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/broadcasters/juce_ChangeListener.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp juce-7.0.0~ds0/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp --- juce-6.1.5~ds0/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -51,6 +51,8 @@ pingReceived(); } + void startPinging() { startThread (4); } + void pingReceived() noexcept { countdown = timeoutMs / 1000 + 1; } void triggerConnectionLostMessage() { triggerAsyncUpdate(); } @@ -59,6 +61,8 @@ int timeoutMs; + using AsyncUpdater::cancelPendingUpdate; + private: Atomic countdown; @@ -90,15 +94,17 @@ ChildProcessPingThread (timeout), owner (m) { - if (createPipe (pipeName, timeoutMs)) - startThread (4); + createPipe (pipeName, timeoutMs); } ~Connection() override { + cancelPendingUpdate(); stopThread (10000); } + using ChildProcessPingThread::startPinging; + private: void connectionMade() override {} void connectionLost() override { owner.handleConnectionLost(); } @@ -166,6 +172,7 @@ if (connection->isConnected()) { + connection->startPinging(); sendMessageToWorker ({ startMessage, specialMessageSize }); return true; } @@ -198,14 +205,17 @@ owner (p) { connectToPipe (pipeName, timeoutMs); - startThread (4); } ~Connection() override { + cancelPendingUpdate(); stopThread (10000); + disconnect(); } + using ChildProcessPingThread::startPinging; + private: ChildProcessWorker& owner; @@ -274,7 +284,9 @@ { connection.reset (new Connection (*this, pipeName, timeoutMs <= 0 ? defaultTimeoutMs : timeoutMs)); - if (! connection->isConnected()) + if (connection->isConnected()) + connection->startPinging(); + else connection.reset(); } } diff -Nru juce-6.1.5~ds0/modules/juce_events/interprocess/juce_ConnectedChildProcess.h juce-7.0.0~ds0/modules/juce_events/interprocess/juce_ConnectedChildProcess.h --- juce-6.1.5~ds0/modules/juce_events/interprocess/juce_ConnectedChildProcess.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/interprocess/juce_ConnectedChildProcess.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/interprocess/juce_InterprocessConnection.cpp juce-7.0.0~ds0/modules/juce_events/interprocess/juce_InterprocessConnection.cpp --- juce-6.1.5~ds0/modules/juce_events/interprocess/juce_InterprocessConnection.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/interprocess/juce_InterprocessConnection.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/interprocess/juce_InterprocessConnection.h juce-7.0.0~ds0/modules/juce_events/interprocess/juce_InterprocessConnection.h --- juce-6.1.5~ds0/modules/juce_events/interprocess/juce_InterprocessConnection.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/interprocess/juce_InterprocessConnection.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp juce-7.0.0~ds0/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp --- juce-6.1.5~ds0/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h juce-7.0.0~ds0/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h --- juce-6.1.5~ds0/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp juce-7.0.0~ds0/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp --- juce-6.1.5~ds0/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h juce-7.0.0~ds0/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h --- juce-6.1.5~ds0/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/juce_events.cpp juce-7.0.0~ds0/modules/juce_events/juce_events.cpp --- juce-6.1.5~ds0/modules/juce_events/juce_events.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/juce_events.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -87,6 +87,7 @@ #endif #elif JUCE_LINUX || JUCE_BSD + #include "native/juce_linux_EventLoopInternal.h" #include "native/juce_linux_Messaging.cpp" #elif JUCE_ANDROID diff -Nru juce-6.1.5~ds0/modules/juce_events/juce_events.h juce-7.0.0~ds0/modules/juce_events/juce_events.h --- juce-6.1.5~ds0/modules/juce_events/juce_events.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/juce_events.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -32,7 +32,7 @@ ID: juce_events vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE message and event handling classes description: Classes for running an application's main event loop and sending/receiving messages, timers, etc. website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/modules/juce_events/juce_events.mm juce-7.0.0~ds0/modules/juce_events/juce_events.mm --- juce-6.1.5~ds0/modules/juce_events/juce_events.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/juce_events.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_ApplicationBase.cpp juce-7.0.0~ds0/modules/juce_events/messages/juce_ApplicationBase.cpp --- juce-6.1.5~ds0/modules/juce_events/messages/juce_ApplicationBase.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_ApplicationBase.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_ApplicationBase.h juce-7.0.0~ds0/modules/juce_events/messages/juce_ApplicationBase.h --- juce-6.1.5~ds0/modules/juce_events/messages/juce_ApplicationBase.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_ApplicationBase.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_CallbackMessage.h juce-7.0.0~ds0/modules/juce_events/messages/juce_CallbackMessage.h --- juce-6.1.5~ds0/modules/juce_events/messages/juce_CallbackMessage.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_CallbackMessage.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_DeletedAtShutdown.cpp juce-7.0.0~ds0/modules/juce_events/messages/juce_DeletedAtShutdown.cpp --- juce-6.1.5~ds0/modules/juce_events/messages/juce_DeletedAtShutdown.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_DeletedAtShutdown.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_DeletedAtShutdown.h juce-7.0.0~ds0/modules/juce_events/messages/juce_DeletedAtShutdown.h --- juce-6.1.5~ds0/modules/juce_events/messages/juce_DeletedAtShutdown.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_DeletedAtShutdown.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_Initialisation.h juce-7.0.0~ds0/modules/juce_events/messages/juce_Initialisation.h --- juce-6.1.5~ds0/modules/juce_events/messages/juce_Initialisation.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_Initialisation.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_Message.h juce-7.0.0~ds0/modules/juce_events/messages/juce_Message.h --- juce-6.1.5~ds0/modules/juce_events/messages/juce_Message.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_Message.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_MessageListener.cpp juce-7.0.0~ds0/modules/juce_events/messages/juce_MessageListener.cpp --- juce-6.1.5~ds0/modules/juce_events/messages/juce_MessageListener.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_MessageListener.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_MessageListener.h juce-7.0.0~ds0/modules/juce_events/messages/juce_MessageListener.h --- juce-6.1.5~ds0/modules/juce_events/messages/juce_MessageListener.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_MessageListener.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_MessageManager.cpp juce-7.0.0~ds0/modules/juce_events/messages/juce_MessageManager.cpp --- juce-6.1.5~ds0/modules/juce_events/messages/juce_MessageManager.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_MessageManager.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -26,6 +26,8 @@ MessageManager::MessageManager() noexcept : messageThreadId (Thread::getCurrentThreadId()) { + JUCE_VERSION_ID + if (JUCEApplicationBase::isStandaloneApp()) Thread::setCurrentThreadName ("JUCE Message Thread"); } diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_MessageManager.h juce-7.0.0~ds0/modules/juce_events/messages/juce_MessageManager.h --- juce-6.1.5~ds0/modules/juce_events/messages/juce_MessageManager.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_MessageManager.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h juce-7.0.0~ds0/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h --- juce-6.1.5~ds0/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/messages/juce_NotificationType.h juce-7.0.0~ds0/modules/juce_events/messages/juce_NotificationType.h --- juce-6.1.5~ds0/modules/juce_events/messages/juce_NotificationType.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/messages/juce_NotificationType.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_android_Messaging.cpp juce-7.0.0~ds0/modules/juce_events/native/juce_android_Messaging.cpp --- juce-6.1.5~ds0/modules/juce_events/native/juce_android_Messaging.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_android_Messaging.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -288,6 +288,7 @@ //============================================================================== File juce_getExecutableFile(); +void juce_juceEventsAndroidStartApp(); void juce_juceEventsAndroidStartApp() { auto dllPath = juce_getExecutableFile().getFullPathName(); diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_ios_MessageManager.mm juce-7.0.0~ds0/modules/juce_events/native/juce_ios_MessageManager.mm --- juce-6.1.5~ds0/modules/juce_events/native/juce_ios_MessageManager.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_ios_MessageManager.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_linux_EventLoop.h juce-7.0.0~ds0/modules/juce_events/native/juce_linux_EventLoop.h --- juce-6.1.5~ds0/modules/juce_events/native/juce_linux_EventLoop.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_linux_EventLoop.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_linux_EventLoopInternal.h juce-7.0.0~ds0/modules/juce_events/native/juce_linux_EventLoopInternal.h --- juce-6.1.5~ds0/modules/juce_events/native/juce_linux_EventLoopInternal.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_linux_EventLoopInternal.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,55 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. 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. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +struct LinuxEventLoopInternal +{ + /** + @internal + + Receives notifications when a fd callback is added or removed. + + This is useful for VST3 plugins that host other VST3 plugins. In this scenario, the 'inner' + plugin may want to register additional file descriptors on top of those registered by the + 'outer' plugin. In order for this to work, the outer plugin must in turn pass this request + on to the host, to indicate that the outer plugin wants to receive FD callbacks for both the + inner and outer plugin. + */ + struct Listener + { + virtual ~Listener() = default; + virtual void fdCallbacksChanged() = 0; + }; + + /** @internal */ + static void registerLinuxEventLoopListener (Listener&); + /** @internal */ + static void deregisterLinuxEventLoopListener (Listener&); + /** @internal */ + static void invokeEventLoopCallbackForFd (int); + /** @internal */ + static std::vector getRegisteredFds(); +}; + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_linux_Messaging.cpp juce-7.0.0~ds0/modules/juce_events/native/juce_linux_Messaging.cpp --- juce-6.1.5~ds0/modules/juce_events/native/juce_linux_Messaging.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_linux_Messaging.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -108,125 +108,168 @@ JUCE_IMPLEMENT_SINGLETON (InternalMessageQueue) //============================================================================== +/* + Stores callbacks associated with file descriptors (FD). + + The callback for a particular FD should be called whenever that file has data to read. + + For standalone apps, the main thread will call poll to wait for new data on any FD, and then + call the associated callbacks for any FDs that changed. + + For plugins, the host (generally) provides some kind of run loop mechanism instead. + - In VST2 plugins, the host should call effEditIdle at regular intervals, and plugins can + dispatch all pending events inside this callback. The host doesn't know about any of the + plugin's FDs, so it's possible there will be a bit of latency between an FD becoming ready, + and its associated callback being called. + - In VST3 plugins, it's possible to register each FD individually with the host. In this case, + the facilities in LinuxEventLoopInternal can be used to observe added/removed FD callbacks, + and the host can be notified whenever the set of FDs changes. The host will call onFDIsSet + whenever a particular FD has data ready. This call should be forwarded through to + InternalRunLoop::dispatchEvent. +*/ struct InternalRunLoop { public: - InternalRunLoop() - { - fdReadCallbacks.reserve (16); - } + InternalRunLoop() = default; - void registerFdCallback (int fd, std::function&& cb, short eventMask) + void registerFdCallback (int fd, std::function&& cb, short eventMask) { - const ScopedLock sl (lock); - - if (shouldDeferModifyingReadCallbacks) { - deferredReadCallbackModifications.emplace_back ([this, fd, cb, eventMask]() mutable - { - registerFdCallback (fd, std::move (cb), eventMask); - }); - return; + const ScopedLock sl (lock); + + callbacks.emplace (fd, std::make_shared> (std::move (cb))); + + const auto iter = getPollfd (fd); + + if (iter == pfds.end() || iter->fd != fd) + pfds.insert (iter, { fd, eventMask, 0 }); + else + jassertfalse; + + jassert (pfdsAreSorted()); } - fdReadCallbacks.push_back ({ fd, std::move (cb) }); - pfds.push_back ({ fd, eventMask, 0 }); + listeners.call ([] (auto& l) { l.fdCallbacksChanged(); }); } void unregisterFdCallback (int fd) { - const ScopedLock sl (lock); - - if (shouldDeferModifyingReadCallbacks) { - deferredReadCallbackModifications.emplace_back ([this, fd] { unregisterFdCallback (fd); }); - return; - } + const ScopedLock sl (lock); - { - auto removePredicate = [=] (const std::pair>& cb) { return cb.first == fd; }; + callbacks.erase (fd); - fdReadCallbacks.erase (std::remove_if (std::begin (fdReadCallbacks), std::end (fdReadCallbacks), removePredicate), - std::end (fdReadCallbacks)); - } + const auto iter = getPollfd (fd); - { - auto removePredicate = [=] (const pollfd& pfd) { return pfd.fd == fd; }; + if (iter != pfds.end() && iter->fd == fd) + pfds.erase (iter); + else + jassertfalse; - pfds.erase (std::remove_if (std::begin (pfds), std::end (pfds), removePredicate), - std::end (pfds)); + jassert (pfdsAreSorted()); } + + listeners.call ([] (auto& l) { l.fdCallbacksChanged(); }); } bool dispatchPendingEvents() { - const ScopedLock sl (lock); + callbackStorage.clear(); + getFunctionsToCallThisTime (callbackStorage); - if (poll (&pfds.front(), static_cast (pfds.size()), 0) == 0) - return false; + // CriticalSection should be available during the callback + for (auto& fn : callbackStorage) + (*fn)(); - bool eventWasSent = false; + return ! callbackStorage.empty(); + } - for (auto& pfd : pfds) + void dispatchEvent (int fd) const + { + const auto fn = [&] { - if (pfd.revents == 0) - continue; + const ScopedLock sl (lock); + const auto iter = callbacks.find (fd); + return iter != callbacks.end() ? iter->second : nullptr; + }(); + + // CriticalSection should be available during the callback + if (auto* callback = fn.get()) + (*callback)(); + } + + bool sleepUntilNextEvent (int timeoutMs) + { + const ScopedLock sl (lock); + return poll (pfds.data(), static_cast (pfds.size()), timeoutMs) != 0; + } + + std::vector getRegisteredFds() + { + const ScopedLock sl (lock); + std::vector result; + result.reserve (callbacks.size()); + std::transform (callbacks.begin(), + callbacks.end(), + std::back_inserter (result), + [] (const auto& pair) { return pair.first; }); + return result; + } - pfd.revents = 0; + void addListener (LinuxEventLoopInternal::Listener& listener) { listeners.add (&listener); } + void removeListener (LinuxEventLoopInternal::Listener& listener) { listeners.remove (&listener); } - auto fd = pfd.fd; + //============================================================================== + JUCE_DECLARE_SINGLETON (InternalRunLoop, false) + +private: + using SharedCallback = std::shared_ptr>; + + /* Appends any functions that need to be called to the passed-in vector. + + We take a copy of each shared function so that the functions can be called without + locking or racing in the event that the function attempts to register/deregister a + new FD callback. + */ + void getFunctionsToCallThisTime (std::vector& functions) + { + const ScopedLock sl (lock); - for (auto& fdAndCallback : fdReadCallbacks) + if (! sleepUntilNextEvent (0)) + return; + + for (auto& pfd : pfds) + { + if (std::exchange (pfd.revents, 0) != 0) { - if (fdAndCallback.first == fd) - { - { - ScopedValueSetter insideFdReadCallback (shouldDeferModifyingReadCallbacks, true); - fdAndCallback.second (fd); - } - - if (! deferredReadCallbackModifications.empty()) - { - for (auto& deferredRegisterEvent : deferredReadCallbackModifications) - deferredRegisterEvent(); - - deferredReadCallbackModifications.clear(); - - // elements may have been removed from the fdReadCallbacks/pfds array so we really need - // to call poll again - return true; - } + const auto iter = callbacks.find (pfd.fd); - eventWasSent = true; - } + if (iter != callbacks.end()) + functions.emplace_back (iter->second); } } - - return eventWasSent; } - void sleepUntilNextEvent (int timeoutMs) + std::vector::iterator getPollfd (int fd) { - poll (&pfds.front(), static_cast (pfds.size()), timeoutMs); + return std::lower_bound (pfds.begin(), pfds.end(), fd, [] (auto descriptor, auto toFind) + { + return descriptor.fd < toFind; + }); } - std::vector>> getFdReadCallbacks() + bool pfdsAreSorted() const { - const ScopedLock sl (lock); - return fdReadCallbacks; + return std::is_sorted (pfds.begin(), pfds.end(), [] (auto a, auto b) { return a.fd < b.fd; }); } - //============================================================================== - JUCE_DECLARE_SINGLETON (InternalRunLoop, false) - -private: CriticalSection lock; - std::vector>> fdReadCallbacks; + std::map callbacks; + std::vector callbackStorage; std::vector pfds; - bool shouldDeferModifyingReadCallbacks = false; - std::vector> deferredReadCallbackModifications; + ListenerList listeners; }; JUCE_IMPLEMENT_SINGLETON (InternalRunLoop) @@ -236,13 +279,13 @@ { static bool keyboardBreakOccurred = false; - void keyboardBreakSignalHandler (int sig) + static void keyboardBreakSignalHandler (int sig) { if (sig == SIGINT) keyboardBreakOccurred = true; } - void installKeyboardBreakHandler() + static void installKeyboardBreakHandler() { struct sigaction saction; sigset_t maskSet; @@ -313,7 +356,7 @@ void LinuxEventLoop::registerFdCallback (int fd, std::function readCallback, short eventMask) { if (auto* runLoop = InternalRunLoop::getInstanceWithoutCreating()) - runLoop->registerFdCallback (fd, std::move (readCallback), eventMask); + runLoop->registerFdCallback (fd, [cb = std::move (readCallback), fd] { cb (fd); }, eventMask); } void LinuxEventLoop::unregisterFdCallback (int fd) @@ -322,15 +365,31 @@ runLoop->unregisterFdCallback (fd); } -} // namespace juce +//============================================================================== +void LinuxEventLoopInternal::registerLinuxEventLoopListener (LinuxEventLoopInternal::Listener& listener) +{ + if (auto* runLoop = InternalRunLoop::getInstanceWithoutCreating()) + runLoop->addListener (listener); +} -JUCE_API std::vector>> getFdReadCallbacks() +void LinuxEventLoopInternal::deregisterLinuxEventLoopListener (LinuxEventLoopInternal::Listener& listener) { - using namespace juce; + if (auto* runLoop = InternalRunLoop::getInstanceWithoutCreating()) + runLoop->removeListener (listener); +} + +void LinuxEventLoopInternal::invokeEventLoopCallbackForFd (int fd) +{ + if (auto* runLoop = InternalRunLoop::getInstanceWithoutCreating()) + runLoop->dispatchEvent (fd); +} +std::vector LinuxEventLoopInternal::getRegisteredFds() +{ if (auto* runLoop = InternalRunLoop::getInstanceWithoutCreating()) - return runLoop->getFdReadCallbacks(); + return runLoop->getRegisteredFds(); - jassertfalse; return {}; } + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_mac_MessageManager.mm juce-7.0.0~ds0/modules/juce_events/native/juce_mac_MessageManager.mm --- juce-6.1.5~ds0/modules/juce_events/native/juce_mac_MessageManager.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_mac_MessageManager.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_osx_MessageQueue.h juce-7.0.0~ds0/modules/juce_events/native/juce_osx_MessageQueue.h --- juce-6.1.5~ds0/modules/juce_events/native/juce_osx_MessageQueue.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_osx_MessageQueue.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp juce-7.0.0~ds0/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp --- juce-6.1.5~ds0/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -28,12 +28,21 @@ class ScopedLowPowerModeDisabler::Pimpl { public: - Pimpl() = default; - ~Pimpl() { [[NSProcessInfo processInfo] endActivity: activity]; } + Pimpl() + { + if (@available (macOS 10.9, *)) + activity = [[NSProcessInfo processInfo] beginActivityWithOptions: NSActivityUserInitiatedAllowingIdleSystemSleep + reason: @"App must remain in high-power mode"]; + } + + ~Pimpl() + { + if (@available (macOS 10.9, *)) + [[NSProcessInfo processInfo] endActivity: activity]; + } private: - id activity { [[NSProcessInfo processInfo] beginActivityWithOptions: NSActivityUserInitiatedAllowingIdleSystemSleep - reason: @"App must remain in high-power mode"] }; + id activity; JUCE_DECLARE_NON_COPYABLE (Pimpl) JUCE_DECLARE_NON_MOVEABLE (Pimpl) diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h juce-7.0.0~ds0/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h --- juce-6.1.5~ds0/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_win32_HiddenMessageWindow.h juce-7.0.0~ds0/modules/juce_events/native/juce_win32_HiddenMessageWindow.h --- juce-6.1.5~ds0/modules/juce_events/native/juce_win32_HiddenMessageWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_win32_HiddenMessageWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_win32_Messaging.cpp juce-7.0.0~ds0/modules/juce_events/native/juce_win32_Messaging.cpp --- juce-6.1.5~ds0/modules/juce_events/native/juce_win32_Messaging.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_win32_Messaging.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_win32_WinRTWrapper.cpp juce-7.0.0~ds0/modules/juce_events/native/juce_win32_WinRTWrapper.cpp --- juce-6.1.5~ds0/modules/juce_events/native/juce_win32_WinRTWrapper.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_win32_WinRTWrapper.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/native/juce_win32_WinRTWrapper.h juce-7.0.0~ds0/modules/juce_events/native/juce_win32_WinRTWrapper.h --- juce-6.1.5~ds0/modules/juce_events/native/juce_win32_WinRTWrapper.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/native/juce_win32_WinRTWrapper.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/timers/juce_MultiTimer.cpp juce-7.0.0~ds0/modules/juce_events/timers/juce_MultiTimer.cpp --- juce-6.1.5~ds0/modules/juce_events/timers/juce_MultiTimer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/timers/juce_MultiTimer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/timers/juce_MultiTimer.h juce-7.0.0~ds0/modules/juce_events/timers/juce_MultiTimer.h --- juce-6.1.5~ds0/modules/juce_events/timers/juce_MultiTimer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/timers/juce_MultiTimer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_events/timers/juce_Timer.cpp juce-7.0.0~ds0/modules/juce_events/timers/juce_Timer.cpp --- juce-6.1.5~ds0/modules/juce_events/timers/juce_Timer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/timers/juce_Timer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -38,6 +38,7 @@ ~TimerThread() override { + cancelPendingUpdate(); signalThreadShouldExit(); callbackArrived.signal(); stopThread (4000); diff -Nru juce-6.1.5~ds0/modules/juce_events/timers/juce_Timer.h juce-7.0.0~ds0/modules/juce_events/timers/juce_Timer.h --- juce-6.1.5~ds0/modules/juce_events/timers/juce_Timer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_events/timers/juce_Timer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff -Nru juce-6.1.5~ds0/modules/juce_graphics/colour/juce_Colour.cpp juce-7.0.0~ds0/modules/juce_graphics/colour/juce_Colour.cpp --- juce-6.1.5~ds0/modules/juce_graphics/colour/juce_Colour.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/colour/juce_Colour.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/colour/juce_ColourGradient.cpp juce-7.0.0~ds0/modules/juce_graphics/colour/juce_ColourGradient.cpp --- juce-6.1.5~ds0/modules/juce_graphics/colour/juce_ColourGradient.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/colour/juce_ColourGradient.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/colour/juce_ColourGradient.h juce-7.0.0~ds0/modules/juce_graphics/colour/juce_ColourGradient.h --- juce-6.1.5~ds0/modules/juce_graphics/colour/juce_ColourGradient.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/colour/juce_ColourGradient.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/colour/juce_Colour.h juce-7.0.0~ds0/modules/juce_graphics/colour/juce_Colour.h --- juce-6.1.5~ds0/modules/juce_graphics/colour/juce_Colour.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/colour/juce_Colour.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -299,35 +299,35 @@ //============================================================================== /** Returns a copy of this colour with a different hue. */ - Colour withHue (float newHue) const noexcept; + JUCE_NODISCARD Colour withHue (float newHue) const noexcept; /** Returns a copy of this colour with a different saturation. */ - Colour withSaturation (float newSaturation) const noexcept; + JUCE_NODISCARD Colour withSaturation (float newSaturation) const noexcept; /** Returns a copy of this colour with a different saturation in the HSL colour space. */ - Colour withSaturationHSL (float newSaturation) const noexcept; + JUCE_NODISCARD Colour withSaturationHSL (float newSaturation) const noexcept; /** Returns a copy of this colour with a different brightness. @see brighter, darker, withMultipliedBrightness */ - Colour withBrightness (float newBrightness) const noexcept; + JUCE_NODISCARD Colour withBrightness (float newBrightness) const noexcept; /** Returns a copy of this colour with a different lightness. @see lighter, darker, withMultipliedLightness */ - Colour withLightness (float newLightness) const noexcept; + JUCE_NODISCARD Colour withLightness (float newLightness) const noexcept; /** Returns a copy of this colour with its hue rotated. The new colour's hue is ((this->getHue() + amountToRotate) % 1.0) @see brighter, darker, withMultipliedBrightness */ - Colour withRotatedHue (float amountToRotate) const noexcept; + JUCE_NODISCARD Colour withRotatedHue (float amountToRotate) const noexcept; /** Returns a copy of this colour with its saturation multiplied by the given value. The new colour's saturation is (this->getSaturation() * multiplier) (the result is clipped to legal limits). */ - Colour withMultipliedSaturation (float multiplier) const noexcept; + JUCE_NODISCARD Colour withMultipliedSaturation (float multiplier) const noexcept; /** Returns a copy of this colour with its saturation multiplied by the given value. The new colour's saturation is (this->getSaturation() * multiplier) @@ -335,19 +335,19 @@ This will be in the HSL colour space. */ - Colour withMultipliedSaturationHSL (float multiplier) const noexcept; + JUCE_NODISCARD Colour withMultipliedSaturationHSL (float multiplier) const noexcept; /** Returns a copy of this colour with its brightness multiplied by the given value. The new colour's brightness is (this->getBrightness() * multiplier) (the result is clipped to legal limits). */ - Colour withMultipliedBrightness (float amount) const noexcept; + JUCE_NODISCARD Colour withMultipliedBrightness (float amount) const noexcept; /** Returns a copy of this colour with its lightness multiplied by the given value. The new colour's lightness is (this->lightness() * multiplier) (the result is clipped to legal limits). */ - Colour withMultipliedLightness (float amount) const noexcept; + JUCE_NODISCARD Colour withMultipliedLightness (float amount) const noexcept; //============================================================================== /** Returns a brighter version of this colour. @@ -355,14 +355,14 @@ where 0 is unchanged, and higher values make it brighter @see withMultipliedBrightness */ - Colour brighter (float amountBrighter = 0.4f) const noexcept; + JUCE_NODISCARD Colour brighter (float amountBrighter = 0.4f) const noexcept; /** Returns a darker version of this colour. @param amountDarker how much darker to make it - a value greater than or equal to 0, where 0 is unchanged, and higher values make it darker @see withMultipliedBrightness */ - Colour darker (float amountDarker = 0.4f) const noexcept; + JUCE_NODISCARD Colour darker (float amountDarker = 0.4f) const noexcept; //============================================================================== /** Returns a colour that will be clearly visible against this colour. @@ -372,7 +372,7 @@ that's just a little bit lighter; Colours::black.contrasting (1.0f) will return white; Colours::white.contrasting (1.0f) will return black, etc. */ - Colour contrasting (float amount = 1.0f) const noexcept; + JUCE_NODISCARD Colour contrasting (float amount = 1.0f) const noexcept; /** Returns a colour that is as close as possible to a target colour whilst still being in contrast to this one. @@ -381,20 +381,20 @@ nudged up or down so that it differs from the luminosity of this colour by at least the amount specified by minLuminosityDiff. */ - Colour contrasting (Colour targetColour, float minLuminosityDiff) const noexcept; + JUCE_NODISCARD Colour contrasting (Colour targetColour, float minLuminosityDiff) const noexcept; /** Returns a colour that contrasts against two colours. Looks for a colour that contrasts with both of the colours passed-in. Handy for things like choosing a highlight colour in text editors, etc. */ - static Colour contrasting (Colour colour1, - Colour colour2) noexcept; + JUCE_NODISCARD static Colour contrasting (Colour colour1, + Colour colour2) noexcept; //============================================================================== /** Returns an opaque shade of grey. @param brightness the level of grey to return - 0 is black, 1.0 is white */ - static Colour greyLevel (float brightness) noexcept; + JUCE_NODISCARD static Colour greyLevel (float brightness) noexcept; //============================================================================== /** Returns a stringified version of this colour. @@ -403,7 +403,7 @@ String toString() const; /** Reads the colour from a string that was created with toString(). */ - static Colour fromString (StringRef encodedColourString); + JUCE_NODISCARD static Colour fromString (StringRef encodedColourString); /** Returns the colour as a hex string in the form RRGGBB or AARRGGBB. */ String toDisplayString (bool includeAlphaValue) const; diff -Nru juce-6.1.5~ds0/modules/juce_graphics/colour/juce_Colours.cpp juce-7.0.0~ds0/modules/juce_graphics/colour/juce_Colours.cpp --- juce-6.1.5~ds0/modules/juce_graphics/colour/juce_Colours.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/colour/juce_Colours.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/colour/juce_Colours.h juce-7.0.0~ds0/modules/juce_graphics/colour/juce_Colours.h --- juce-6.1.5~ds0/modules/juce_graphics/colour/juce_Colours.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/colour/juce_Colours.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/colour/juce_FillType.cpp juce-7.0.0~ds0/modules/juce_graphics/colour/juce_FillType.cpp --- juce-6.1.5~ds0/modules/juce_graphics/colour/juce_FillType.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/colour/juce_FillType.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/colour/juce_FillType.h juce-7.0.0~ds0/modules/juce_graphics/colour/juce_FillType.h --- juce-6.1.5~ds0/modules/juce_graphics/colour/juce_FillType.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/colour/juce_FillType.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/colour/juce_PixelFormats.h juce-7.0.0~ds0/modules/juce_graphics/colour/juce_PixelFormats.h --- juce-6.1.5~ds0/modules/juce_graphics/colour/juce_PixelFormats.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/colour/juce_PixelFormats.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_GraphicsContext.cpp juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_GraphicsContext.cpp --- juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_GraphicsContext.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_GraphicsContext.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,8 +26,108 @@ namespace juce { +struct GraphicsFontHelpers +{ + static auto compareFont (const Font& a, const Font& b) { return Font::compare (a, b); } +}; + +static auto operator< (const Font& a, const Font& b) +{ + return GraphicsFontHelpers::compareFont (a, b); +} + +template +static auto operator< (const Rectangle& a, const Rectangle& b) +{ + const auto tie = [] (auto& t) { return std::make_tuple (t.getX(), t.getY(), t.getWidth(), t.getHeight()); }; + return tie (a) < tie (b); +} + +static auto operator< (const Justification& a, const Justification& b) +{ + return a.getFlags() < b.getFlags(); +} + +//============================================================================== namespace { + struct ConfiguredArrangement + { + void draw (const Graphics& g) const { arrangement.draw (g, transform); } + + GlyphArrangement arrangement; + AffineTransform transform; + }; + + template + class GlyphArrangementCache final : public DeletedAtShutdown + { + public: + GlyphArrangementCache() = default; + + ~GlyphArrangementCache() override + { + clearSingletonInstance(); + } + + template + void draw (const Graphics& g, ArrangementArgs&& args, ConfigureArrangement&& configureArrangement) + { + const ScopedTryLock stl (lock); + + if (! stl.isLocked()) + { + configureArrangement (args).draw (g); + return; + } + + const auto cached = [&] + { + const auto iter = cache.find (args); + + if (iter != cache.end()) + { + if (iter->second.cachePosition != cacheOrder.begin()) + cacheOrder.splice (cacheOrder.begin(), cacheOrder, iter->second.cachePosition); + + return iter; + } + + auto result = cache.emplace (std::move (args), CachedGlyphArrangement { configureArrangement (args), {} }).first; + cacheOrder.push_front (result); + return result; + }(); + + cached->second.cachePosition = cacheOrder.begin(); + cached->second.configured.draw (g); + + while (cache.size() > cacheSize) + { + cache.erase (cacheOrder.back()); + cacheOrder.pop_back(); + } + } + + JUCE_DECLARE_SINGLETON (GlyphArrangementCache, false) + + private: + struct CachedGlyphArrangement + { + using CachePtr = typename std::map::const_iterator; + ConfiguredArrangement configured; + typename std::list::const_iterator cachePosition; + }; + + static constexpr size_t cacheSize = 128; + std::map cache; + std::list cacheOrder; + CriticalSection lock; + }; + + template + juce::SingletonHolder, juce::CriticalSection, false> GlyphArrangementCache::singletonHolder; + + //============================================================================== template Rectangle coordsToRectangle (Type x, Type y, Type w, Type h) noexcept { @@ -45,10 +145,6 @@ } //============================================================================== -LowLevelGraphicsContext::LowLevelGraphicsContext() {} -LowLevelGraphicsContext::~LowLevelGraphicsContext() {} - -//============================================================================== Graphics::Graphics (const Image& imageToDrawOnto) : contextHolder (imageToDrawOnto.createLowLevelContext()), context (*contextHolder) @@ -61,10 +157,6 @@ { } -Graphics::~Graphics() -{ -} - //============================================================================== void Graphics::resetToDefaultState() { @@ -239,67 +331,120 @@ void Graphics::drawSingleLineText (const String& text, const int startX, const int baselineY, Justification justification) const { - if (text.isNotEmpty()) - { - // Don't pass any vertical placement flags to this method - they'll be ignored. - jassert (justification.getOnlyVerticalFlags() == 0); + if (text.isEmpty()) + return; + + // Don't pass any vertical placement flags to this method - they'll be ignored. + jassert (justification.getOnlyVerticalFlags() == 0); - auto flags = justification.getOnlyHorizontalFlags(); + auto flags = justification.getOnlyHorizontalFlags(); - if (flags == Justification::right && startX < context.getClipBounds().getX()) - return; + if (flags == Justification::right && startX < context.getClipBounds().getX()) + return; - if (flags == Justification::left && startX > context.getClipBounds().getRight()) - return; + if (flags == Justification::left && startX > context.getClipBounds().getRight()) + return; + + struct ArrangementArgs + { + auto tie() const noexcept { return std::tie (font, text, startX, baselineY); } + bool operator< (const ArrangementArgs& other) const { return tie() < other.tie(); } - GlyphArrangement arr; - arr.addLineOfText (context.getFont(), text, (float) startX, (float) baselineY); + const Font font; + const String text; + const int startX, baselineY, flags; + }; - if (flags != Justification::left) + auto configureArrangement = [] (const ArrangementArgs& args) + { + AffineTransform transform; + GlyphArrangement arrangement; + arrangement.addLineOfText (args.font, args.text, (float) args.startX, (float) args.baselineY); + + if (args.flags != Justification::left) { - auto w = arr.getBoundingBox (0, -1, true).getWidth(); + auto w = arrangement.getBoundingBox (0, -1, true).getWidth(); - if ((flags & (Justification::horizontallyCentred | Justification::horizontallyJustified)) != 0) + if ((args.flags & (Justification::horizontallyCentred | Justification::horizontallyJustified)) != 0) w /= 2.0f; - arr.draw (*this, AffineTransform::translation (-w, 0)); - } - else - { - arr.draw (*this); + transform = AffineTransform::translation (-w, 0); } - } + + return ConfiguredArrangement { std::move (arrangement), std::move (transform) }; + }; + + GlyphArrangementCache::getInstance()->draw (*this, + { context.getFont(), text, startX, baselineY, flags }, + std::move (configureArrangement)); } void Graphics::drawMultiLineText (const String& text, const int startX, const int baselineY, const int maximumLineWidth, Justification justification, const float leading) const { - if (text.isNotEmpty() - && startX < context.getClipBounds().getRight()) + if (text.isEmpty() || startX >= context.getClipBounds().getRight()) + return; + + struct ArrangementArgs { - GlyphArrangement arr; - arr.addJustifiedText (context.getFont(), text, - (float) startX, (float) baselineY, (float) maximumLineWidth, - justification, leading); - arr.draw (*this); - } + auto tie() const noexcept { return std::tie (font, text, startX, baselineY, maximumLineWidth, justification, leading); } + bool operator< (const ArrangementArgs& other) const { return tie() < other.tie(); } + + const Font font; + const String text; + const int startX, baselineY, maximumLineWidth; + const Justification justification; + const float leading; + }; + + auto configureArrangement = [] (const ArrangementArgs& args) + { + GlyphArrangement arrangement; + arrangement.addJustifiedText (args.font, args.text, + (float) args.startX, (float) args.baselineY, (float) args.maximumLineWidth, + args.justification, args.leading); + return ConfiguredArrangement { std::move (arrangement), {} }; + }; + + GlyphArrangementCache::getInstance()->draw (*this, + { context.getFont(), text, startX, baselineY, maximumLineWidth, justification, leading }, + std::move (configureArrangement)); } void Graphics::drawText (const String& text, Rectangle area, Justification justificationType, bool useEllipsesIfTooBig) const { - if (text.isNotEmpty() && context.clipRegionIntersects (area.getSmallestIntegerContainer())) + if (text.isEmpty() || ! context.clipRegionIntersects (area.getSmallestIntegerContainer())) + return; + + struct ArrangementArgs { - GlyphArrangement arr; - arr.addCurtailedLineOfText (context.getFont(), text, 0.0f, 0.0f, - area.getWidth(), useEllipsesIfTooBig); - - arr.justifyGlyphs (0, arr.getNumGlyphs(), - area.getX(), area.getY(), area.getWidth(), area.getHeight(), - justificationType); - arr.draw (*this); - } + auto tie() const noexcept { return std::tie (font, text, area, justificationType, useEllipsesIfTooBig); } + bool operator< (const ArrangementArgs& other) const { return tie() < other.tie(); } + + const Font font; + const String text; + const Rectangle area; + const Justification justificationType; + const bool useEllipsesIfTooBig; + }; + + auto configureArrangement = [] (const ArrangementArgs& args) + { + GlyphArrangement arrangement; + arrangement.addCurtailedLineOfText (args.font, args.text, 0.0f, 0.0f, + args.area.getWidth(), args.useEllipsesIfTooBig); + + arrangement.justifyGlyphs (0, arrangement.getNumGlyphs(), + args.area.getX(), args.area.getY(), args.area.getWidth(), args.area.getHeight(), + args.justificationType); + return ConfiguredArrangement { std::move (arrangement), {} }; + }; + + GlyphArrangementCache::getInstance()->draw (*this, + { context.getFont(), text, area, justificationType, useEllipsesIfTooBig }, + std::move (configureArrangement)); } void Graphics::drawText (const String& text, Rectangle area, @@ -319,18 +464,37 @@ const int maximumNumberOfLines, const float minimumHorizontalScale) const { - if (text.isNotEmpty() && (! area.isEmpty()) && context.clipRegionIntersects (area)) + if (text.isEmpty() || area.isEmpty() || ! context.clipRegionIntersects (area)) + return; + + struct ArrangementArgs { - GlyphArrangement arr; - arr.addFittedText (context.getFont(), text, - (float) area.getX(), (float) area.getY(), - (float) area.getWidth(), (float) area.getHeight(), - justification, - maximumNumberOfLines, - minimumHorizontalScale); + auto tie() const noexcept { return std::tie (font, text, area, justification, maximumNumberOfLines, minimumHorizontalScale); } + bool operator< (const ArrangementArgs& other) const noexcept { return tie() < other.tie(); } - arr.draw (*this); - } + const Font font; + const String text; + const Rectangle area; + const Justification justification; + const int maximumNumberOfLines; + const float minimumHorizontalScale; + }; + + auto configureArrangement = [] (const ArrangementArgs& args) + { + GlyphArrangement arrangement; + arrangement.addFittedText (args.font, args.text, + args.area.getX(), args.area.getY(), + args.area.getWidth(), args.area.getHeight(), + args.justification, + args.maximumNumberOfLines, + args.minimumHorizontalScale); + return ConfiguredArrangement { std::move (arrangement), {} }; + }; + + GlyphArrangementCache::getInstance()->draw (*this, + { context.getFont(), text, area.toFloat(), justification, maximumNumberOfLines, minimumHorizontalScale }, + std::move (configureArrangement)); } void Graphics::drawFittedText (const String& text, int x, int y, int width, int height, diff -Nru juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_GraphicsContext.h juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_GraphicsContext.h --- juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_GraphicsContext.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_GraphicsContext.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -56,9 +56,6 @@ */ explicit Graphics (const Image& imageToDrawOnto); - /** Destructor. */ - ~Graphics(); - //============================================================================== /** Changes the current drawing colour. diff -Nru juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h --- juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -46,10 +46,10 @@ { protected: //============================================================================== - LowLevelGraphicsContext(); + LowLevelGraphicsContext() = default; public: - virtual ~LowLevelGraphicsContext(); + virtual ~LowLevelGraphicsContext() = default; /** Returns true if this device is vector-based, e.g. a printer. */ virtual bool isVectorDevice() const = 0; diff -Nru juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp --- juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -83,10 +83,6 @@ << scale << ' ' << scale << " scale\n\n"; } -LowLevelGraphicsPostScriptRenderer::~LowLevelGraphicsPostScriptRenderer() -{ -} - //============================================================================== bool LowLevelGraphicsPostScriptRenderer::isVectorDevice() const { @@ -168,10 +164,6 @@ { } -LowLevelGraphicsPostScriptRenderer::SavedState::~SavedState() -{ -} - void LowLevelGraphicsPostScriptRenderer::saveState() { stateStack.add (new SavedState (*stateStack.getLast())); diff -Nru juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h --- juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -42,8 +42,6 @@ int totalWidth, int totalHeight); - ~LowLevelGraphicsPostScriptRenderer() override; - //============================================================================== bool isVectorDevice() const override; void setOrigin (Point) override; @@ -95,8 +93,8 @@ struct SavedState { SavedState(); + SavedState (const SavedState&) = default; SavedState& operator= (const SavedState&) = delete; - ~SavedState(); RectangleList clip; int xOffset, yOffset; diff -Nru juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp --- juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h --- juce-6.1.5~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/effects/juce_DropShadowEffect.cpp juce-7.0.0~ds0/modules/juce_graphics/effects/juce_DropShadowEffect.cpp --- juce-6.1.5~ds0/modules/juce_graphics/effects/juce_DropShadowEffect.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/effects/juce_DropShadowEffect.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/effects/juce_DropShadowEffect.h juce-7.0.0~ds0/modules/juce_graphics/effects/juce_DropShadowEffect.h --- juce-6.1.5~ds0/modules/juce_graphics/effects/juce_DropShadowEffect.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/effects/juce_DropShadowEffect.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/effects/juce_GlowEffect.cpp juce-7.0.0~ds0/modules/juce_graphics/effects/juce_GlowEffect.cpp --- juce-6.1.5~ds0/modules/juce_graphics/effects/juce_GlowEffect.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/effects/juce_GlowEffect.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/effects/juce_GlowEffect.h juce-7.0.0~ds0/modules/juce_graphics/effects/juce_GlowEffect.h --- juce-6.1.5~ds0/modules/juce_graphics/effects/juce_GlowEffect.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/effects/juce_GlowEffect.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/effects/juce_ImageEffectFilter.h juce-7.0.0~ds0/modules/juce_graphics/effects/juce_ImageEffectFilter.h --- juce-6.1.5~ds0/modules/juce_graphics/effects/juce_ImageEffectFilter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/effects/juce_ImageEffectFilter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_AttributedString.cpp juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_AttributedString.cpp --- juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_AttributedString.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_AttributedString.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -54,6 +54,24 @@ } } + inline bool areInvariantsMaintained (const String& text, const Array& atts) + { + if (atts.isEmpty()) + return true; + + if (atts.getFirst().range.getStart() != 0) + return false; + + if (atts.getLast().range.getEnd() != text.length()) + return false; + + for (auto it = std::next (atts.begin()); it != atts.end(); ++it) + if (it->range.getStart() != std::prev (it)->range.getEnd()) + return false; + + return true; + } + Range splitAttributeRanges (Array& atts, Range newRange) { newRange = newRange.getIntersectionWith ({ 0, getLength (atts) }); @@ -151,30 +169,35 @@ truncate (attributes, newLength); text = newText; + jassert (areInvariantsMaintained (text, attributes)); } void AttributedString::append (const String& textToAppend) { text += textToAppend; appendRange (attributes, textToAppend.length(), nullptr, nullptr); + jassert (areInvariantsMaintained (text, attributes)); } void AttributedString::append (const String& textToAppend, const Font& font) { text += textToAppend; appendRange (attributes, textToAppend.length(), &font, nullptr); + jassert (areInvariantsMaintained (text, attributes)); } void AttributedString::append (const String& textToAppend, Colour colour) { text += textToAppend; appendRange (attributes, textToAppend.length(), nullptr, &colour); + jassert (areInvariantsMaintained (text, attributes)); } void AttributedString::append (const String& textToAppend, const Font& font, Colour colour) { text += textToAppend; appendRange (attributes, textToAppend.length(), &font, &colour); + jassert (areInvariantsMaintained (text, attributes)); } void AttributedString::append (const AttributedString& other) @@ -188,6 +211,7 @@ attributes.getReference (i).range += originalLength; mergeAdjacentRanges (attributes); + jassert (areInvariantsMaintained (text, attributes)); } void AttributedString::clear() @@ -219,21 +243,25 @@ void AttributedString::setColour (Range range, Colour colour) { applyFontAndColour (attributes, range, nullptr, &colour); + jassert (areInvariantsMaintained (text, attributes)); } void AttributedString::setFont (Range range, const Font& font) { applyFontAndColour (attributes, range, &font, nullptr); + jassert (areInvariantsMaintained (text, attributes)); } void AttributedString::setColour (Colour colour) { setColour ({ 0, getLength (attributes) }, colour); + jassert (areInvariantsMaintained (text, attributes)); } void AttributedString::setFont (const Font& font) { setFont ({ 0, getLength (attributes) }, font); + jassert (areInvariantsMaintained (text, attributes)); } void AttributedString::draw (Graphics& g, const Rectangle& area) const diff -Nru juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_AttributedString.h juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_AttributedString.h --- juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_AttributedString.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_AttributedString.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -34,6 +34,11 @@ An attributed string lets you create a string with varied fonts, colours, word-wrapping, layout, etc., and draw it using AttributedString::draw(). + Invariants: + - Every character in the string is a member of exactly one attribute. + - Attributes are sorted such that the range-end of attribute 'i' is equal to the + range-begin of attribute 'i + 1'. + @see TextLayout @tags{Graphics} diff -Nru juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_CustomTypeface.cpp juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_CustomTypeface.cpp --- juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_CustomTypeface.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_CustomTypeface.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_CustomTypeface.h juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_CustomTypeface.h --- juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_CustomTypeface.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_CustomTypeface.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_Font.cpp juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_Font.cpp --- juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_Font.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_Font.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -243,14 +243,19 @@ { } + auto tie() const + { + return std::tie (height, underline, horizontalScale, kerning, typefaceName, typefaceStyle); + } + bool operator== (const SharedFontInternal& other) const noexcept { - return height == other.height - && underline == other.underline - && horizontalScale == other.horizontalScale - && kerning == other.kerning - && typefaceName == other.typefaceName - && typefaceStyle == other.typefaceStyle; + return tie() == other.tie(); + } + + bool operator< (const SharedFontInternal& other) const noexcept + { + return tie() < other.tie(); } /* The typeface and ascent data members may be read/set from multiple threads @@ -418,6 +423,11 @@ return ! operator== (other); } +bool Font::compare (const Font& a, const Font& b) noexcept +{ + return *a.font < *b.font; +} + void Font::dupeInternalIfShared() { if (font->getReferenceCount() > 1) diff -Nru juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_Font.h juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_Font.h --- juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_Font.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_Font.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -154,7 +154,7 @@ /** Returns a copy of this font with a new typeface style. @see getAvailableStyles() */ - Font withTypefaceStyle (const String& newStyle) const; + JUCE_NODISCARD Font withTypefaceStyle (const String& newStyle) const; /** Returns a list of the styles that this font can use. */ StringArray getAvailableStyles() const; @@ -204,10 +204,10 @@ //============================================================================== /** Returns a copy of this font with a new height. */ - Font withHeight (float height) const; + JUCE_NODISCARD Font withHeight (float height) const; /** Returns a copy of this font with a new height, specified in points. */ - Font withPointHeight (float heightInPoints) const; + JUCE_NODISCARD Font withPointHeight (float heightInPoints) const; /** Changes the font's height. @see getHeight, withHeight, setHeightWithoutChangingWidth @@ -271,7 +271,7 @@ @param styleFlags a bitwise-or'ed combination of values from the FontStyleFlags enum. @see FontStyleFlags, getStyleFlags */ - Font withStyle (int styleFlags) const; + JUCE_NODISCARD Font withStyle (int styleFlags) const; /** Changes the font's style. @param newFlags a bitwise-or'ed combination of values from the FontStyleFlags enum. @@ -286,7 +286,7 @@ /** Returns a copy of this font with the bold attribute set. If the font does not have a bold version, this will return the default font. */ - Font boldened() const; + JUCE_NODISCARD Font boldened() const; /** Returns true if the font is bold. */ bool isBold() const noexcept; @@ -294,7 +294,7 @@ /** Makes the font italic or non-italic. */ void setItalic (bool shouldBeItalic); /** Returns a copy of this font with the italic attribute set. */ - Font italicised() const; + JUCE_NODISCARD Font italicised() const; /** Returns true if the font is italic. */ bool isItalic() const noexcept; @@ -317,7 +317,7 @@ narrower, greater than 1.0 will be stretched out. @see getHorizontalScale */ - Font withHorizontalScale (float scaleFactor) const; + JUCE_NODISCARD Font withHorizontalScale (float scaleFactor) const; /** Changes the font's horizontal scale factor. @param scaleFactor a value of 1.0 is the normal scale, less than this will be @@ -353,7 +353,7 @@ normal spacing, positive values spread the letters out, negative values make them closer together. */ - Font withExtraKerningFactor (float extraKerning) const; + JUCE_NODISCARD Font withExtraKerningFactor (float extraKerning) const; /** Changes the font's kerning. @param extraKerning a multiple of the font's height that will be added @@ -471,12 +471,17 @@ private: //============================================================================== - class SharedFontInternal; - ReferenceCountedObjectPtr font; + static bool compare (const Font&, const Font&) noexcept; + void dupeInternalIfShared(); void checkTypefaceSuitability(); float getHeightToPointsFactor() const; + friend struct GraphicsFontHelpers; + + class SharedFontInternal; + ReferenceCountedObjectPtr font; + JUCE_LEAK_DETECTOR (Font) }; diff -Nru juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp --- juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,14 @@ namespace juce { +static constexpr bool isNonBreakingSpace (const juce_wchar c) +{ + return c == 0x00a0 + || c == 0x2007 + || c == 0x202f + || c == 0x2060; +} + PositionedGlyph::PositionedGlyph() noexcept : character (0), glyph (0), x (0), y (0), w (0), whitespace (false) { @@ -38,8 +46,6 @@ { } -PositionedGlyph::~PositionedGlyph() {} - static void drawGlyphWithFont (Graphics& g, int glyph, const Font& font, AffineTransform t) { auto& context = g.getInternalContext(); @@ -168,7 +174,7 @@ } auto thisX = xOffsets.getUnchecked (i); - bool isWhitespace = t.isWhitespace(); + auto isWhitespace = isNonBreakingSpace (*t) || t.isWhitespace(); glyphs.add (PositionedGlyph (font, t.getAndAdvance(), newGlyphs.getUnchecked(i), @@ -545,7 +551,7 @@ static bool isBreakableGlyph (const PositionedGlyph& g) noexcept { - return g.isWhitespace() || g.getCharacter() == '-'; + return ! isNonBreakingSpace (g.getCharacter()) && (g.isWhitespace() || g.getCharacter() == '-'); } void GlyphArrangement::splitLines (const String& text, Font font, int startIndex, diff -Nru juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_GlyphArrangement.h juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_GlyphArrangement.h --- juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_GlyphArrangement.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_GlyphArrangement.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -47,13 +47,6 @@ PositionedGlyph (const Font& font, juce_wchar character, int glyphNumber, float anchorX, float baselineY, float width, bool isWhitespace); - PositionedGlyph (const PositionedGlyph&) = default; - PositionedGlyph& operator= (const PositionedGlyph&) = default; - PositionedGlyph (PositionedGlyph&&) noexcept = default; - PositionedGlyph& operator= (PositionedGlyph&&) noexcept = default; - - ~PositionedGlyph(); - /** Returns the character the glyph represents. */ juce_wchar getCharacter() const noexcept { return character; } /** Checks whether the glyph is actually empty. */ diff -Nru juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_TextLayout.cpp juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_TextLayout.cpp --- juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_TextLayout.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_TextLayout.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_TextLayout.h juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_TextLayout.h --- juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_TextLayout.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_TextLayout.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_Typeface.cpp juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_Typeface.cpp --- juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_Typeface.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_Typeface.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_Typeface.h juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_Typeface.h --- juce-6.1.5~ds0/modules/juce_graphics/fonts/juce_Typeface.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/fonts/juce_Typeface.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_AffineTransform.cpp juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_AffineTransform.cpp --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_AffineTransform.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_AffineTransform.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_AffineTransform.h juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_AffineTransform.h --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_AffineTransform.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_AffineTransform.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_BorderSize.h juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_BorderSize.h --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_BorderSize.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_BorderSize.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -40,6 +40,8 @@ template class BorderSize { + auto tie() const { return std::tie (top, left, bottom, right); } + public: //============================================================================== /** Creates a null border. @@ -47,9 +49,6 @@ */ BorderSize() = default; - /** Creates a copy of another border. */ - BorderSize (const BorderSize&) = default; - /** Creates a border with the given gaps. */ BorderSize (ValueType topGap, ValueType leftGap, ValueType bottomGap, ValueType rightGap) noexcept : top (topGap), left (leftGap), bottom (bottomGap), right (rightGap) @@ -101,10 +100,10 @@ /** Returns a rectangle with these borders removed from it. */ Rectangle subtractedFrom (const Rectangle& original) const noexcept { - return Rectangle (original.getX() + left, - original.getY() + top, - original.getWidth() - (left + right), - original.getHeight() - (top + bottom)); + return { original.getX() + left, + original.getY() + top, + original.getWidth() - (left + right), + original.getHeight() - (top + bottom) }; } /** Removes this border from a given rectangle. */ @@ -116,30 +115,50 @@ /** Returns a rectangle with these borders added around it. */ Rectangle addedTo (const Rectangle& original) const noexcept { - return Rectangle (original.getX() - left, - original.getY() - top, - original.getWidth() + (left + right), - original.getHeight() + (top + bottom)); + return { original.getX() - left, + original.getY() - top, + original.getWidth() + (left + right), + original.getHeight() + (top + bottom) }; } - /** Adds this border around a given rectangle. */ void addTo (Rectangle& rectangle) const noexcept { rectangle = addedTo (rectangle); } - //============================================================================== - bool operator== (const BorderSize& other) const noexcept + /** Removes this border from another border. */ + BorderSize subtractedFrom (const BorderSize& other) const noexcept { - return top == other.top && left == other.left && bottom == other.bottom && right == other.right; + return { other.top - top, + other.left - left, + other.bottom - bottom, + other.right - right }; } - bool operator!= (const BorderSize& other) const noexcept + /** Adds this border to another border. */ + BorderSize addedTo (const BorderSize& other) const noexcept { - return ! operator== (other); + return { other.top + top, + other.left + left, + other.bottom + bottom, + other.right + right }; } + /** Multiplies each member of the border by a scalar. */ + template + BorderSize multipliedBy (ScalarType scalar) const noexcept + { + return { static_cast (scalar * top), + static_cast (scalar * left), + static_cast (scalar * bottom), + static_cast (scalar * right) }; + } + + //============================================================================== + bool operator== (const BorderSize& other) const noexcept { return tie() == other.tie(); } + bool operator!= (const BorderSize& other) const noexcept { return tie() != other.tie(); } + private: //============================================================================== ValueType top{}, left{}, bottom{}, right{}; diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_EdgeTable.cpp juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_EdgeTable.cpp --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_EdgeTable.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_EdgeTable.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_EdgeTable.h juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_EdgeTable.h --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_EdgeTable.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_EdgeTable.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Line.h juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Line.h --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Line.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Line.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -203,7 +203,8 @@ */ Point getPointAlongLine (ValueType distanceFromStart) const noexcept { - return start + (end - start) * (distanceFromStart / getLength()); + const auto length = getLength(); + return length == 0 ? start : start + (end - start) * (distanceFromStart / length); } /** Returns a point which is a certain distance along and to the side of this line. @@ -328,6 +329,16 @@ && point.y < ((end.y - start.y) * (point.x - start.x)) / (end.x - start.x) + start.y; } + /** Returns a lengthened copy of this line. + + This will extend the line by a certain amount by moving the start away from the end + (leaving the end-point the same), and return the new line. + */ + Line withLengthenedStart (ValueType distanceToLengthenBy) const noexcept + { + return withShortenedStart (-distanceToLengthenBy); + } + //============================================================================== /** Returns a shortened copy of this line. @@ -339,6 +350,16 @@ return { getPointAlongLine (jmin (distanceToShortenBy, getLength())), end }; } + /** Returns a lengthened copy of this line. + + This will extend the line by a certain amount by moving the end away from the start + (leaving the start-point the same), and return the new line. + */ + Line withLengthenedEnd (ValueType distanceToLengthenBy) const noexcept + { + return withShortenedEnd (-distanceToLengthenBy); + } + /** Returns a shortened copy of this line. This will chop off part of the end of this line by a certain amount, (leaving the diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Parallelogram.h juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Parallelogram.h --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Parallelogram.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Parallelogram.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Path.cpp juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Path.cpp --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Path.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Path.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -970,7 +970,7 @@ return contains (point.x, point.y, tolerance); } -bool Path::intersectsLine (Line line, float tolerance) +bool Path::intersectsLine (Line line, float tolerance) const { PathFlatteningIterator i (*this, AffineTransform(), tolerance); Point intersection; diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Path.h juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Path.h --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Path.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Path.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -144,7 +144,7 @@ outside the path's boundary. */ bool intersectsLine (Line line, - float tolerance = defaultToleranceForTesting); + float tolerance = defaultToleranceForTesting) const; /** Cuts off parts of a line to keep the parts that are either inside or outside this path. diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_PathIterator.cpp juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_PathIterator.cpp --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_PathIterator.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_PathIterator.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_PathIterator.h juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_PathIterator.h --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_PathIterator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_PathIterator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_PathStrokeType.cpp juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_PathStrokeType.cpp --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_PathStrokeType.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_PathStrokeType.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_PathStrokeType.h juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_PathStrokeType.h --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_PathStrokeType.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_PathStrokeType.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Point.h juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Point.h --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Point.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Point.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Rectangle.h juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Rectangle.h --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Rectangle.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Rectangle.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -217,42 +217,42 @@ void setVerticalRange (Range range) noexcept { pos.y = range.getStart(); h = range.getLength(); } /** Returns a rectangle which has the same size and y-position as this one, but with a different x-position. */ - Rectangle withX (ValueType newX) const noexcept { return { newX, pos.y, w, h }; } + JUCE_NODISCARD Rectangle withX (ValueType newX) const noexcept { return { newX, pos.y, w, h }; } /** Returns a rectangle which has the same size and x-position as this one, but with a different y-position. */ - Rectangle withY (ValueType newY) const noexcept { return { pos.x, newY, w, h }; } + JUCE_NODISCARD Rectangle withY (ValueType newY) const noexcept { return { pos.x, newY, w, h }; } /** Returns a rectangle which has the same size and y-position as this one, but whose right-hand edge has the given position. */ - Rectangle withRightX (ValueType newRightX) const noexcept { return { newRightX - w, pos.y, w, h }; } + JUCE_NODISCARD Rectangle withRightX (ValueType newRightX) const noexcept { return { newRightX - w, pos.y, w, h }; } /** Returns a rectangle which has the same size and x-position as this one, but whose bottom edge has the given position. */ - Rectangle withBottomY (ValueType newBottomY) const noexcept { return { pos.x, newBottomY - h, w, h }; } + JUCE_NODISCARD Rectangle withBottomY (ValueType newBottomY) const noexcept { return { pos.x, newBottomY - h, w, h }; } /** Returns a rectangle with the same size as this one, but a new position. */ - Rectangle withPosition (ValueType newX, ValueType newY) const noexcept { return { newX, newY, w, h }; } + JUCE_NODISCARD Rectangle withPosition (ValueType newX, ValueType newY) const noexcept { return { newX, newY, w, h }; } /** Returns a rectangle with the same size as this one, but a new position. */ - Rectangle withPosition (Point newPos) const noexcept { return { newPos.x, newPos.y, w, h }; } + JUCE_NODISCARD Rectangle withPosition (Point newPos) const noexcept { return { newPos.x, newPos.y, w, h }; } /** Returns a rectangle whose size is the same as this one, but whose top-left position is (0, 0). */ - Rectangle withZeroOrigin() const noexcept { return { w, h }; } + JUCE_NODISCARD Rectangle withZeroOrigin() const noexcept { return { w, h }; } /** Returns a rectangle with the same size as this one, but a new centre position. */ - Rectangle withCentre (Point newCentre) const noexcept { return { newCentre.x - w / (ValueType) 2, + JUCE_NODISCARD Rectangle withCentre (Point newCentre) const noexcept { return { newCentre.x - w / (ValueType) 2, newCentre.y - h / (ValueType) 2, w, h }; } /** Returns a rectangle which has the same position and height as this one, but with a different width. */ - Rectangle withWidth (ValueType newWidth) const noexcept { return { pos.x, pos.y, jmax (ValueType(), newWidth), h }; } + JUCE_NODISCARD Rectangle withWidth (ValueType newWidth) const noexcept { return { pos.x, pos.y, jmax (ValueType(), newWidth), h }; } /** Returns a rectangle which has the same position and width as this one, but with a different height. */ - Rectangle withHeight (ValueType newHeight) const noexcept { return { pos.x, pos.y, w, jmax (ValueType(), newHeight) }; } + JUCE_NODISCARD Rectangle withHeight (ValueType newHeight) const noexcept { return { pos.x, pos.y, w, jmax (ValueType(), newHeight) }; } /** Returns a rectangle with the same top-left position as this one, but a new size. */ - Rectangle withSize (ValueType newWidth, ValueType newHeight) const noexcept { return { pos.x, pos.y, jmax (ValueType(), newWidth), jmax (ValueType(), newHeight) }; } + JUCE_NODISCARD Rectangle withSize (ValueType newWidth, ValueType newHeight) const noexcept { return { pos.x, pos.y, jmax (ValueType(), newWidth), jmax (ValueType(), newHeight) }; } /** Returns a rectangle with the same centre position as this one, but a new size. */ - Rectangle withSizeKeepingCentre (ValueType newWidth, ValueType newHeight) const noexcept { return { pos.x + (w - newWidth) / (ValueType) 2, - pos.y + (h - newHeight) / (ValueType) 2, newWidth, newHeight }; } + JUCE_NODISCARD Rectangle withSizeKeepingCentre (ValueType newWidth, ValueType newHeight) const noexcept { return { pos.x + (w - newWidth) / (ValueType) 2, + pos.y + (h - newHeight) / (ValueType) 2, newWidth, newHeight }; } /** Moves the x position, adjusting the width so that the right-hand edge remains in the same place. If the x is moved to be on the right of the current right-hand edge, the width will be set to zero. @@ -264,7 +264,7 @@ If the new x is beyond the right of the current right-hand edge, the width will be set to zero. @see setLeft */ - Rectangle withLeft (ValueType newLeft) const noexcept { return { newLeft, pos.y, jmax (ValueType(), pos.x + w - newLeft), h }; } + JUCE_NODISCARD Rectangle withLeft (ValueType newLeft) const noexcept { return { newLeft, pos.y, jmax (ValueType(), pos.x + w - newLeft), h }; } /** Moves the y position, adjusting the height so that the bottom edge remains in the same place. If the y is moved to be below the current bottom edge, the height will be set to zero. @@ -276,7 +276,7 @@ If the new y is beyond the bottom of the current rectangle, the height will be set to zero. @see setTop */ - Rectangle withTop (ValueType newTop) const noexcept { return { pos.x, newTop, w, jmax (ValueType(), pos.y + h - newTop) }; } + JUCE_NODISCARD Rectangle withTop (ValueType newTop) const noexcept { return { pos.x, newTop, w, jmax (ValueType(), pos.y + h - newTop) }; } /** Adjusts the width so that the right-hand edge of the rectangle has this new value. If the new right is below the current X value, the X will be pushed down to match it. @@ -288,7 +288,7 @@ If the new right edge is below the current left-hand edge, the width will be set to zero. @see setRight */ - Rectangle withRight (ValueType newRight) const noexcept { return { jmin (pos.x, newRight), pos.y, jmax (ValueType(), newRight - pos.x), h }; } + JUCE_NODISCARD Rectangle withRight (ValueType newRight) const noexcept { return { jmin (pos.x, newRight), pos.y, jmax (ValueType(), newRight - pos.x), h }; } /** Adjusts the height so that the bottom edge of the rectangle has this new value. If the new bottom is lower than the current Y value, the Y will be pushed down to match it. @@ -300,19 +300,19 @@ If the new y is beyond the bottom of the current rectangle, the height will be set to zero. @see setBottom */ - Rectangle withBottom (ValueType newBottom) const noexcept { return { pos.x, jmin (pos.y, newBottom), w, jmax (ValueType(), newBottom - pos.y) }; } + JUCE_NODISCARD Rectangle withBottom (ValueType newBottom) const noexcept { return { pos.x, jmin (pos.y, newBottom), w, jmax (ValueType(), newBottom - pos.y) }; } /** Returns a version of this rectangle with the given amount removed from its left-hand edge. */ - Rectangle withTrimmedLeft (ValueType amountToRemove) const noexcept { return withLeft (pos.x + amountToRemove); } + JUCE_NODISCARD Rectangle withTrimmedLeft (ValueType amountToRemove) const noexcept { return withLeft (pos.x + amountToRemove); } /** Returns a version of this rectangle with the given amount removed from its right-hand edge. */ - Rectangle withTrimmedRight (ValueType amountToRemove) const noexcept { return withWidth (w - amountToRemove); } + JUCE_NODISCARD Rectangle withTrimmedRight (ValueType amountToRemove) const noexcept { return withWidth (w - amountToRemove); } /** Returns a version of this rectangle with the given amount removed from its top edge. */ - Rectangle withTrimmedTop (ValueType amountToRemove) const noexcept { return withTop (pos.y + amountToRemove); } + JUCE_NODISCARD Rectangle withTrimmedTop (ValueType amountToRemove) const noexcept { return withTop (pos.y + amountToRemove); } /** Returns a version of this rectangle with the given amount removed from its bottom edge. */ - Rectangle withTrimmedBottom (ValueType amountToRemove) const noexcept { return withHeight (h - amountToRemove); } + JUCE_NODISCARD Rectangle withTrimmedBottom (ValueType amountToRemove) const noexcept { return withHeight (h - amountToRemove); } //============================================================================== /** Moves the rectangle's position by adding amount to its x and y coordinates. */ diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_RectangleList.h juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_RectangleList.h --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_RectangleList.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_RectangleList.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Rectangle_test.cpp juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Rectangle_test.cpp --- juce-6.1.5~ds0/modules/juce_graphics/geometry/juce_Rectangle_test.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/geometry/juce_Rectangle_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/image_formats/juce_GIFLoader.cpp juce-7.0.0~ds0/modules/juce_graphics/image_formats/juce_GIFLoader.cpp --- juce-6.1.5~ds0/modules/juce_graphics/image_formats/juce_GIFLoader.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/image_formats/juce_GIFLoader.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp juce-7.0.0~ds0/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp --- juce-6.1.5~ds0/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/image_formats/juce_PNGLoader.cpp juce-7.0.0~ds0/modules/juce_graphics/image_formats/juce_PNGLoader.cpp --- juce-6.1.5~ds0/modules/juce_graphics/image_formats/juce_PNGLoader.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/image_formats/juce_PNGLoader.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -63,7 +63,8 @@ "-Wtautological-constant-out-of-range-compare", "-Wzero-as-null-pointer-constant", "-Wcomma", - "-Wmaybe-uninitialized") + "-Wmaybe-uninitialized", + "-Wnull-pointer-subtraction") #undef check using std::abs; diff -Nru juce-6.1.5~ds0/modules/juce_graphics/images/juce_ImageCache.cpp juce-7.0.0~ds0/modules/juce_graphics/images/juce_ImageCache.cpp --- juce-6.1.5~ds0/modules/juce_graphics/images/juce_ImageCache.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/images/juce_ImageCache.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/images/juce_ImageCache.h juce-7.0.0~ds0/modules/juce_graphics/images/juce_ImageCache.h --- juce-6.1.5~ds0/modules/juce_graphics/images/juce_ImageCache.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/images/juce_ImageCache.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp juce-7.0.0~ds0/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp --- juce-6.1.5~ds0/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/images/juce_ImageConvolutionKernel.h juce-7.0.0~ds0/modules/juce_graphics/images/juce_ImageConvolutionKernel.h --- juce-6.1.5~ds0/modules/juce_graphics/images/juce_ImageConvolutionKernel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/images/juce_ImageConvolutionKernel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/images/juce_Image.cpp juce-7.0.0~ds0/modules/juce_graphics/images/juce_Image.cpp --- juce-6.1.5~ds0/modules/juce_graphics/images/juce_Image.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/images/juce_Image.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -97,7 +97,9 @@ void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override { - bitmap.data = imageData + (size_t) x * (size_t) pixelStride + (size_t) y * (size_t) lineStride; + const auto offset = (size_t) x * (size_t) pixelStride + (size_t) y * (size_t) lineStride; + bitmap.data = imageData + offset; + bitmap.size = (size_t) (height * lineStride) - offset; bitmap.pixelFormat = pixelFormat; bitmap.lineStride = lineStride; bitmap.pixelStride = pixelStride; diff -Nru juce-6.1.5~ds0/modules/juce_graphics/images/juce_ImageFileFormat.cpp juce-7.0.0~ds0/modules/juce_graphics/images/juce_ImageFileFormat.cpp --- juce-6.1.5~ds0/modules/juce_graphics/images/juce_ImageFileFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/images/juce_ImageFileFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/images/juce_ImageFileFormat.h juce-7.0.0~ds0/modules/juce_graphics/images/juce_ImageFileFormat.h --- juce-6.1.5~ds0/modules/juce_graphics/images/juce_ImageFileFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/images/juce_ImageFileFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/images/juce_Image.h juce-7.0.0~ds0/modules/juce_graphics/images/juce_Image.h --- juce-6.1.5~ds0/modules/juce_graphics/images/juce_Image.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/images/juce_Image.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -349,6 +349,7 @@ Rectangle getBounds() const noexcept { return Rectangle (width, height); } uint8* data; /**< The raw pixel data, packed according to the image's pixel format. */ + size_t size; /**< The number of valid/allocated bytes after data. May be smaller than "lineStride * height" if this is a section of a larger image. */ PixelFormat pixelFormat; /**< The format of the data. */ int lineStride; /**< The number of bytes between each line. */ int pixelStride; /**< The number of bytes between each pixel. */ diff -Nru juce-6.1.5~ds0/modules/juce_graphics/images/juce_ScaledImage.h juce-7.0.0~ds0/modules/juce_graphics/images/juce_ScaledImage.h --- juce-6.1.5~ds0/modules/juce_graphics/images/juce_ScaledImage.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/images/juce_ScaledImage.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/juce_graphics.cpp juce-7.0.0~ds0/modules/juce_graphics/juce_graphics.cpp --- juce-6.1.5~ds0/modules/juce_graphics/juce_graphics.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/juce_graphics.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/juce_graphics.h juce-7.0.0~ds0/modules/juce_graphics/juce_graphics.h --- juce-6.1.5~ds0/modules/juce_graphics/juce_graphics.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/juce_graphics.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_graphics vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE graphics classes description: Classes for 2D vector graphics, image loading/saving, font handling, etc. website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/modules/juce_graphics/juce_graphics.mm juce-7.0.0~ds0/modules/juce_graphics/juce_graphics.mm --- juce-6.1.5~ds0/modules/juce_graphics/juce_graphics.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/juce_graphics.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_android_Fonts.cpp juce-7.0.0~ds0/modules/juce_graphics/native/juce_android_Fonts.cpp --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_android_Fonts.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_android_Fonts.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_android_GraphicsContext.cpp juce-7.0.0~ds0/modules/juce_graphics/native/juce_android_GraphicsContext.cpp --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_android_GraphicsContext.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_android_GraphicsContext.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -28,7 +28,7 @@ namespace GraphicsHelpers { - LocalRef createPaint (Graphics::ResamplingQuality quality) + static LocalRef createPaint (Graphics::ResamplingQuality quality) { jint constructorFlags = 1 /*ANTI_ALIAS_FLAG*/ | 4 /*DITHER_FLAG*/ @@ -40,7 +40,7 @@ return LocalRef(getEnv()->NewObject (AndroidPaint, AndroidPaint.constructor, constructorFlags)); } - const LocalRef createMatrix (JNIEnv* env, const AffineTransform& t) + static LocalRef createMatrix (JNIEnv* env, const AffineTransform& t) { auto m = LocalRef(env->NewObject (AndroidMatrix, AndroidMatrix.constructor)); @@ -56,7 +56,7 @@ return m; } -} +} // namespace GraphicsHelpers ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const { diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_android_IconHelpers.cpp juce-7.0.0~ds0/modules/juce_graphics/native/juce_android_IconHelpers.cpp --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_android_IconHelpers.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_android_IconHelpers.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -25,5 +25,6 @@ namespace juce { + Image JUCE_API getIconFromApplication (const String&, int); Image JUCE_API getIconFromApplication (const String&, int) { return {}; } } diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_freetype_Fonts.cpp juce-7.0.0~ds0/modules/juce_graphics/native/juce_freetype_Fonts.cpp --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_freetype_Fonts.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_freetype_Fonts.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_linux_Fonts.cpp juce-7.0.0~ds0/modules/juce_graphics/native/juce_linux_Fonts.cpp --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_linux_Fonts.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_linux_Fonts.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -30,7 +30,8 @@ { static const char* pathsToSearch[] = { "/etc/fonts/fonts.conf", "/usr/share/fonts/fonts.conf", - "/usr/local/etc/fonts/fonts.conf" }; + "/usr/local/etc/fonts/fonts.conf", + "/usr/share/defaults/fonts/fonts.conf" }; for (auto* path : pathsToSearch) if (auto xml = parseXML (File (path))) @@ -110,87 +111,122 @@ } //============================================================================== -struct DefaultFontNames +struct DefaultFontInfo { - DefaultFontNames() - : defaultSans (getDefaultSansSerifFontName()), - defaultSerif (getDefaultSerifFontName()), - defaultFixed (getDefaultMonospacedFontName()) + struct Characteristics + { + explicit Characteristics (String nameIn) : name (nameIn) {} + + Characteristics withStyle (String styleIn) const + { + auto copy = *this; + copy.style = std::move (styleIn); + return copy; + } + + String name, style; + }; + + DefaultFontInfo() + : defaultSans (getDefaultSansSerifFontCharacteristics()), + defaultSerif (getDefaultSerifFontCharacteristics()), + defaultFixed (getDefaultMonospacedFontCharacteristics()) { } - String getRealFontName (const String& faceName) const + Characteristics getRealFontCharacteristics (const String& faceName) const { if (faceName == Font::getDefaultSansSerifFontName()) return defaultSans; if (faceName == Font::getDefaultSerifFontName()) return defaultSerif; if (faceName == Font::getDefaultMonospacedFontName()) return defaultFixed; - return faceName; + return Characteristics { faceName }; } - String defaultSans, defaultSerif, defaultFixed; + Characteristics defaultSans, defaultSerif, defaultFixed; private: - static String pickBestFont (const StringArray& names, const char* const* choicesArray) + template + static Characteristics pickBestFont (const StringArray& names, Range&& choicesArray) { - const StringArray choices (choicesArray); - - for (auto& choice : choices) - if (names.contains (choice, true)) + for (auto& choice : choicesArray) + if (names.contains (choice.name, true)) return choice; - for (auto& choice : choices) + for (auto& choice : choicesArray) for (auto& name : names) - if (name.startsWithIgnoreCase (choice)) - return name; + if (name.startsWithIgnoreCase (choice.name)) + return Characteristics { name }.withStyle (choice.style); - for (auto& choice : choices) + for (auto& choice : choicesArray) for (auto& name : names) - if (name.containsIgnoreCase (choice)) - return name; + if (name.containsIgnoreCase (choice.name)) + return Characteristics { name }.withStyle (choice.style); - return names[0]; + return Characteristics { names[0] }; } - static String getDefaultSansSerifFontName() + static Characteristics getDefaultSansSerifFontCharacteristics() { StringArray allFonts; FTTypefaceList::getInstance()->getSansSerifNames (allFonts); - static const char* targets[] = { "Verdana", "Bitstream Vera Sans", "Luxi Sans", - "Liberation Sans", "DejaVu Sans", "Sans", nullptr }; + static const Characteristics targets[] { Characteristics { "Verdana" }, + Characteristics { "Bitstream Vera Sans" }.withStyle ("Roman"), + Characteristics { "Luxi Sans" }, + Characteristics { "Liberation Sans" }, + Characteristics { "DejaVu Sans" }, + Characteristics { "Sans" } }; return pickBestFont (allFonts, targets); } - static String getDefaultSerifFontName() + static Characteristics getDefaultSerifFontCharacteristics() { StringArray allFonts; FTTypefaceList::getInstance()->getSerifNames (allFonts); - static const char* targets[] = { "Bitstream Vera Serif", "Times", "Nimbus Roman", - "Liberation Serif", "DejaVu Serif", "Serif", nullptr }; + static const Characteristics targets[] { Characteristics { "Bitstream Vera Serif" }.withStyle ("Roman"), + Characteristics { "Times" }, + Characteristics { "Nimbus Roman" }, + Characteristics { "Liberation Serif" }, + Characteristics { "DejaVu Serif" }, + Characteristics { "Serif" } }; return pickBestFont (allFonts, targets); } - static String getDefaultMonospacedFontName() + static Characteristics getDefaultMonospacedFontCharacteristics() { StringArray allFonts; FTTypefaceList::getInstance()->getMonospacedNames (allFonts); - static const char* targets[] = { "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Sans Mono", - "Liberation Mono", "Courier", "DejaVu Mono", "Mono", nullptr }; + static const Characteristics targets[] { Characteristics { "DejaVu Sans Mono" }, + Characteristics { "Bitstream Vera Sans Mono" }.withStyle ("Roman"), + Characteristics { "Sans Mono" }, + Characteristics { "Liberation Mono" }, + Characteristics { "Courier" }, + Characteristics { "DejaVu Mono" }, + Characteristics { "Mono" } }; return pickBestFont (allFonts, targets); } - JUCE_DECLARE_NON_COPYABLE (DefaultFontNames) + JUCE_DECLARE_NON_COPYABLE (DefaultFontInfo) }; Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font) { - static DefaultFontNames defaultNames; + static const DefaultFontInfo defaultInfo; Font f (font); - f.setTypefaceName (defaultNames.getRealFontName (font.getTypefaceName())); + + const auto name = font.getTypefaceName(); + const auto characteristics = defaultInfo.getRealFontCharacteristics (name); + f.setTypefaceName (characteristics.name); + + const auto styles = findAllTypefaceStyles (name); + + if (! styles.contains (font.getTypefaceStyle())) + f.setTypefaceStyle (characteristics.style); + return Typeface::createSystemTypefaceFor (f); } diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_linux_IconHelpers.cpp juce-7.0.0~ds0/modules/juce_graphics/native/juce_linux_IconHelpers.cpp --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_linux_IconHelpers.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_linux_IconHelpers.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -25,5 +25,6 @@ namespace juce { + Image JUCE_API getIconFromApplication (const String&, int); Image JUCE_API getIconFromApplication (const String&, int) { return {}; } } diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h juce-7.0.0~ds0/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm juce-7.0.0~ds0/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -71,7 +71,9 @@ void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override { - bitmap.data = imageData->data + x * pixelStride + y * lineStride; + const auto offset = (size_t) (x * pixelStride + y * lineStride); + bitmap.data = imageData->data + offset; + bitmap.size = (size_t) (lineStride * height) - offset; bitmap.pixelFormat = pixelFormat; bitmap.lineStride = lineStride; bitmap.pixelStride = pixelStride; @@ -111,32 +113,29 @@ static CGImageRef createImage (const Image& juceImage, CGColorSpaceRef colourSpace) { const Image::BitmapData srcData (juceImage, Image::BitmapData::readOnly); - detail::DataProviderPtr provider; - if (auto* cgim = dynamic_cast (juceImage.getPixelData())) + const auto provider = [&] { - provider = detail::DataProviderPtr { CGDataProviderCreateWithData (new ImageDataContainer::Ptr (cgim->imageData), + if (auto* cgim = dynamic_cast (juceImage.getPixelData())) + { + return detail::DataProviderPtr { CGDataProviderCreateWithData (new ImageDataContainer::Ptr (cgim->imageData), srcData.data, - (size_t) srcData.lineStride * (size_t) srcData.height, + srcData.size, [] (void * __nullable info, const void*, size_t) { delete (ImageDataContainer::Ptr*) info; }) }; - } - else - { - CFUniquePtr data (CFDataCreate (nullptr, - (const UInt8*) srcData.data, - (CFIndex) ((size_t) srcData.lineStride * (size_t) srcData.height))); - provider = detail::DataProviderPtr { CGDataProviderCreateWithCFData (data.get()) }; - } - - CGImageRef imageRef = CGImageCreate ((size_t) srcData.width, - (size_t) srcData.height, - 8, - (size_t) srcData.pixelStride * 8, - (size_t) srcData.lineStride, - colourSpace, getCGImageFlags (juceImage.getFormat()), provider.get(), - nullptr, true, kCGRenderingIntentDefault); + } - return imageRef; + const auto usableSize = jmin ((size_t) srcData.lineStride * (size_t) srcData.height, srcData.size); + CFUniquePtr data (CFDataCreate (nullptr, (const UInt8*) srcData.data, (CFIndex) usableSize)); + return detail::DataProviderPtr { CGDataProviderCreateWithCFData (data.get()) }; + }(); + + return CGImageCreate ((size_t) srcData.width, + (size_t) srcData.height, + 8, + (size_t) srcData.pixelStride * 8, + (size_t) srcData.lineStride, + colourSpace, getCGImageFlags (juceImage.getFormat()), provider.get(), + nullptr, true, kCGRenderingIntentDefault); } //============================================================================== @@ -512,7 +511,7 @@ auto colourSpace = sourceImage.getFormat() == Image::PixelFormat::SingleChannel ? greyColourSpace.get() : rgbColourSpace.get(); - auto image = detail::ImagePtr { CoreGraphicsPixelData::getCachedImageRef (sourceImage, colourSpace) }; + detail::ImagePtr image { CoreGraphicsPixelData::getCachedImageRef (sourceImage, colourSpace) }; ScopedCGContextState scopedState (context.get()); CGContextSetAlpha (context.get(), state->fillType.getOpacity()); diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h juce-7.0.0~ds0/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_mac_Fonts.mm juce-7.0.0~ds0/modules/juce_graphics/native/juce_mac_Fonts.mm --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_mac_Fonts.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_mac_Fonts.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -208,34 +208,75 @@ } //============================================================================== + // A flatmap that properly retains/releases font refs + class FontMap + { + public: + void emplace (CTFontRef ctFontRef, Font value) + { + pairs.emplace (std::lower_bound (pairs.begin(), pairs.end(), ctFontRef), ctFontRef, std::move (value)); + } + + const Font* find (CTFontRef ctFontRef) const + { + const auto iter = std::lower_bound (pairs.begin(), pairs.end(), ctFontRef); + + if (iter == pairs.end()) + return nullptr; + + if (iter->key.get() != ctFontRef) + return nullptr; + + return &iter->value; + } + + private: + struct Pair + { + Pair (CTFontRef ref, Font font) : key (ref), value (std::move (font)) { CFRetain (ref); } + + bool operator< (CTFontRef other) const { return key.get() < other; } + + CFUniquePtr key; + Font value; + }; + + std::vector pairs; + }; + struct AttributedStringAndFontMap { CFUniquePtr string; - std::map fontMap; + FontMap fontMap; }; static AttributedStringAndFontMap createCFAttributedString (const AttributedString& text) { - std::map fontMap; + FontMap fontMap; const detail::ColorSpacePtr rgbColourSpace { CGColorSpaceCreateWithName (kCGColorSpaceSRGB) }; auto attribString = CFAttributedStringCreateMutable (kCFAllocatorDefault, 0); CFUniquePtr cfText (text.getText().toCFString()); + CFAttributedStringReplaceString (attribString, CFRangeMake (0, 0), cfText.get()); - auto numCharacterAttributes = text.getNumAttributes(); - auto attribStringLen = CFAttributedStringGetLength (attribString); + const auto numCharacterAttributes = text.getNumAttributes(); + const auto attribStringLen = CFAttributedStringGetLength (attribString); + const auto beginPtr = text.getText().toUTF16(); + auto currentPosition = beginPtr; - for (int i = 0; i < numCharacterAttributes; ++i) + for (int i = 0; i < numCharacterAttributes; currentPosition += text.getAttribute (i).range.getLength(), ++i) { - auto& attr = text.getAttribute (i); - auto rangeStart = attr.range.getStart(); + const auto& attr = text.getAttribute (i); + const auto wordBegin = currentPosition.getAddress() - beginPtr.getAddress(); - if (rangeStart >= attribStringLen) + if (attribStringLen <= wordBegin) continue; - auto range = CFRangeMake (rangeStart, jmin (attr.range.getEnd(), (int) attribStringLen) - rangeStart); + const auto wordEndAddress = (currentPosition + attr.range.getLength()).getAddress(); + const auto wordEnd = jmin (attribStringLen, (CFIndex) (wordEndAddress - beginPtr.getAddress())); + const auto range = CFRangeMake (wordBegin, wordEnd - wordBegin); if (auto ctFontRef = getOrCreateFont (attr.font)) { @@ -300,7 +341,7 @@ struct FramesetterAndFontMap { CFUniquePtr framesetter; - std::map fontMap; + FontMap fontMap; }; static FramesetterAndFontMap createCTFramesetter (const AttributedString& text) @@ -324,7 +365,7 @@ struct FrameAndFontMap { CFUniquePtr frame; - std::map fontMap; + FontMap fontMap; }; static FrameAndFontMap createCTFrame (const AttributedString& text, CGRect bounds) @@ -476,10 +517,8 @@ { glyphRun->font = [&] { - auto it = frameAndMap.fontMap.find (ctRunFont); - - if (it != frameAndMap.fontMap.end()) - return it->second; + if (auto* it = frameAndMap.fontMap.find (ctRunFont)) + return *it; CFUniquePtr cfsFontName (CTFontCopyPostScriptName (ctRunFont)); CFUniquePtr ctFontRef (CTFontCreateWithName (cfsFontName.get(), referenceFontSize, nullptr)); diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_mac_IconHelpers.cpp juce-7.0.0~ds0/modules/juce_graphics/native/juce_mac_IconHelpers.cpp --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_mac_IconHelpers.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_mac_IconHelpers.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_RenderingHelpers.h juce-7.0.0~ds0/modules/juce_graphics/native/juce_RenderingHelpers.h --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_RenderingHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_RenderingHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp juce-7.0.0~ds0/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h juce-7.0.0~ds0/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp juce-7.0.0~ds0/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp juce-7.0.0~ds0/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -229,7 +229,7 @@ return dwFontMetrics.designUnitsPerEm / totalHeight; } - void setTextFormatProperties (const AttributedString& text, IDWriteTextFormat& format) + static void setTextFormatProperties (const AttributedString& text, IDWriteTextFormat& format) { DWRITE_TEXT_ALIGNMENT alignment = DWRITE_TEXT_ALIGNMENT_LEADING; DWRITE_WORD_WRAPPING wrapType = DWRITE_WORD_WRAPPING_WRAP; @@ -271,12 +271,22 @@ format.SetWordWrapping (wrapType); } - void addAttributedRange (const AttributedString::Attribute& attr, IDWriteTextLayout& textLayout, - const int textLen, ID2D1RenderTarget& renderTarget, IDWriteFontCollection& fontCollection) + static void addAttributedRange (const AttributedString::Attribute& attr, + IDWriteTextLayout& textLayout, + CharPointer_UTF16 begin, + CharPointer_UTF16 textPointer, + const UINT32 textLen, + ID2D1RenderTarget& renderTarget, + IDWriteFontCollection& fontCollection) { DWRITE_TEXT_RANGE range; - range.startPosition = (UINT32) attr.range.getStart(); - range.length = (UINT32) jmin (attr.range.getLength(), textLen - attr.range.getStart()); + range.startPosition = (UINT32) (textPointer.getAddress() - begin.getAddress()); + + if (textLen <= range.startPosition) + return; + + const auto wordEnd = jmin (textLen, (UINT32) ((textPointer + attr.range.getLength()).getAddress() - begin.getAddress())); + range.length = wordEnd - range.startPosition; { auto familyName = FontStyleHelpers::getConcreteFamilyName (attr.font); @@ -327,9 +337,13 @@ } } - bool setupLayout (const AttributedString& text, float maxWidth, float maxHeight, - ID2D1RenderTarget& renderTarget, IDWriteFactory& directWriteFactory, - IDWriteFontCollection& fontCollection, ComSmartPtr& textLayout) + static bool setupLayout (const AttributedString& text, + float maxWidth, + float maxHeight, + ID2D1RenderTarget& renderTarget, + IDWriteFactory& directWriteFactory, + IDWriteFontCollection& fontCollection, + ComSmartPtr& textLayout) { // To add color to text, we need to create a D2D render target // Since we are not actually rendering to a D2D context we create a temporary GDI render target @@ -367,26 +381,37 @@ hr = dwTextFormat->SetTrimming (&trimming, trimmingSign); } - auto textLen = text.getText().length(); + const auto beginPtr = text.getText().toUTF16(); + const auto textLen = (UINT32) (beginPtr.findTerminatingNull().getAddress() - beginPtr.getAddress()); - hr = directWriteFactory.CreateTextLayout (text.getText().toWideCharPointer(), (UINT32) textLen, dwTextFormat, - maxWidth, maxHeight, textLayout.resetAndGetPointerAddress()); + hr = directWriteFactory.CreateTextLayout (beginPtr.getAddress(), + textLen, + dwTextFormat, + maxWidth, + maxHeight, + textLayout.resetAndGetPointerAddress()); if (FAILED (hr) || textLayout == nullptr) return false; - auto numAttributes = text.getNumAttributes(); + const auto numAttributes = text.getNumAttributes(); + auto rangePointer = beginPtr; for (int i = 0; i < numAttributes; ++i) - addAttributedRange (text.getAttribute (i), *textLayout, textLen, renderTarget, fontCollection); + { + const auto attribute = text.getAttribute (i); + addAttributedRange (attribute, *textLayout, beginPtr, rangePointer, textLen, renderTarget, fontCollection); + rangePointer += attribute.range.getLength(); + } return true; } - void createLayout (TextLayout& layout, const AttributedString& text, - IDWriteFactory& directWriteFactory, - IDWriteFontCollection& fontCollection, - ID2D1DCRenderTarget& renderTarget) + static void createLayout (TextLayout& layout, + const AttributedString& text, + IDWriteFactory& directWriteFactory, + IDWriteFontCollection& fontCollection, + ID2D1DCRenderTarget& renderTarget) { ComSmartPtr dwTextLayout; @@ -422,8 +447,11 @@ } } - void drawToD2DContext (const AttributedString& text, const Rectangle& area, ID2D1RenderTarget& renderTarget, - IDWriteFactory& directWriteFactory, IDWriteFontCollection& fontCollection) + static inline void drawToD2DContext (const AttributedString& text, + const Rectangle& area, + ID2D1RenderTarget& renderTarget, + IDWriteFactory& directWriteFactory, + IDWriteFontCollection& fontCollection) { ComSmartPtr dwTextLayout; diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_win32_Fonts.cpp juce-7.0.0~ds0/modules/juce_graphics/native/juce_win32_Fonts.cpp --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_win32_Fonts.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_win32_Fonts.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/native/juce_win32_IconHelpers.cpp juce-7.0.0~ds0/modules/juce_graphics/native/juce_win32_IconHelpers.cpp --- juce-6.1.5~ds0/modules/juce_graphics/native/juce_win32_IconHelpers.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/native/juce_win32_IconHelpers.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -25,5 +25,6 @@ namespace juce { + Image JUCE_API getIconFromApplication (const String&, int); Image JUCE_API getIconFromApplication (const String&, int) { return {}; } } diff -Nru juce-6.1.5~ds0/modules/juce_graphics/placement/juce_Justification.h juce-7.0.0~ds0/modules/juce_graphics/placement/juce_Justification.h --- juce-6.1.5~ds0/modules/juce_graphics/placement/juce_Justification.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/placement/juce_Justification.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/placement/juce_RectanglePlacement.cpp juce-7.0.0~ds0/modules/juce_graphics/placement/juce_RectanglePlacement.cpp --- juce-6.1.5~ds0/modules/juce_graphics/placement/juce_RectanglePlacement.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/placement/juce_RectanglePlacement.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_graphics/placement/juce_RectanglePlacement.h juce-7.0.0~ds0/modules/juce_graphics/placement/juce_RectanglePlacement.h --- juce-6.1.5~ds0/modules/juce_graphics/placement/juce_RectanglePlacement.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_graphics/placement/juce_RectanglePlacement.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h --- juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h --- juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h --- juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h --- juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h --- juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -66,6 +66,9 @@ /** Returns a section of text. */ virtual String getText (Range range) const = 0; + /** Returns the full text. */ + String getAllText() const { return getText ({ 0, getTotalNumCharacters() }); } + /** Replaces the text with a new string. */ virtual void setText (const String& newText) = 0; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h --- juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -63,7 +63,6 @@ interfaces (std::move (interfacesIn)), nativeImpl (createNativeImpl (*this)) { - notifyAccessibilityEventInternal (*this, InternalAccessibilityEvent::elementCreated); } AccessibilityHandler::~AccessibilityHandler() diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h --- juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/juce_AccessibilityState.h juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/juce_AccessibilityState.h --- juce-6.1.5~ds0/modules/juce_gui_basics/accessibility/juce_AccessibilityState.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/accessibility/juce_AccessibilityState.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -50,73 +50,73 @@ @see isCheckable */ - AccessibleState withCheckable() const noexcept { return withFlag (Flags::checkable); } + JUCE_NODISCARD AccessibleState withCheckable() const noexcept { return withFlag (Flags::checkable); } /** Sets the checked flag and returns the new state. @see isChecked */ - AccessibleState withChecked() const noexcept { return withFlag (Flags::checked); } + JUCE_NODISCARD AccessibleState withChecked() const noexcept { return withFlag (Flags::checked); } /** Sets the collapsed flag and returns the new state. @see isCollapsed */ - AccessibleState withCollapsed() const noexcept { return withFlag (Flags::collapsed); } + JUCE_NODISCARD AccessibleState withCollapsed() const noexcept { return withFlag (Flags::collapsed); } /** Sets the expandable flag and returns the new state. @see isExpandable */ - AccessibleState withExpandable() const noexcept { return withFlag (Flags::expandable); } + JUCE_NODISCARD AccessibleState withExpandable() const noexcept { return withFlag (Flags::expandable); } /** Sets the expanded flag and returns the new state. @see isExpanded */ - AccessibleState withExpanded() const noexcept { return withFlag (Flags::expanded); } + JUCE_NODISCARD AccessibleState withExpanded() const noexcept { return withFlag (Flags::expanded); } /** Sets the focusable flag and returns the new state. @see isFocusable */ - AccessibleState withFocusable() const noexcept { return withFlag (Flags::focusable); } + JUCE_NODISCARD AccessibleState withFocusable() const noexcept { return withFlag (Flags::focusable); } /** Sets the focused flag and returns the new state. @see isFocused */ - AccessibleState withFocused() const noexcept { return withFlag (Flags::focused); } + JUCE_NODISCARD AccessibleState withFocused() const noexcept { return withFlag (Flags::focused); } /** Sets the ignored flag and returns the new state. @see isIgnored */ - AccessibleState withIgnored() const noexcept { return withFlag (Flags::ignored); } + JUCE_NODISCARD AccessibleState withIgnored() const noexcept { return withFlag (Flags::ignored); } /** Sets the selectable flag and returns the new state. @see isSelectable */ - AccessibleState withSelectable() const noexcept { return withFlag (Flags::selectable); } + JUCE_NODISCARD AccessibleState withSelectable() const noexcept { return withFlag (Flags::selectable); } /** Sets the multiSelectable flag and returns the new state. @see isMultiSelectable */ - AccessibleState withMultiSelectable() const noexcept { return withFlag (Flags::multiSelectable); } + JUCE_NODISCARD AccessibleState withMultiSelectable() const noexcept { return withFlag (Flags::multiSelectable); } /** Sets the selected flag and returns the new state. @see isSelected */ - AccessibleState withSelected() const noexcept { return withFlag (Flags::selected); } + JUCE_NODISCARD AccessibleState withSelected() const noexcept { return withFlag (Flags::selected); } /** Sets the accessible offscreen flag and returns the new state. @see isSelected */ - AccessibleState withAccessibleOffscreen() const noexcept { return withFlag (Flags::accessibleOffscreen); } + JUCE_NODISCARD AccessibleState withAccessibleOffscreen() const noexcept { return withFlag (Flags::accessibleOffscreen); } //============================================================================== /** Returns true if the UI element is checkable. @@ -208,7 +208,7 @@ accessibleOffscreen = (1 << 11) }; - AccessibleState withFlag (int flag) const noexcept + JUCE_NODISCARD AccessibleState withFlag (int flag) const noexcept { auto copy = *this; copy.flags |= flag; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/application/juce_Application.cpp juce-7.0.0~ds0/modules/juce_gui_basics/application/juce_Application.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/application/juce_Application.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/application/juce_Application.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/application/juce_Application.h juce-7.0.0~ds0/modules/juce_gui_basics/application/juce_Application.h --- juce-6.1.5~ds0/modules/juce_gui_basics/application/juce_Application.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/application/juce_Application.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ArrowButton.h juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ArrowButton.h --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ArrowButton.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ArrowButton.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_Button.cpp juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_Button.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_Button.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_Button.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_Button.h juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_Button.h --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_Button.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_Button.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_DrawableButton.h juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_DrawableButton.h --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_DrawableButton.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_DrawableButton.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ImageButton.cpp juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ImageButton.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ImageButton.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ImageButton.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ImageButton.h juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ImageButton.h --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ImageButton.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ImageButton.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ShapeButton.h juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ShapeButton.h --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ShapeButton.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ShapeButton.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_TextButton.cpp juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_TextButton.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_TextButton.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_TextButton.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_TextButton.h juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_TextButton.h --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_TextButton.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_TextButton.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ToggleButton.h juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ToggleButton.h --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ToggleButton.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ToggleButton.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ToolbarButton.h juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ToolbarButton.h --- juce-6.1.5~ds0/modules/juce_gui_basics/buttons/juce_ToolbarButton.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/buttons/juce_ToolbarButton.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h --- juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h --- juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h --- juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h --- juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h --- juce-6.1.5~ds0/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_CachedComponentImage.h juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_CachedComponentImage.h --- juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_CachedComponentImage.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_CachedComponentImage.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_Component.cpp juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_Component.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_Component.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_Component.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,17 @@ namespace juce { +static Component* findFirstEnabledAncestor (Component* in) +{ + if (in == nullptr) + return nullptr; + + if (in->isEnabled()) + return in; + + return findFirstEnabledAncestor (in->getParentComponent()); +} + Component* Component::currentlyFocusedComponent = nullptr; @@ -264,6 +275,18 @@ static Rectangle subtractPosition (Rectangle p, const Component& c) noexcept { return p - c.getPosition(); } static Point subtractPosition (Point p, const Component& c) noexcept { return p - c.getPosition().toFloat(); } static Rectangle subtractPosition (Rectangle p, const Component& c) noexcept { return p - c.getPosition().toFloat(); } + + static Point screenPosToLocalPos (Component& comp, Point pos) + { + if (auto* peer = comp.getPeer()) + { + pos = peer->globalToLocal (pos); + auto& peerComp = peer->getComponent(); + return comp.getLocalPoint (&peerComp, unscaledScreenPosToScaled (peerComp, pos)); + } + + return comp.getLocalPoint (nullptr, unscaledScreenPosToScaled (comp, pos)); + } }; static const char colourPropertyPrefix[] = "jcclr_"; @@ -304,7 +327,7 @@ static bool hitTest (Component& comp, Point localPoint) { const auto intPoint = localPoint.roundToInt(); - return Rectangle { comp.getWidth(), comp.getHeight() }.toFloat().contains (localPoint) + return Rectangle { comp.getWidth(), comp.getHeight() }.contains (intPoint) && comp.hitTest (intPoint.x, intPoint.y); } @@ -486,7 +509,7 @@ for (auto& ms : Desktop::getInstance().getMouseSources()) if (auto* c = ms.getComponentUnderMouse()) if (modalWouldBlockComponent (*c, &modal)) - (c->*function) (ms, ms.getScreenPosition(), Time::getCurrentTime()); + (c->*function) (ms, ScalingHelpers::screenPosToLocalPos (*c, ms.getScreenPosition()), Time::getCurrentTime()); } }; @@ -729,6 +752,16 @@ peer->setConstrainer (currentConstrainer); repaint(); + + #if JUCE_LINUX + // Creating the peer Image on Linux will change the reported position of the window. If + // the Image creation is interleaved with the coming configureNotifyEvents the window + // will appear in the wrong position. To avoid this, we force the Image creation here, + // before handling any of the configureNotifyEvents. The Linux implementation of + // performAnyPendingRepaintsNow() will force update the peer position if necessary. + peer->performAnyPendingRepaintsNow(); + #endif + internalHierarchyChanged(); if (auto* handler = getAccessibilityHandler()) @@ -1347,7 +1380,7 @@ return affineTransform != nullptr ? *affineTransform : AffineTransform(); } -float Component::getApproximateScaleFactorForComponent (Component* targetComponent) +float Component::getApproximateScaleFactorForComponent (const Component* targetComponent) { AffineTransform transform; @@ -1974,7 +2007,7 @@ { auto clipBounds = g.getClipBounds(); - if (flags.dontClipGraphicsFlag) + if (flags.dontClipGraphicsFlag && getNumChildComponents() == 0) { paint (g); } @@ -2269,16 +2302,16 @@ void Component::mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& wheel) { - // the base class just passes this event up to its parent.. - if (parentComponent != nullptr && parentComponent->isEnabled()) - parentComponent->mouseWheelMove (e.getEventRelativeTo (parentComponent), wheel); + // the base class just passes this event up to the nearest enabled ancestor + if (auto* enabledComponent = findFirstEnabledAncestor (getParentComponent())) + enabledComponent->mouseWheelMove (e.getEventRelativeTo (enabledComponent), wheel); } void Component::mouseMagnify (const MouseEvent& e, float magnifyAmount) { - // the base class just passes this event up to its parent.. - if (parentComponent != nullptr && parentComponent->isEnabled()) - parentComponent->mouseMagnify (e.getEventRelativeTo (parentComponent), magnifyAmount); + // the base class just passes this event up to the nearest enabled ancestor + if (auto* enabledComponent = findFirstEnabledAncestor (getParentComponent())) + enabledComponent->mouseMagnify (e.getEventRelativeTo (enabledComponent), magnifyAmount); } //============================================================================== @@ -2382,10 +2415,16 @@ BailOutChecker checker (this); - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, - this, this, time, relativePos, time, 0, false); + const auto me = makeMouseEvent (source, + PointerState().withPosition (relativePos), + source.getCurrentModifiers(), + this, + this, + time, + relativePos, + time, + 0, + false); mouseEnter (me); flags.cachedMouseInsideComponent = true; @@ -2414,10 +2453,16 @@ BailOutChecker checker (this); - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, - this, this, time, relativePos, time, 0, false); + const auto me = makeMouseEvent (source, + PointerState().withPosition (relativePos), + source.getCurrentModifiers(), + this, + this, + time, + relativePos, + time, + 0, + false); mouseExit (me); @@ -2429,8 +2474,7 @@ MouseListenerList::template sendMouseEvent (*this, checker, &MouseListener::mouseExit, me); } -void Component::internalMouseDown (MouseInputSource source, Point relativePos, Time time, - float pressure, float orientation, float rotation, float tiltX, float tiltY) +void Component::internalMouseDown (MouseInputSource source, const PointerState& relativePointerState, Time time) { auto& desktop = Desktop::getInstance(); BailOutChecker checker (this); @@ -2448,9 +2492,16 @@ if (isCurrentlyBlockedByAnotherModalComponent()) { // allow blocked mouse-events to go to global listeners.. - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), pressure, - orientation, rotation, tiltX, tiltY, this, this, time, relativePos, - time, source.getNumberOfMultipleClicks(), false); + const auto me = makeMouseEvent (source, + relativePointerState, + source.getCurrentModifiers(), + this, + this, + time, + relativePointerState.position, + time, + source.getNumberOfMultipleClicks(), + false); desktop.getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseDown (me); }); return; @@ -2481,9 +2532,16 @@ if (flags.repaintOnMouseActivityFlag) repaint(); - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), pressure, - orientation, rotation, tiltX, tiltY, this, this, time, relativePos, - time, source.getNumberOfMultipleClicks(), false); + const auto me = makeMouseEvent (source, + relativePointerState, + source.getCurrentModifiers(), + this, + this, + time, + relativePointerState.position, + time, + source.getNumberOfMultipleClicks(), + false); mouseDown (me); if (checker.shouldBailOut()) @@ -2494,8 +2552,7 @@ MouseListenerList::template sendMouseEvent (*this, checker, &MouseListener::mouseDown, me); } -void Component::internalMouseUp (MouseInputSource source, Point relativePos, Time time, - const ModifierKeys oldModifiers, float pressure, float orientation, float rotation, float tiltX, float tiltY) +void Component::internalMouseUp (MouseInputSource source, const PointerState& relativePointerState, Time time, const ModifierKeys oldModifiers) { if (flags.mouseDownWasBlocked && isCurrentlyBlockedByAnotherModalComponent()) return; @@ -2505,12 +2562,16 @@ if (flags.repaintOnMouseActivityFlag) repaint(); - const MouseEvent me (source, relativePos, oldModifiers, pressure, orientation, - rotation, tiltX, tiltY, this, this, time, - getLocalPoint (nullptr, source.getLastMouseDownPosition()), - source.getLastMouseDownTime(), - source.getNumberOfMultipleClicks(), - source.isLongPressOrDrag()); + const auto me = makeMouseEvent (source, + relativePointerState, + oldModifiers, + this, + this, + time, + getLocalPoint (nullptr, source.getLastMouseDownPosition()), + source.getLastMouseDownTime(), + source.getNumberOfMultipleClicks(), + source.isLongPressOrDrag()); mouseUp (me); if (checker.shouldBailOut()) @@ -2537,19 +2598,22 @@ } } -void Component::internalMouseDrag (MouseInputSource source, Point relativePos, Time time, - float pressure, float orientation, float rotation, float tiltX, float tiltY) +void Component::internalMouseDrag (MouseInputSource source, const PointerState& relativePointerState, Time time) { if (! isCurrentlyBlockedByAnotherModalComponent()) { BailOutChecker checker (this); - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), - pressure, orientation, rotation, tiltX, tiltY, this, this, time, - getLocalPoint (nullptr, source.getLastMouseDownPosition()), - source.getLastMouseDownTime(), - source.getNumberOfMultipleClicks(), - source.isLongPressOrDrag()); + const auto me = makeMouseEvent (source, + relativePointerState, + source.getCurrentModifiers(), + this, + this, + time, + getLocalPoint (nullptr, source.getLastMouseDownPosition()), + source.getLastMouseDownTime(), + source.getNumberOfMultipleClicks(), + source.isLongPressOrDrag()); mouseDrag (me); if (checker.shouldBailOut()) @@ -2574,10 +2638,16 @@ { BailOutChecker checker (this); - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, - this, this, time, relativePos, time, 0, false); + const auto me = makeMouseEvent (source, + PointerState().withPosition (relativePos), + source.getCurrentModifiers(), + this, + this, + time, + relativePos, + time, + 0, + false); mouseMove (me); if (checker.shouldBailOut()) @@ -2595,10 +2665,16 @@ auto& desktop = Desktop::getInstance(); BailOutChecker checker (this); - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, - this, this, time, relativePos, time, 0, false); + const auto me = makeMouseEvent (source, + PointerState().withPosition (relativePos), + source.getCurrentModifiers(), + this, + this, + time, + relativePos, + time, + 0, + false); if (isCurrentlyBlockedByAnotherModalComponent()) { @@ -2625,10 +2701,16 @@ auto& desktop = Desktop::getInstance(); BailOutChecker checker (this); - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, - this, this, time, relativePos, time, 0, false); + const auto me = makeMouseEvent (source, + PointerState().withPosition (relativePos), + source.getCurrentModifiers(), + this, + this, + time, + relativePos, + time, + 0, + false); if (isCurrentlyBlockedByAnotherModalComponent()) { @@ -2861,6 +2943,11 @@ return; WeakReference componentLosingFocus (currentlyFocusedComponent); + + if (auto* losingFocus = componentLosingFocus.get()) + if (auto* otherPeer = losingFocus->getPeer()) + otherPeer->closeInputMethodContext(); + currentlyFocusedComponent = this; Desktop::getInstance().triggerFocusCallback(); @@ -2926,6 +3013,9 @@ { if (auto* componentLosingFocus = currentlyFocusedComponent) { + if (auto* otherPeer = componentLosingFocus->getPeer()) + otherPeer->closeInputMethodContext(); + currentlyFocusedComponent = nullptr; if (sendFocusLossEvent && componentLosingFocus != nullptr) @@ -3218,6 +3308,18 @@ || accessibilityHandler->getTypeIndex() != std::type_index (typeid (*this))) { accessibilityHandler = createAccessibilityHandler(); + + // On Android, notifying that an element was created can cause the system to request + // the accessibility node info for the new element. If we're not careful, this will lead + // to recursive calls, as each time an element is created, new node info will be requested, + // causing an element to be created, causing a new info request... + // By assigning the accessibility handler before notifying the system that an element was + // created, the if() predicate above should evaluate to false on recursive calls, + // terminating the recursion. + if (accessibilityHandler != nullptr) + notifyAccessibilityEventInternal (*accessibilityHandler, InternalAccessibilityEvent::elementCreated); + else + jassertfalse; // createAccessibilityHandler must return non-null } return accessibilityHandler.get(); diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_Component.h juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_Component.h --- juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_Component.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_Component.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -615,7 +615,7 @@ /** Returns the approximate scale factor for a given component by traversing its parent hierarchy and applying each transform and finally scaling this by the global scale factor. */ - static float JUCE_CALLTYPE getApproximateScaleFactorForComponent (Component* targetComponent); + static float JUCE_CALLTYPE getApproximateScaleFactorForComponent (const Component* targetComponent); //============================================================================== /** Returns a proportion of the component's width. @@ -1113,10 +1113,10 @@ number of simple components being rendered, and where they are guaranteed never to do any drawing beyond their own boundaries, setting this to true will reduce the overhead involved in clipping the graphics context that gets passed to the component's paint() callback. + If you enable this mode, you'll need to make sure your paint method doesn't call anything like Graphics::fillAll(), and doesn't draw beyond the component's bounds, because that'll produce - artifacts. Your component also can't have any child components that may be placed beyond its - bounds. + artifacts. This option will have no effect on components that contain any child components. */ void setPaintingIsUnclipped (bool shouldPaintWithoutClipping) noexcept; @@ -2594,9 +2594,9 @@ //============================================================================== void internalMouseEnter (MouseInputSource, Point, Time); void internalMouseExit (MouseInputSource, Point, Time); - void internalMouseDown (MouseInputSource, Point, Time, float, float, float, float, float); - void internalMouseUp (MouseInputSource, Point, Time, const ModifierKeys oldModifiers, float, float, float, float, float); - void internalMouseDrag (MouseInputSource, Point, Time, float, float, float, float, float); + void internalMouseDown (MouseInputSource, const PointerState&, Time); + void internalMouseUp (MouseInputSource, const PointerState&, Time, const ModifierKeys oldModifiers); + void internalMouseDrag (MouseInputSource, const PointerState&, Time); void internalMouseMove (MouseInputSource, Point, Time); void internalMouseWheel (MouseInputSource, Point, Time, const MouseWheelDetails&); void internalMagnifyGesture (MouseInputSource, Point, Time, float); diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_ComponentListener.cpp juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_ComponentListener.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_ComponentListener.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_ComponentListener.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_ComponentListener.h juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_ComponentListener.h --- juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_ComponentListener.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_ComponentListener.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_ComponentTraverser.h juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_ComponentTraverser.h --- juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_ComponentTraverser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_ComponentTraverser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_FocusTraverser.cpp juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_FocusTraverser.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_FocusTraverser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_FocusTraverser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_FocusTraverser.h juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_FocusTraverser.h --- juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_FocusTraverser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_FocusTraverser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_ModalComponentManager.h juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_ModalComponentManager.h --- juce-6.1.5~ds0/modules/juce_gui_basics/components/juce_ModalComponentManager.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/components/juce_ModalComponentManager.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/desktop/juce_Desktop.cpp juce-7.0.0~ds0/modules/juce_gui_basics/desktop/juce_Desktop.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/desktop/juce_Desktop.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/desktop/juce_Desktop.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -276,9 +276,9 @@ auto pos = target->getLocalPoint (nullptr, lastFakeMouseMove); auto now = Time::getCurrentTime(); - const MouseEvent me (getMainMouseSource(), pos, ModifierKeys::currentModifiers, MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, + const MouseEvent me (getMainMouseSource(), pos, ModifierKeys::currentModifiers, MouseInputSource::defaultPressure, + MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation, + MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY, target, target, now, pos, now, 0, false); if (me.mods.isAnyMouseButtonDown()) diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/desktop/juce_Desktop.h juce-7.0.0~ds0/modules/juce_gui_basics/desktop/juce_Desktop.h --- juce-6.1.5~ds0/modules/juce_gui_basics/desktop/juce_Desktop.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/desktop/juce_Desktop.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/desktop/juce_Displays.cpp juce-7.0.0~ds0/modules/juce_gui_basics/desktop/juce_Displays.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/desktop/juce_Displays.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/desktop/juce_Displays.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/desktop/juce_Displays.h juce-7.0.0~ds0/modules/juce_gui_basics/desktop/juce_Displays.h --- juce-6.1.5~ds0/modules/juce_gui_basics/desktop/juce_Displays.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/desktop/juce_Displays.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -166,8 +166,6 @@ #ifndef DOXYGEN /** @internal */ void refresh(); - /** @internal */ - ~Displays() = default; [[deprecated ("Use the getDisplayForPoint or getDisplayForRect methods instead " "as they can deal with converting between logical and physical pixels.")]] diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableComposite.h juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableComposite.h --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableComposite.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableComposite.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_Drawable.cpp juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_Drawable.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_Drawable.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_Drawable.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_Drawable.h juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_Drawable.h --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_Drawable.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_Drawable.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableImage.h juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableImage.h --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableImage.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableImage.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawablePath.h juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawablePath.h --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawablePath.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawablePath.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableShape.h juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableShape.h --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableShape.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableShape.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableText.cpp juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableText.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableText.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableText.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableText.h juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableText.h --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_DrawableText.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_DrawableText.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_SVGParser.cpp juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_SVGParser.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/drawables/juce_SVGParser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/drawables/juce_SVGParser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -1748,6 +1748,7 @@ deltaAngle = fmod (deltaAngle, MathConstants::twoPi); } + SVGState (const SVGState&) = default; SVGState& operator= (const SVGState&) = delete; }; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_ContentSharer.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_ContentSharer.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_ContentSharer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_ContentSharer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -66,10 +66,10 @@ auto newFlags = fileTypeFlags; - if (includeDirectories) newFlags |= File::findDirectories; + if (includeDirectories) newFlags |= File::findDirectories; else newFlags &= ~File::findDirectories; - if (includeFiles) newFlags |= File::findFiles; + if (includeFiles) newFlags |= File::findFiles; else newFlags &= ~File::findFiles; setTypeFlags (newFlags); @@ -88,7 +88,7 @@ { shouldStop = true; thread.removeTimeSliceClient (this); - fileFindHandle = nullptr; + isSearching = false; } void DirectoryContentsList::clear() @@ -112,6 +112,7 @@ { fileFindHandle = std::make_unique (root, false, "*", fileTypeFlags); shouldStop = false; + isSearching = true; thread.addTimeSliceClient (this); } } @@ -165,7 +166,7 @@ bool DirectoryContentsList::isStillLoading() const { - return fileFindHandle != nullptr; + return isSearching; } void DirectoryContentsList::changed() @@ -221,6 +222,7 @@ } fileFindHandle = nullptr; + isSearching = false; if (! wasEmpty && files.isEmpty()) hasChanged = true; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -208,7 +208,7 @@ OwnedArray files; std::unique_ptr fileFindHandle; - std::atomic shouldStop { true }; + std::atomic shouldStop { true }, isSearching { false }; bool wasEmpty = true; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,7 +27,8 @@ { //============================================================================== -class FileChooser::NonNative : public FileChooser::Pimpl +class FileChooser::NonNative : public std::enable_shared_from_this, + public FileChooser::Pimpl { public: NonNative (FileChooser& fileChooser, int flags, FilePreviewComponent* preview) @@ -50,7 +51,15 @@ void launch() override { dialogBox.centreWithDefaultSize (nullptr); - dialogBox.enterModalState (true, ModalCallbackFunction::create ([this] (int r) { modalStateFinished (r); }), true); + + const std::weak_ptr ref (shared_from_this()); + auto* callback = ModalCallbackFunction::create ([ref] (int r) + { + if (auto locked = ref.lock()) + locked->modalStateFinished (r); + }); + + dialogBox.enterModalState (true, callback, true); } void runModally() override diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooser.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooser.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileChooser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/juce_gui_basics.cpp juce-7.0.0~ds0/modules/juce_gui_basics/juce_gui_basics.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/juce_gui_basics.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/juce_gui_basics.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -45,20 +45,20 @@ #include "juce_gui_basics.h" +#include + //============================================================================== #if JUCE_MAC #import #import - - #if JUCE_SUPPORT_CARBON - #import // still needed for SetSystemUIMode() - #endif + #import #elif JUCE_IOS #if JUCE_PUSH_NOTIFICATIONS && defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 #import #endif + #import #import //============================================================================== @@ -69,6 +69,7 @@ #include #include #include + #include #if JUCE_WEB_BROWSER #include @@ -81,6 +82,7 @@ #pragma comment(lib, "vfw32.lib") #pragma comment(lib, "imm32.lib") #pragma comment(lib, "comctl32.lib") + #pragma comment(lib, "dxgi.lib") #if JUCE_OPENGL #pragma comment(lib, "OpenGL32.Lib") @@ -127,6 +129,8 @@ }; } // namespace juce +#include "mouse/juce_PointerState.h" + #include "accessibility/juce_AccessibilityHandler.cpp" #include "components/juce_Component.cpp" #include "components/juce_ComponentListener.cpp" @@ -255,33 +259,10 @@ #include "native/juce_MultiTouchMapper.h" #endif -#if JUCE_ANDROID || JUCE_WINDOWS +#if JUCE_ANDROID || JUCE_WINDOWS || JUCE_UNIT_TESTS #include "native/accessibility/juce_AccessibilityTextHelpers.h" #endif -namespace juce -{ - -static const juce::Identifier disableAsyncLayerBackedViewIdentifier { "disableAsyncLayerBackedView" }; - -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") - -/** Used by the macOS and iOS peers. */ -void setComponentAsyncLayerBackedViewDisabled (juce::Component& comp, bool shouldDisableAsyncLayerBackedView) -{ - comp.getProperties().set (disableAsyncLayerBackedViewIdentifier, shouldDisableAsyncLayerBackedView); -} - -/** Used by the macOS and iOS peers. */ -bool getComponentAsyncLayerBackedViewDisabled (juce::Component& comp) -{ - return comp.getProperties()[disableAsyncLayerBackedViewIdentifier]; -} - -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - -} // namespace juce - #if JUCE_MAC || JUCE_IOS #include "native/accessibility/juce_mac_AccessibilitySharedCode.mm" @@ -331,9 +312,9 @@ #include "native/juce_linux_FileChooser.cpp" #elif JUCE_ANDROID + #include "juce_core/files/juce_common_MimeTypes.h" #include "native/accessibility/juce_android_Accessibility.cpp" #include "native/juce_android_Windowing.cpp" - #include "native/juce_common_MimeTypes.cpp" #include "native/juce_android_FileChooser.cpp" #if JUCE_CONTENT_SHARING @@ -428,3 +409,7 @@ // Depends on types defined in platform-specific windowing files #include "mouse/juce_MouseCursor.cpp" + +#if JUCE_UNIT_TESTS +#include "native/accessibility/juce_AccessibilityTextHelpers_test.cpp" +#endif diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/juce_gui_basics.h juce-7.0.0~ds0/modules/juce_gui_basics/juce_gui_basics.h --- juce-6.1.5~ds0/modules/juce_gui_basics/juce_gui_basics.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/juce_gui_basics.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_gui_basics vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE GUI core classes description: Basic user-interface components and related classes. website: http://www.juce.com/juce @@ -43,8 +43,11 @@ minimumCppStandard: 14 dependencies: juce_graphics juce_data_structures - OSXFrameworks: Cocoa Carbon QuartzCore - iOSFrameworks: UIKit CoreServices + OSXFrameworks: Cocoa QuartzCore + WeakOSXFrameworks: Metal MetalKit + iOSFrameworks: CoreServices UIKit + WeakiOSFrameworks: Metal MetalKit + mingwLibs: dxgi END_JUCE_MODULE_DECLARATION @@ -158,6 +161,7 @@ class Displays; class AccessibilityHandler; class KeyboardFocusTraverser; + class PointerState; class FlexBox; class Grid; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/juce_gui_basics.mm juce-7.0.0~ds0/modules/juce_gui_basics/juce_gui_basics.mm --- juce-6.1.5~ds0/modules/juce_gui_basics/juce_gui_basics.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/juce_gui_basics.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_CaretComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_CaretComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_CaretComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_CaretComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_KeyListener.h juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_KeyListener.h --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_KeyListener.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_KeyListener.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_KeyPress.h juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_KeyPress.h --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_KeyPress.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_KeyPress.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -163,23 +163,23 @@ //============================================================================== /** Returns a copy of only the mouse-button flags */ - ModifierKeys withOnlyMouseButtons() const noexcept { return ModifierKeys (flags & allMouseButtonModifiers); } + JUCE_NODISCARD ModifierKeys withOnlyMouseButtons() const noexcept { return ModifierKeys (flags & allMouseButtonModifiers); } /** Returns a copy of only the non-mouse flags */ - ModifierKeys withoutMouseButtons() const noexcept { return ModifierKeys (flags & ~allMouseButtonModifiers); } + JUCE_NODISCARD ModifierKeys withoutMouseButtons() const noexcept { return ModifierKeys (flags & ~allMouseButtonModifiers); } - bool operator== (const ModifierKeys other) const noexcept { return flags == other.flags; } - bool operator!= (const ModifierKeys other) const noexcept { return flags != other.flags; } + bool operator== (const ModifierKeys other) const noexcept { return flags == other.flags; } + bool operator!= (const ModifierKeys other) const noexcept { return flags != other.flags; } //============================================================================== /** Returns the raw flags for direct testing. */ - inline int getRawFlags() const noexcept { return flags; } + inline int getRawFlags() const noexcept { return flags; } - ModifierKeys withoutFlags (int rawFlagsToClear) const noexcept { return ModifierKeys (flags & ~rawFlagsToClear); } - ModifierKeys withFlags (int rawFlagsToSet) const noexcept { return ModifierKeys (flags | rawFlagsToSet); } + JUCE_NODISCARD ModifierKeys withoutFlags (int rawFlagsToClear) const noexcept { return ModifierKeys (flags & ~rawFlagsToClear); } + JUCE_NODISCARD ModifierKeys withFlags (int rawFlagsToSet) const noexcept { return ModifierKeys (flags | rawFlagsToSet); } /** Tests a combination of flags and returns true if any of them are set. */ - bool testFlags (int flagsToTest) const noexcept { return (flags & flagsToTest) != 0; } + bool testFlags (int flagsToTest) const noexcept { return (flags & flagsToTest) != 0; } /** Returns the total number of mouse buttons that are down. */ int getNumMouseButtonsDown() const noexcept; @@ -194,7 +194,7 @@ This method is here for backwards compatibility and there's no need to call it anymore, you should use the public currentModifiers member directly. */ - static ModifierKeys getCurrentModifiers() noexcept { return currentModifiers; } + static ModifierKeys getCurrentModifiers() noexcept { return currentModifiers; } /** Creates a ModifierKeys object to represent the current state of the keyboard and mouse buttons. diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h --- juce-6.1.5~ds0/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_AnimatedPosition.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_AnimatedPosition.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_AnimatedPosition.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_AnimatedPosition.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentAnimator.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentAnimator.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentAnimator.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentAnimator.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -104,22 +104,31 @@ { jassert (component != nullptr); - Rectangle limits, bounds (targetBounds); - BorderSize border; + auto bounds = targetBounds; - if (auto* parent = component->getParentComponent()) + auto limits = [&]() -> Rectangle { - limits.setSize (parent->getWidth(), parent->getHeight()); - } - else - { - if (auto* peer = component->getPeer()) - border = peer->getFrameSize(); + if (auto* parent = component->getParentComponent()) + return { parent->getWidth(), parent->getHeight() }; + + const auto globalBounds = component->localAreaToGlobal (targetBounds - component->getPosition()); + + if (auto* display = Desktop::getInstance().getDisplays().getDisplayForPoint (globalBounds.getCentre())) + return component->getLocalArea (nullptr, display->userArea) + component->getPosition(); - auto screenBounds = Desktop::getInstance().getDisplays().getDisplayForPoint (targetBounds.getCentre())->userArea; + const auto max = std::numeric_limits::max(); + return { max, max }; + }(); + + auto border = [&]() -> BorderSize + { + if (component->getParentComponent() == nullptr) + if (auto* peer = component->getPeer()) + if (const auto frameSize = peer->getFrameSizeIfPresent()) + return *frameSize; - limits = component->getLocalArea (nullptr, screenBounds) + component->getPosition(); - } + return {}; + }(); border.addTo (bounds); diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentBuilder.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentBuilder.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentBuilder.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentBuilder.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_FlexBox.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_FlexBox.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_FlexBox.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_FlexBox.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -738,9 +738,6 @@ }; //============================================================================== -FlexBox::FlexBox() noexcept = default; -FlexBox::~FlexBox() noexcept = default; - FlexBox::FlexBox (JustifyContent jc) noexcept : justifyContent (jc) {} FlexBox::FlexBox (Direction d, Wrap w, AlignContent ac, AlignItems ai, JustifyContent jc) noexcept diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_FlexBox.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_FlexBox.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_FlexBox.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_FlexBox.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -91,7 +91,7 @@ //============================================================================== /** Creates an empty FlexBox container with default parameters. */ - FlexBox() noexcept; + FlexBox() noexcept = default; /** Creates an empty FlexBox container with these parameters. */ FlexBox (Direction, Wrap, AlignContent, AlignItems, JustifyContent) noexcept; @@ -99,9 +99,6 @@ /** Creates an empty FlexBox container with the given content-justification mode. */ FlexBox (JustifyContent) noexcept; - /** Destructor. */ - ~FlexBox() noexcept; - //============================================================================== /** Lays-out the box's items within the given rectangle. */ void performLayout (Rectangle targetArea); diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_FlexItem.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_FlexItem.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_FlexItem.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_FlexItem.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_Grid.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_Grid.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_Grid.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_Grid.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_Grid.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_Grid.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_Grid.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_Grid.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_GridItem.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_GridItem.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_GridItem.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_GridItem.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -68,9 +68,7 @@ GridItem::Margin::Margin (float t, float r, float b, float l) noexcept : left (l), right (r), top (t), bottom (b) {} //============================================================================== -GridItem::GridItem() noexcept {} -GridItem::~GridItem() noexcept {} - +GridItem::GridItem() noexcept = default; GridItem::GridItem (Component& componentToUse) noexcept : associatedComponent (&componentToUse) {} GridItem::GridItem (Component* componentToUse) noexcept : associatedComponent (componentToUse) {} diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_GridItem.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_GridItem.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_GridItem.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_GridItem.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -128,9 +128,6 @@ /** Creates an item with a given Component to use. */ GridItem (Component* componentToUse) noexcept; - /** Destructor. */ - ~GridItem() noexcept; - //============================================================================== /** If this is non-null, it represents a Component whose bounds are controlled by this item. */ Component* associatedComponent = nullptr; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_GroupComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_GroupComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_GroupComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_GroupComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_GroupComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_GroupComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_GroupComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_GroupComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ScrollBar.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ScrollBar.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ScrollBar.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ScrollBar.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ScrollBar.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ScrollBar.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_ScrollBar.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_ScrollBar.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_SidePanel.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_SidePanel.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_SidePanel.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_SidePanel.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_SidePanel.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_SidePanel.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_SidePanel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_SidePanel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_TabbedComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_TabbedComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_TabbedComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_TabbedComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_Viewport.cpp juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_Viewport.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_Viewport.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_Viewport.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,7 +26,132 @@ namespace juce { -Viewport::Viewport (const String& name) : Component (name) +static bool viewportWouldScrollOnEvent (const Viewport* vp, const MouseInputSource& src) noexcept +{ + if (vp != nullptr) + { + switch (vp->getScrollOnDragMode()) + { + case Viewport::ScrollOnDragMode::all: return true; + case Viewport::ScrollOnDragMode::nonHover: return ! src.canHover(); + case Viewport::ScrollOnDragMode::never: return false; + } + } + + return false; +} + +using ViewportDragPosition = AnimatedPosition; + +struct Viewport::DragToScrollListener : private MouseListener, + private ViewportDragPosition::Listener +{ + DragToScrollListener (Viewport& v) : viewport (v) + { + viewport.contentHolder.addMouseListener (this, true); + offsetX.addListener (this); + offsetY.addListener (this); + offsetX.behaviour.setMinimumVelocity (60); + offsetY.behaviour.setMinimumVelocity (60); + } + + ~DragToScrollListener() override + { + viewport.contentHolder.removeMouseListener (this); + Desktop::getInstance().removeGlobalMouseListener (this); + } + + void positionChanged (ViewportDragPosition&, double) override + { + viewport.setViewPosition (originalViewPos - Point ((int) offsetX.getPosition(), + (int) offsetY.getPosition())); + } + + void mouseDown (const MouseEvent& e) override + { + if (! isGlobalMouseListener && viewportWouldScrollOnEvent (&viewport, e.source)) + { + offsetX.setPosition (offsetX.getPosition()); + offsetY.setPosition (offsetY.getPosition()); + + // switch to a global mouse listener so we still receive mouseUp events + // if the original event component is deleted + viewport.contentHolder.removeMouseListener (this); + Desktop::getInstance().addGlobalMouseListener (this); + + isGlobalMouseListener = true; + + scrollSource = e.source; + } + } + + void mouseDrag (const MouseEvent& e) override + { + if (e.source == scrollSource + && ! doesMouseEventComponentBlockViewportDrag (e.eventComponent)) + { + auto totalOffset = e.getEventRelativeTo (&viewport).getOffsetFromDragStart().toFloat(); + + if (! isDragging && totalOffset.getDistanceFromOrigin() > 8.0f && viewportWouldScrollOnEvent (&viewport, e.source)) + { + isDragging = true; + + originalViewPos = viewport.getViewPosition(); + offsetX.setPosition (0.0); + offsetX.beginDrag(); + offsetY.setPosition (0.0); + offsetY.beginDrag(); + } + + if (isDragging) + { + offsetX.drag (totalOffset.x); + offsetY.drag (totalOffset.y); + } + } + } + + void mouseUp (const MouseEvent& e) override + { + if (isGlobalMouseListener && e.source == scrollSource) + endDragAndClearGlobalMouseListener(); + } + + void endDragAndClearGlobalMouseListener() + { + offsetX.endDrag(); + offsetY.endDrag(); + isDragging = false; + + viewport.contentHolder.addMouseListener (this, true); + Desktop::getInstance().removeGlobalMouseListener (this); + + isGlobalMouseListener = false; + } + + bool doesMouseEventComponentBlockViewportDrag (const Component* eventComp) + { + for (auto c = eventComp; c != nullptr && c != &viewport; c = c->getParentComponent()) + if (c->getViewportIgnoreDragFlag()) + return true; + + return false; + } + + Viewport& viewport; + ViewportDragPosition offsetX, offsetY; + Point originalViewPos; + MouseInputSource scrollSource = Desktop::getInstance().getMainMouseSource(); + bool isDragging = false; + bool isGlobalMouseListener = false; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DragToScrollListener) +}; + +//============================================================================== +Viewport::Viewport (const String& name) + : Component (name), + dragToScrollListener (std::make_unique (*this)) { // content holder is used to clip the contents so they don't overlap the scrollbars addAndMakeVisible (contentHolder); @@ -36,14 +161,12 @@ setInterceptsMouseClicks (false, true); setWantsKeyboardFocus (true); - setScrollOnDragEnabled (Desktop::getInstance().getMainMouseSource().isTouch()); recreateScrollbars(); } Viewport::~Viewport() { - setScrollOnDragEnabled (false); deleteOrRemoveContentComp(); } @@ -196,132 +319,14 @@ } //============================================================================== -typedef AnimatedPosition ViewportDragPosition; - -struct Viewport::DragToScrollListener : private MouseListener, - private ViewportDragPosition::Listener -{ - DragToScrollListener (Viewport& v) : viewport (v) - { - viewport.contentHolder.addMouseListener (this, true); - offsetX.addListener (this); - offsetY.addListener (this); - offsetX.behaviour.setMinimumVelocity (60); - offsetY.behaviour.setMinimumVelocity (60); - } - - ~DragToScrollListener() override - { - viewport.contentHolder.removeMouseListener (this); - Desktop::getInstance().removeGlobalMouseListener (this); - } - - void positionChanged (ViewportDragPosition&, double) override - { - viewport.setViewPosition (originalViewPos - Point ((int) offsetX.getPosition(), - (int) offsetY.getPosition())); - } - - void mouseDown (const MouseEvent& e) override - { - if (! isGlobalMouseListener) - { - offsetX.setPosition (offsetX.getPosition()); - offsetY.setPosition (offsetY.getPosition()); - - // switch to a global mouse listener so we still receive mouseUp events - // if the original event component is deleted - viewport.contentHolder.removeMouseListener (this); - Desktop::getInstance().addGlobalMouseListener (this); - - isGlobalMouseListener = true; - - scrollSource = e.source; - } - } - - void mouseDrag (const MouseEvent& e) override - { - if (e.source == scrollSource - && ! doesMouseEventComponentBlockViewportDrag (e.eventComponent)) - { - auto totalOffset = e.getOffsetFromDragStart().toFloat(); - - if (! isDragging && totalOffset.getDistanceFromOrigin() > 8.0f) - { - isDragging = true; - - originalViewPos = viewport.getViewPosition(); - offsetX.setPosition (0.0); - offsetX.beginDrag(); - offsetY.setPosition (0.0); - offsetY.beginDrag(); - } - - if (isDragging) - { - offsetX.drag (totalOffset.x); - offsetY.drag (totalOffset.y); - } - } - } - - void mouseUp (const MouseEvent& e) override - { - if (isGlobalMouseListener && e.source == scrollSource) - endDragAndClearGlobalMouseListener(); - } - - void endDragAndClearGlobalMouseListener() - { - offsetX.endDrag(); - offsetY.endDrag(); - isDragging = false; - - viewport.contentHolder.addMouseListener (this, true); - Desktop::getInstance().removeGlobalMouseListener (this); - - isGlobalMouseListener = false; - } - - bool doesMouseEventComponentBlockViewportDrag (const Component* eventComp) - { - for (auto c = eventComp; c != nullptr && c != &viewport; c = c->getParentComponent()) - if (c->getViewportIgnoreDragFlag()) - return true; - - return false; - } - - Viewport& viewport; - ViewportDragPosition offsetX, offsetY; - Point originalViewPos; - MouseInputSource scrollSource = Desktop::getInstance().getMainMouseSource(); - bool isDragging = false; - bool isGlobalMouseListener = false; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DragToScrollListener) -}; - -void Viewport::setScrollOnDragEnabled (bool shouldScrollOnDrag) -{ - if (isScrollOnDragEnabled() != shouldScrollOnDrag) - { - if (shouldScrollOnDrag) - dragToScrollListener.reset (new DragToScrollListener (*this)); - else - dragToScrollListener.reset(); - } -} - -bool Viewport::isScrollOnDragEnabled() const noexcept +void Viewport::setScrollOnDragMode (const ScrollOnDragMode mode) { - return dragToScrollListener != nullptr; + scrollOnDragMode = mode; } bool Viewport::isCurrentlyScrollingOnDrag() const noexcept { - return dragToScrollListener != nullptr && dragToScrollListener->isDragging; + return dragToScrollListener->isDragging; } //============================================================================== diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_Viewport.h juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_Viewport.h --- juce-6.1.5~ds0/modules/juce_gui_basics/layout/juce_Viewport.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/layout/juce_Viewport.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -271,16 +271,39 @@ */ bool canScrollHorizontally() const noexcept; - /** Enables or disables drag-to-scroll functionality in the viewport. + /** Enables or disables drag-to-scroll functionality for mouse sources in the viewport. If your viewport contains a Component that you don't want to receive mouse events when the user is drag-scrolling, you can disable this with the Component::setViewportIgnoreDragFlag() method. */ - void setScrollOnDragEnabled (bool shouldScrollOnDrag); + [[deprecated ("Use setScrollOnDragMode instead.")]] + void setScrollOnDragEnabled (bool shouldScrollOnDrag) + { + setScrollOnDragMode (shouldScrollOnDrag ? ScrollOnDragMode::all : ScrollOnDragMode::never); + } + + /** Returns true if drag-to-scroll functionality is enabled for mouse input sources. */ + [[deprecated ("Use getScrollOnDragMode instead.")]] + bool isScrollOnDragEnabled() const noexcept { return getScrollOnDragMode() == ScrollOnDragMode::all; } + + enum class ScrollOnDragMode + { + never, /**< Dragging will never scroll the viewport. */ + nonHover, /**< Dragging will only scroll the viewport if the input source cannot hover. */ + all /**< Dragging will always scroll the viewport. */ + }; - /** Returns true if drag-to-scroll functionality is enabled. */ - bool isScrollOnDragEnabled() const noexcept; + /** Sets the current scroll-on-drag mode. The default is ScrollOnDragMode::nonHover. + + If your viewport contains a Component that you don't want to receive mouse events when the + user is drag-scrolling, you can disable this with the Component::setViewportIgnoreDragFlag() + method. + */ + void setScrollOnDragMode (ScrollOnDragMode scrollOnDragMode); + + /** Returns the current scroll-on-drag mode. */ + ScrollOnDragMode getScrollOnDragMode() const { return scrollOnDragMode; } /** Returns true if the user is currently dragging-to-scroll. @see setScrollOnDragEnabled @@ -314,12 +337,21 @@ private: //============================================================================== + class AccessibilityIgnoredComponent : public Component + { + std::unique_ptr createAccessibilityHandler() override + { + return createIgnoredAccessibilityHandler (*this); + } + }; + std::unique_ptr verticalScrollBar, horizontalScrollBar; - Component contentHolder; + AccessibilityIgnoredComponent contentHolder; WeakReference contentComp; Rectangle lastVisibleArea; int scrollBarThickness = 0; int singleStepX = 16, singleStepY = 16; + ScrollOnDragMode scrollOnDragMode = ScrollOnDragMode::nonHover; bool showHScrollbar = true, showVScrollbar = true, deleteContent = true; bool customScrollBarThickness = false; bool allowScrollingWithoutScrollbarV = false, allowScrollingWithoutScrollbarH = false; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h --- juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h --- juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -2456,7 +2456,7 @@ overImage.addAndMakeVisible (ellipse.createCopy().release()); overImage.addAndMakeVisible (dp.createCopy().release()); - auto db = new DrawableButton ("tabs", DrawableButton::ImageFitted); + auto db = new DrawableButton (TRANS ("Additional Items"), DrawableButton::ImageFitted); db->setImages (&normalImage, &overImage, nullptr); return db; } diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h --- juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h --- juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h --- juce-6.1.5~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_MenuBarComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_MenuBarComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_MenuBarComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_MenuBarComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_MenuBarModel.h juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_MenuBarModel.h --- juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_MenuBarModel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_MenuBarModel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_PopupMenu.cpp juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_PopupMenu.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_PopupMenu.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_PopupMenu.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -87,7 +87,7 @@ std::unique_ptr createAccessibilityHandler() override { - return nullptr; + return createIgnoredAccessibilityHandler (*this); } const Options& options; @@ -187,29 +187,6 @@ PopupMenu::Item item; private: - class ValueInterface : public AccessibilityValueInterface - { - public: - ValueInterface() = default; - - bool isReadOnly() const override { return true; } - - double getCurrentValue() const override - { - return 1.0; - } - - String getCurrentValueAsString() const override - { - return TRANS ("Checked"); - } - - void setValue (double) override {} - void setValueAsString (const String&) override {} - - AccessibleValueRange getRange() const override { return {}; } - }; - //============================================================================== class ItemAccessibilityHandler : public AccessibilityHandler { @@ -218,9 +195,7 @@ : AccessibilityHandler (itemComponentToWrap, isAccessibilityHandlerRequired (itemComponentToWrap.item) ? AccessibilityRole::menuItem : AccessibilityRole::ignored, - getAccessibilityActions (*this, itemComponentToWrap), - AccessibilityHandler::Interfaces { itemComponentToWrap.item.isTicked ? std::make_unique() - : nullptr }), + getAccessibilityActions (*this, itemComponentToWrap)), itemComponent (itemComponentToWrap) { } @@ -242,7 +217,7 @@ } if (itemComponent.item.isTicked) - state = state.withChecked(); + state = state.withCheckable().withChecked(); return state.isFocused() ? state.withSelected() : state; } @@ -300,7 +275,8 @@ std::unique_ptr createAccessibilityHandler() override { - return item.isSeparator ? nullptr : std::make_unique (*this); + return item.isSeparator ? createIgnoredAccessibilityHandler (*this) + : std::make_unique (*this); } //============================================================================== @@ -542,8 +518,13 @@ exitModalState (resultID); - if (makeInvisible && deletionChecker != nullptr) - setVisible (false); + if (deletionChecker != nullptr) + { + exitingModalState = true; + + if (makeInvisible) + setVisible (false); + } if (resultID != 0 && item != nullptr @@ -739,6 +720,9 @@ if (! treeContains (currentlyModalWindow)) return false; + if (exitingModalState) + return false; + return true; } @@ -1323,6 +1307,7 @@ uint32 windowCreationTime, lastFocusedTime, timeEnteredCurrentChildComp; OwnedArray mouseSourceStates; float scaleFactor; + bool exitingModalState = false; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MenuWindow) }; @@ -2044,6 +2029,17 @@ Component* PopupMenu::createWindow (const Options& options, ApplicationCommandManager** managerOfChosenCommand) const { + #if JUCE_WINDOWS + const auto scope = [&]() -> std::unique_ptr + { + if (auto* target = options.getTargetComponent()) + if (auto* handle = target->getWindowHandle()) + return std::make_unique (handle); + + return nullptr; + }(); + #endif + return items.isEmpty() ? nullptr : new HelperClasses::MenuWindow (*this, nullptr, options, ! options.getTargetScreenArea().isEmpty(), diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_PopupMenu.h juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_PopupMenu.h --- juce-6.1.5~ds0/modules/juce_gui_basics/menus/juce_PopupMenu.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/menus/juce_PopupMenu.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -483,8 +483,8 @@ @see withTargetComponent, withTargetScreenArea */ - Options withTargetComponent (Component* targetComponent) const; - Options withTargetComponent (Component& targetComponent) const; + JUCE_NODISCARD Options withTargetComponent (Component* targetComponent) const; + JUCE_NODISCARD Options withTargetComponent (Component& targetComponent) const; /** Sets the region of the screen next to which the menu should be displayed. @@ -500,7 +500,7 @@ @see withMousePosition */ - Options withTargetScreenArea (Rectangle targetArea) const; + JUCE_NODISCARD Options withTargetScreenArea (Rectangle targetArea) const; /** Sets the target screen area to match the current mouse position. @@ -508,7 +508,7 @@ @see withTargetScreenArea */ - Options withMousePosition() const; + JUCE_NODISCARD Options withMousePosition() const; /** If the passed component has been deleted when the popup menu exits, the selected item's action will not be called. @@ -517,26 +517,26 @@ callback, in the case that the callback needs to access a component that may be deleted. */ - Options withDeletionCheck (Component& componentToWatchForDeletion) const; + JUCE_NODISCARD Options withDeletionCheck (Component& componentToWatchForDeletion) const; /** Sets the minimum width of the popup window. */ - Options withMinimumWidth (int minWidth) const; + JUCE_NODISCARD Options withMinimumWidth (int minWidth) const; /** Sets the minimum number of columns in the popup window. */ - Options withMinimumNumColumns (int minNumColumns) const; + JUCE_NODISCARD Options withMinimumNumColumns (int minNumColumns) const; /** Sets the maximum number of columns in the popup window. */ - Options withMaximumNumColumns (int maxNumColumns) const; + JUCE_NODISCARD Options withMaximumNumColumns (int maxNumColumns) const; /** Sets the default height of each item in the popup menu. */ - Options withStandardItemHeight (int standardHeight) const; + JUCE_NODISCARD Options withStandardItemHeight (int standardHeight) const; /** Sets an item which must be visible when the menu is initially drawn. This is useful to ensure that a particular item is shown when the menu contains too many items to display on a single screen. */ - Options withItemThatMustBeVisible (int idOfItemToBeVisible) const; + JUCE_NODISCARD Options withItemThatMustBeVisible (int idOfItemToBeVisible) const; /** Sets a component that the popup menu will be drawn into. @@ -547,10 +547,10 @@ avoid this unwanted behaviour, but with the downside that the menu size will be constrained by the size of the parent component. */ - Options withParentComponent (Component* parentComponent) const; + JUCE_NODISCARD Options withParentComponent (Component* parentComponent) const; /** Sets the direction of the popup menu relative to the target screen area. */ - Options withPreferredPopupDirection (PopupDirection direction) const; + JUCE_NODISCARD Options withPreferredPopupDirection (PopupDirection direction) const; /** Sets an item to select in the menu. @@ -560,7 +560,7 @@ than needing to move the highlighted row down from the top of the menu each time it is opened. */ - Options withInitiallySelectedItem (int idOfItemToBeSelected) const; + JUCE_NODISCARD Options withInitiallySelectedItem (int idOfItemToBeSelected) const; //============================================================================== /** Gets the parent component. This may be nullptr if the Component has been deleted. diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_BubbleComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_BubbleComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_BubbleComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_BubbleComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_DropShadower.cpp juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_DropShadower.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_DropShadower.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_DropShadower.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -38,6 +38,17 @@ if (comp->isOnDesktop()) { + #if JUCE_WINDOWS + const auto scope = [&]() -> std::unique_ptr + { + if (comp != nullptr) + if (auto* handle = comp->getWindowHandle()) + return std::make_unique (handle); + + return nullptr; + }(); + #endif + setSize (1, 1); // to keep the OS happy by not having zero-size windows addToDesktop (ComponentPeer::windowIgnoresMouseClicks | ComponentPeer::windowIsTemporary @@ -82,8 +93,7 @@ ParentVisibilityChangedListener (Component& r, ComponentListener& l) : root (&r), listener (&l) { - if (auto* firstParent = root->getParentComponent()) - updateParentHierarchy (firstParent); + updateParentHierarchy(); if ((SystemStats::getOperatingSystemType() & SystemStats::Windows) != 0) { @@ -99,16 +109,16 @@ comp->removeComponentListener (this); } - void componentVisibilityChanged (Component&) override + void componentVisibilityChanged (Component& component) override { - listener->componentVisibilityChanged (*root); + if (root != &component) + listener->componentVisibilityChanged (*root); } void componentParentHierarchyChanged (Component& component) override { if (root == &component) - if (auto* firstParent = root->getParentComponent()) - updateParentHierarchy (firstParent); + updateParentHierarchy(); } bool isWindowOnVirtualDesktop() const noexcept { return isOnVirtualDesktop; } @@ -129,13 +139,13 @@ WeakReference ref; }; - void updateParentHierarchy (Component* rootComponent) + void updateParentHierarchy() { const auto lastSeenComponents = std::exchange (observedComponents, [&] { std::set result; - for (auto node = rootComponent; node != nullptr; node = node->getParentComponent()) + for (auto node = root; node != nullptr; node = node->getParentComponent()) result.emplace (*node); return result; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_DropShadower.h juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_DropShadower.h --- juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_DropShadower.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_DropShadower.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_FocusOutline.cpp juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_FocusOutline.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_FocusOutline.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_FocusOutline.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_FocusOutline.h juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_FocusOutline.h --- juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_FocusOutline.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_FocusOutline.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -29,12 +29,12 @@ /* ============================================================================== - In accordance with the terms of the JUCE 6 End-Use License Agreement, the + In accordance with the terms of the JUCE 7 End-Use License Agreement, the JUCE Code in SECTION A cannot be removed, changed or otherwise rendered ineffective unless you have a JUCE Indie or Pro license, or are using JUCE under the GPL v3 license. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence ============================================================================== */ diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_JUCESplashScreen.h juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_JUCESplashScreen.h --- juce-6.1.5~ds0/modules/juce_gui_basics/misc/juce_JUCESplashScreen.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/misc/juce_JUCESplashScreen.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,12 +26,12 @@ /* ============================================================================== - In accordance with the terms of the JUCE 6 End-Use License Agreement, the + In accordance with the terms of the JUCE 7 End-Use License Agreement, the JUCE Code in SECTION A cannot be removed, changed or otherwise rendered ineffective unless you have a JUCE Indie or Pro license, or are using JUCE under the GPL v3 license. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence ============================================================================== */ diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_ComponentDragger.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_ComponentDragger.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_ComponentDragger.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_ComponentDragger.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -59,6 +59,7 @@ startTimer (200); setInterceptsMouseClicks (false, false); + setWantsKeyboardFocus (true); setAlwaysOnTop (true); } @@ -200,7 +201,12 @@ { if (key == KeyPress::escapeKey) { - dismissWithAnimation (true); + const auto wasVisible = isVisible(); + setVisible (false); + + if (wasVisible) + dismissWithAnimation (true); + deleteSelf(); return true; } @@ -466,8 +472,7 @@ dragImageComponent->setOpaque (true); dragImageComponent->addToDesktop (ComponentPeer::windowIgnoresMouseClicks - | ComponentPeer::windowIsTemporary - | ComponentPeer::windowIgnoresKeyPresses); + | ComponentPeer::windowIsTemporary); } else { @@ -484,6 +489,7 @@ dragImageComponent->sourceDetails.localPosition = sourceComponent->getLocalPoint (nullptr, lastMouseDown); dragImageComponent->updateLocation (false, lastMouseDown); + dragImageComponent->grabKeyboardFocus(); #if JUCE_WINDOWS // Under heavy load, the layered window's paint callback can often be lost by the OS, diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_LassoComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_LassoComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_LassoComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_LassoComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseCursor.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseCursor.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseCursor.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseCursor.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -57,10 +57,6 @@ { } -MouseEvent::~MouseEvent() noexcept -{ -} - //============================================================================== MouseEvent MouseEvent::getEventRelativeTo (Component* const otherComponent) const noexcept { diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseEvent.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseEvent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseEvent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseEvent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -79,8 +79,11 @@ int numberOfClicks, bool mouseWasDragged) noexcept; - /** Destructor. */ - ~MouseEvent() noexcept; + MouseEvent (const MouseEvent&) = default; + MouseEvent& operator= (const MouseEvent&) = delete; + + MouseEvent (MouseEvent&&) = default; + MouseEvent& operator= (MouseEvent&&) = delete; //============================================================================== /** The position of the mouse when the event occurred. @@ -374,8 +377,6 @@ private: //============================================================================== const uint8 numberOfClicks, wasMovedSinceMouseDown; - - MouseEvent& operator= (const MouseEvent&); }; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -57,18 +57,6 @@ return lastPeer; } - static Point screenPosToLocalPos (Component& comp, Point pos) - { - if (auto* peer = comp.getPeer()) - { - pos = peer->globalToLocal (pos); - auto& peerComp = peer->getComponent(); - return comp.getLocalPoint (&peerComp, ScalingHelpers::unscaledScreenPosToScaled (peerComp, pos)); - } - - return comp.getLocalPoint (nullptr, ScalingHelpers::unscaledScreenPosToScaled (comp, pos)); - } - Component* findComponentAt (Point screenPos) { if (auto* peer = getPeer()) @@ -95,7 +83,7 @@ Point getRawScreenPosition() const noexcept { return unboundedMouseOffset + (inputType != MouseInputSource::InputSourceType::touch ? MouseInputSource::getCurrentRawMousePosition() - : lastScreenPos); + : lastPointerState.position); } void setScreenPosition (Point p) @@ -103,78 +91,80 @@ MouseInputSource::setRawMousePosition (ScalingHelpers::scaledScreenPosToUnscaled (p)); } - bool isPressureValid() const noexcept { return pressure >= 0.0f && pressure <= 1.0f; } - bool isOrientationValid() const noexcept { return orientation >= 0.0f && orientation <= MathConstants::twoPi; } - bool isRotationValid() const noexcept { return rotation >= 0.0f && rotation <= MathConstants::twoPi; } - bool isTiltValid (bool isX) const noexcept { return isX ? (tiltX >= -1.0f && tiltX <= 1.0f) : (tiltY >= -1.0f && tiltY <= 1.0f); } - //============================================================================== #if JUCE_DUMP_MOUSE_EVENTS - #define JUCE_MOUSE_EVENT_DBG(desc) DBG ("Mouse " << desc << " #" << index \ - << ": " << screenPosToLocalPos (comp, screenPos).toString() \ - << " - Comp: " << String::toHexString ((pointer_sized_int) &comp)); + #define JUCE_MOUSE_EVENT_DBG(desc, screenPos) DBG ("Mouse " << desc << " #" << index \ + << ": " << ScalingHelpers::screenPosToLocalPos (comp, screenPos).toString() \ + << " - Comp: " << String::toHexString ((pointer_sized_int) &comp)); #else - #define JUCE_MOUSE_EVENT_DBG(desc) + #define JUCE_MOUSE_EVENT_DBG(desc, screenPos) #endif - void sendMouseEnter (Component& comp, Point screenPos, Time time) + void sendMouseEnter (Component& comp, const PointerState& pointerState, Time time) { - JUCE_MOUSE_EVENT_DBG ("enter") - comp.internalMouseEnter (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time); + JUCE_MOUSE_EVENT_DBG ("enter", pointerState.position) + comp.internalMouseEnter (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, pointerState.position), time); } - void sendMouseExit (Component& comp, Point screenPos, Time time) + void sendMouseExit (Component& comp, const PointerState& pointerState, Time time) { - JUCE_MOUSE_EVENT_DBG ("exit") - comp.internalMouseExit (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time); + JUCE_MOUSE_EVENT_DBG ("exit", pointerState.position) + comp.internalMouseExit (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, pointerState.position), time); } - void sendMouseMove (Component& comp, Point screenPos, Time time) + void sendMouseMove (Component& comp, const PointerState& pointerState, Time time) { - JUCE_MOUSE_EVENT_DBG ("move") - comp.internalMouseMove (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time); + JUCE_MOUSE_EVENT_DBG ("move", pointerState.position) + comp.internalMouseMove (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, pointerState.position), time); } - void sendMouseDown (Component& comp, Point screenPos, Time time) + void sendMouseDown (Component& comp, const PointerState& pointerState, Time time) { - JUCE_MOUSE_EVENT_DBG ("down") - comp.internalMouseDown (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, pressure, orientation, rotation, tiltX, tiltY); + JUCE_MOUSE_EVENT_DBG ("down", pointerState.position) + comp.internalMouseDown (MouseInputSource (this), + pointerState.withPosition (ScalingHelpers::screenPosToLocalPos (comp, pointerState.position)), + time); } - void sendMouseDrag (Component& comp, Point screenPos, Time time) + void sendMouseDrag (Component& comp, const PointerState& pointerState, Time time) { - JUCE_MOUSE_EVENT_DBG ("drag") - comp.internalMouseDrag (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, pressure, orientation, rotation, tiltX, tiltY); + JUCE_MOUSE_EVENT_DBG ("drag", pointerState.position) + comp.internalMouseDrag (MouseInputSource (this), + pointerState.withPosition (ScalingHelpers::screenPosToLocalPos (comp, pointerState.position)), + time); } - void sendMouseUp (Component& comp, Point screenPos, Time time, ModifierKeys oldMods) + void sendMouseUp (Component& comp, const PointerState& pointerState, Time time, ModifierKeys oldMods) { - JUCE_MOUSE_EVENT_DBG ("up") - comp.internalMouseUp (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, oldMods, pressure, orientation, rotation, tiltX, tiltY); + JUCE_MOUSE_EVENT_DBG ("up", pointerState.position) + comp.internalMouseUp (MouseInputSource (this), + pointerState.withPosition (ScalingHelpers::screenPosToLocalPos (comp, pointerState.position)), + time, + oldMods); } void sendMouseWheel (Component& comp, Point screenPos, Time time, const MouseWheelDetails& wheel) { - JUCE_MOUSE_EVENT_DBG ("wheel") - comp.internalMouseWheel (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, wheel); + JUCE_MOUSE_EVENT_DBG ("wheel", screenPos) + comp.internalMouseWheel (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, screenPos), time, wheel); } void sendMagnifyGesture (Component& comp, Point screenPos, Time time, float amount) { - JUCE_MOUSE_EVENT_DBG ("magnify") - comp.internalMagnifyGesture (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, amount); + JUCE_MOUSE_EVENT_DBG ("magnify", screenPos) + comp.internalMagnifyGesture (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, screenPos), time, amount); } //============================================================================== // (returns true if the button change caused a modal event loop) - bool setButtons (Point screenPos, Time time, ModifierKeys newButtonState) + bool setButtons (const PointerState& pointerState, Time time, ModifierKeys newButtonState) { if (buttonState == newButtonState) return false; // (avoid sending a spurious mouse-drag when we receive a mouse-up) if (! (isDragging() && ! newButtonState.isAnyMouseButtonDown())) - setScreenPos (screenPos, time, false); + setPointerState (pointerState, time, false); // (ignore secondary clicks when there's already a button down) if (buttonState.isAnyMouseButtonDown() == newButtonState.isAnyMouseButtonDown()) @@ -192,7 +182,7 @@ auto oldMods = getCurrentModifiers(); buttonState = newButtonState; // must change this before calling sendMouseUp, in case it runs a modal loop - sendMouseUp (*current, screenPos + unboundedMouseOffset, time, oldMods); + sendMouseUp (*current, pointerState.withPositionOffset (unboundedMouseOffset), time, oldMods); if (lastCounter != mouseEventCounter) return true; // if a modal loop happened, then newButtonState is no longer valid. @@ -209,16 +199,16 @@ if (auto* current = getComponentUnderMouse()) { - registerMouseDown (screenPos, time, *current, buttonState, + registerMouseDown (pointerState.position, time, *current, buttonState, inputType == MouseInputSource::InputSourceType::touch); - sendMouseDown (*current, screenPos, time); + sendMouseDown (*current, pointerState, time); } } return lastCounter != mouseEventCounter; } - void setComponentUnderMouse (Component* newComponent, Point screenPos, Time time) + void setComponentUnderMouse (Component* newComponent, const PointerState& pointerState, Time time) { auto* current = getComponentUnderMouse(); @@ -230,12 +220,12 @@ if (current != nullptr) { WeakReference safeOldComp (current); - setButtons (screenPos, time, ModifierKeys()); + setButtons (pointerState, time, ModifierKeys()); if (auto oldComp = safeOldComp.get()) { componentUnderMouse = safeNewComp; - sendMouseExit (*oldComp, screenPos, time); + sendMouseExit (*oldComp, pointerState, time); } buttonState = originalButtonState; @@ -245,48 +235,50 @@ current = safeNewComp.get(); if (current != nullptr) - sendMouseEnter (*current, screenPos, time); + sendMouseEnter (*current, pointerState, time); revealCursor (false); - setButtons (screenPos, time, originalButtonState); + setButtons (pointerState, time, originalButtonState); } } - void setPeer (ComponentPeer& newPeer, Point screenPos, Time time) + void setPeer (ComponentPeer& newPeer, const PointerState& pointerState, Time time) { if (&newPeer != lastPeer) { - setComponentUnderMouse (nullptr, screenPos, time); + setComponentUnderMouse (nullptr, pointerState, time); lastPeer = &newPeer; - setComponentUnderMouse (findComponentAt (screenPos), screenPos, time); + setComponentUnderMouse (findComponentAt (pointerState.position), pointerState, time); } } - void setScreenPos (Point newScreenPos, Time time, bool forceUpdate) + void setPointerState (const PointerState& newPointerState, Time time, bool forceUpdate) { + const auto& newScreenPos = newPointerState.position; + if (! isDragging()) - setComponentUnderMouse (findComponentAt (newScreenPos), newScreenPos, time); + setComponentUnderMouse (findComponentAt (newScreenPos), newPointerState, time); - if (newScreenPos != lastScreenPos || forceUpdate) + if ((newPointerState != lastPointerState) || forceUpdate) { cancelPendingUpdate(); - if (newScreenPos != MouseInputSource::offscreenMousePos) - lastScreenPos = newScreenPos; + if (newPointerState.position != MouseInputSource::offscreenMousePos) + lastPointerState = newPointerState; if (auto* current = getComponentUnderMouse()) { if (isDragging()) { registerMouseDrag (newScreenPos); - sendMouseDrag (*current, newScreenPos + unboundedMouseOffset, time); + sendMouseDrag (*current, newPointerState.withPositionOffset (unboundedMouseOffset), time); if (isUnboundedMouseModeOn) handleUnboundedDrag (*current); } else { - sendMouseMove (*current, newScreenPos, time); + sendMouseMove (*current, newPointerState, time); } } @@ -299,43 +291,31 @@ const ModifierKeys newMods, float newPressure, float newOrientation, PenDetails pen) { lastTime = time; - - const bool pressureChanged = (pressure != newPressure); - pressure = newPressure; - - const bool orientationChanged = (orientation != newOrientation); - orientation = newOrientation; - - const bool rotationChanged = (rotation != pen.rotation); - rotation = pen.rotation; - - const bool tiltChanged = (tiltX != pen.tiltX || tiltY != pen.tiltY); - tiltX = pen.tiltX; - tiltY = pen.tiltY; - - const bool shouldUpdate = (pressureChanged || orientationChanged || rotationChanged || tiltChanged); - ++mouseEventCounter; - - auto screenPos = newPeer.localToGlobal (positionWithinPeer); + const auto pointerState = PointerState().withPosition (newPeer.localToGlobal (positionWithinPeer)) + .withPressure (newPressure) + .withOrientation (newOrientation) + .withRotation (MouseInputSource::defaultRotation) + .withTiltX (pen.tiltX) + .withTiltY (pen.tiltY); if (isDragging() && newMods.isAnyMouseButtonDown()) { - setScreenPos (screenPos, time, shouldUpdate); + setPointerState (pointerState, time, false); } else { - setPeer (newPeer, screenPos, time); + setPeer (newPeer, pointerState, time); if (auto* peer = getPeer()) { - if (setButtons (screenPos, time, newMods)) + if (setButtons (pointerState, time, newMods)) return; // some modal events have been dispatched, so the current event is now out-of-date peer = getPeer(); if (peer != nullptr) - setScreenPos (screenPos, time, shouldUpdate); + setPointerState (pointerState, time, false); } } } @@ -347,8 +327,9 @@ ++mouseEventCounter; screenPos = peer.localToGlobal (positionWithinPeer); - setPeer (peer, screenPos, time); - setScreenPos (screenPos, time, false); + const auto pointerState = lastPointerState.withPosition (screenPos); + setPeer (peer, pointerState, time); + setPointerState (pointerState, time, false); triggerFakeMove(); return getComponentUnderMouse(); @@ -428,7 +409,7 @@ void handleAsyncUpdate() override { - setScreenPos (lastScreenPos, jmax (lastTime, Time::getCurrentTime()), true); + setPointerState (lastPointerState, jmax (lastTime, Time::getCurrentTime()), true); } //============================================================================== @@ -444,7 +425,7 @@ // when released, return the mouse to within the component's bounds if (auto* current = getComponentUnderMouse()) setScreenPosition (current->getScreenBounds().toFloat() - .getConstrainedPoint (ScalingHelpers::unscaledScreenPosToScaled (lastScreenPos))); + .getConstrainedPoint (ScalingHelpers::unscaledScreenPosToScaled (lastPointerState.position))); } isUnboundedMouseModeOn = enable; @@ -458,17 +439,17 @@ { auto componentScreenBounds = ScalingHelpers::scaledScreenPosToUnscaled (current.getParentMonitorArea().reduced (2, 2).toFloat()); - if (! componentScreenBounds.contains (lastScreenPos)) + if (! componentScreenBounds.contains (lastPointerState.position)) { auto componentCentre = current.getScreenBounds().toFloat().getCentre(); - unboundedMouseOffset += (lastScreenPos - ScalingHelpers::scaledScreenPosToUnscaled (componentCentre)); + unboundedMouseOffset += (lastPointerState.position - ScalingHelpers::scaledScreenPosToUnscaled (componentCentre)); setScreenPosition (componentCentre); } else if (isCursorVisibleUntilOffscreen && (! unboundedMouseOffset.isOrigin()) - && componentScreenBounds.contains (lastScreenPos + unboundedMouseOffset)) + && componentScreenBounds.contains (lastPointerState.position + unboundedMouseOffset)) { - MouseInputSource::setRawMousePosition (lastScreenPos + unboundedMouseOffset); + MouseInputSource::setRawMousePosition (lastPointerState.position + unboundedMouseOffset); unboundedMouseOffset = {}; } } @@ -507,13 +488,9 @@ //============================================================================== const int index; const MouseInputSource::InputSourceType inputType; - Point lastScreenPos, unboundedMouseOffset; // NB: these are unscaled coords + Point unboundedMouseOffset; // NB: these are unscaled coords + PointerState lastPointerState; ModifierKeys buttonState; - float pressure = 0; - float orientation = 0; - float rotation = 0; - float tiltX = 0; - float tiltY = 0; bool isUnboundedMouseModeOn = false, isCursorVisibleUntilOffscreen = false; @@ -600,14 +577,14 @@ Point MouseInputSource::getScreenPosition() const noexcept { return pimpl->getScreenPosition(); } Point MouseInputSource::getRawScreenPosition() const noexcept { return pimpl->getRawScreenPosition(); } ModifierKeys MouseInputSource::getCurrentModifiers() const noexcept { return pimpl->getCurrentModifiers(); } -float MouseInputSource::getCurrentPressure() const noexcept { return pimpl->pressure; } -bool MouseInputSource::isPressureValid() const noexcept { return pimpl->isPressureValid(); } -float MouseInputSource::getCurrentOrientation() const noexcept { return pimpl->orientation; } -bool MouseInputSource::isOrientationValid() const noexcept { return pimpl->isOrientationValid(); } -float MouseInputSource::getCurrentRotation() const noexcept { return pimpl->rotation; } -bool MouseInputSource::isRotationValid() const noexcept { return pimpl->isRotationValid(); } -float MouseInputSource::getCurrentTilt (bool tiltX) const noexcept { return tiltX ? pimpl->tiltX : pimpl->tiltY; } -bool MouseInputSource::isTiltValid (bool isX) const noexcept { return pimpl->isTiltValid (isX); } +float MouseInputSource::getCurrentPressure() const noexcept { return pimpl->lastPointerState.pressure; } +bool MouseInputSource::isPressureValid() const noexcept { return pimpl->lastPointerState.isPressureValid(); } +float MouseInputSource::getCurrentOrientation() const noexcept { return pimpl->lastPointerState.orientation; } +bool MouseInputSource::isOrientationValid() const noexcept { return pimpl->lastPointerState.isOrientationValid(); } +float MouseInputSource::getCurrentRotation() const noexcept { return pimpl->lastPointerState.rotation; } +bool MouseInputSource::isRotationValid() const noexcept { return pimpl->lastPointerState.isRotationValid(); } +float MouseInputSource::getCurrentTilt (bool tiltX) const noexcept { return tiltX ? pimpl->lastPointerState.tiltX : pimpl->lastPointerState.tiltY; } +bool MouseInputSource::isTiltValid (bool isX) const noexcept { return pimpl->lastPointerState.isTiltValid (isX); } Component* MouseInputSource::getComponentUnderMouse() const { return pimpl->getComponentUnderMouse(); } void MouseInputSource::triggerFakeMove() const { pimpl->triggerFakeMove(); } int MouseInputSource::getNumberOfMultipleClicks() const noexcept { return pimpl->getNumberOfMultipleClicks(); } @@ -698,7 +675,7 @@ } else if (type == MouseInputSource::InputSourceType::touch) { - jassert (touchIndex >= 0 && touchIndex < 100); // sanity-check on number of fingers + jassert (0 <= touchIndex && touchIndex < 100); // sanity-check on number of fingers for (auto& m : sourceArray) if (type == m.getType() && touchIndex == m.getIndex()) @@ -763,7 +740,7 @@ // because on some OSes the queue can get overloaded with messages so that mouse-events don't get through.. if (s->isDragging() && ComponentPeer::getCurrentModifiersRealtime().isAnyMouseButtonDown()) { - s->lastScreenPos = s->getRawScreenPosition(); + s->lastPointerState.position = s->getRawScreenPosition(); s->triggerFakeMove(); anyDragging = true; } diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseInputSource.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseInputSource.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseInputSource.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseInputSource.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -224,16 +224,50 @@ /** A default value for pressure, which is used when a device doesn't support it, or for mouse-moves, mouse-ups, etc. */ - static const float invalidPressure; + static constexpr float defaultPressure = 0.0f; /** A default value for orientation, which is used when a device doesn't support it */ - static const float invalidOrientation; + static constexpr float defaultOrientation = 0.0f; /** A default value for rotation, which is used when a device doesn't support it */ - static const float invalidRotation; + static constexpr float defaultRotation = 0.0f; /** Default values for tilt, which are used when a device doesn't support it */ + static constexpr float defaultTiltX = 0.0f; + static constexpr float defaultTiltY = 0.0f; + + /** A default value for pressure, which is used when a device doesn't support it. + + This is a valid value, returning true when calling isPressureValid() hence the + deprecation. Use defaultPressure instead. + */ + [[deprecated ("Use defaultPressure instead.")]] + static const float invalidPressure; + + /** A default value for orientation, which is used when a device doesn't support it. + + This is a valid value, returning true when calling isOrientationValid() hence the + deprecation. Use defaultOrientation instead. + */ + [[deprecated ("Use defaultOrientation instead.")]] + static const float invalidOrientation; + + /** A default value for rotation, which is used when a device doesn't support it. + + This is a valid value, returning true when calling isRotationValid() hence the + deprecation. Use defaultRotation instead. + */ + [[deprecated ("Use defaultRotation instead.")]] + static const float invalidRotation; + + /** Default values for tilt, which are used when a device doesn't support it + + These are valid values, returning true when calling isTiltValid() hence the + deprecation. Use defaultTiltX and defaultTiltY instead. + */ + [[deprecated ("Use defaultTiltX instead.")]] static const float invalidTiltX; + [[deprecated ("Use defaultTiltY instead.")]] static const float invalidTiltY; /** An offscreen mouse position used when triggering mouse exits where we don't want to move diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseListener.cpp juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseListener.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseListener.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseListener.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseListener.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseListener.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_MouseListener.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_MouseListener.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_PointerState.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_PointerState.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_PointerState.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_PointerState.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,109 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +namespace juce +{ + +#ifndef DOXYGEN + +class PointerState +{ + auto tie() const noexcept + { + return std::tie (position, pressure, orientation, rotation, tiltX, tiltY); + } + +public: + PointerState() = default; + + bool operator== (const PointerState& other) const noexcept { return tie() == other.tie(); } + bool operator!= (const PointerState& other) const noexcept { return tie() != other.tie(); } + + JUCE_NODISCARD PointerState withPositionOffset (Point x) const noexcept { return with (&PointerState::position, position + x); } + JUCE_NODISCARD PointerState withPosition (Point x) const noexcept { return with (&PointerState::position, x); } + JUCE_NODISCARD PointerState withPressure (float x) const noexcept { return with (&PointerState::pressure, x); } + JUCE_NODISCARD PointerState withOrientation (float x) const noexcept { return with (&PointerState::orientation, x); } + JUCE_NODISCARD PointerState withRotation (float x) const noexcept { return with (&PointerState::rotation, x); } + JUCE_NODISCARD PointerState withTiltX (float x) const noexcept { return with (&PointerState::tiltX, x); } + JUCE_NODISCARD PointerState withTiltY (float x) const noexcept { return with (&PointerState::tiltY, x); } + + Point position; + float pressure = MouseInputSource::defaultPressure; + float orientation = MouseInputSource::defaultOrientation; + float rotation = MouseInputSource::defaultRotation; + float tiltX = MouseInputSource::defaultTiltX; + float tiltY = MouseInputSource::defaultTiltY; + + bool isPressureValid() const noexcept { return 0.0f <= pressure && pressure <= 1.0f; } + bool isOrientationValid() const noexcept { return 0.0f <= orientation && orientation <= MathConstants::twoPi; } + bool isRotationValid() const noexcept { return 0.0f <= rotation && rotation <= MathConstants::twoPi; } + bool isTiltValid (bool isX) const noexcept + { + return isX ? (-1.0f <= tiltX && tiltX <= 1.0f) + : (-1.0f <= tiltY && tiltY <= 1.0f); + } + +private: + template + PointerState with (Value PointerState::* member, Value item) const + { + auto copy = *this; + copy.*member = std::move (item); + return copy; + } +}; + +inline auto makeMouseEvent (MouseInputSource source, + const PointerState& ps, + ModifierKeys modifiers, + Component* eventComponent, + Component* originator, + Time eventTime, + Point mouseDownPos, + Time mouseDownTime, + int numberOfClicks, + bool mouseWasDragged) +{ + return MouseEvent (source, + ps.position, + modifiers, + ps.pressure, + ps.orientation, + ps.rotation, + ps.tiltX, + ps.tiltY, + eventComponent, + originator, + eventTime, + mouseDownPos, + mouseDownTime, + numberOfClicks, + mouseWasDragged); +} + + +#endif + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_TooltipClient.h juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_TooltipClient.h --- juce-6.1.5~ds0/modules/juce_gui_basics/mouse/juce_TooltipClient.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/mouse/juce_TooltipClient.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,7 +26,32 @@ namespace juce { -namespace AccessibilityTextHelpers +template +struct CharPtrIteratorTraits +{ + using difference_type = int; + using value_type = decltype (*std::declval()); + using pointer = value_type*; + using reference = value_type; + using iterator_category = std::bidirectional_iterator_tag; +}; + +} // namespace juce + +namespace std +{ + +template <> struct iterator_traits : juce::CharPtrIteratorTraits {}; +template <> struct iterator_traits : juce::CharPtrIteratorTraits {}; +template <> struct iterator_traits : juce::CharPtrIteratorTraits {}; +template <> struct iterator_traits : juce::CharPtrIteratorTraits {}; + +} // namespace std + +namespace juce +{ + +struct AccessibilityTextHelpers { enum class BoundaryType { @@ -42,61 +67,169 @@ backwards }; - static int findTextBoundary (const AccessibilityTextInterface& textInterface, - int currentPosition, - BoundaryType boundary, - Direction direction) + enum class ExtendSelection { - const auto numCharacters = textInterface.getTotalNumCharacters(); - const auto isForwards = (direction == Direction::forwards); + no, + yes + }; + + /* Indicates whether a function may return the current text position, in the case that the + position already falls on a text unit boundary. + */ + enum class IncludeThisBoundary + { + no, //< Always search for the following boundary, even if the current position falls on a boundary + yes //< Return the current position if it falls on a boundary + }; - auto offsetWithDirecton = [isForwards] (int input) { return isForwards ? input : -input; }; + /* Indicates whether a word boundary should include any whitespaces that follow the + non-whitespace characters. + */ + enum class IncludeWhitespaceAfterWords + { + no, //< The word ends on the first whitespace character + yes //< The word ends after the last whitespace character + }; - switch (boundary) + /* Like std::distance, but always does an O(N) count rather than an O(1) count, and doesn't + require the iterators to have any member type aliases. + */ + template + static int countDifference (Iter from, Iter to) + { + int distance = 0; + + while (from != to) { - case BoundaryType::character: - return jlimit (0, numCharacters, currentPosition + offsetWithDirecton (1)); + ++from; + ++distance; + } - case BoundaryType::word: - case BoundaryType::line: + return distance; + } + + /* Returns the number of characters between ptr and the next word end in a specific + direction. + + If ptr is inside a word, the result will be the distance to the end of the same + word. + */ + template + static int findNextWordEndOffset (CharPtr begin, + CharPtr end, + CharPtr ptr, + Direction direction, + IncludeThisBoundary includeBoundary, + IncludeWhitespaceAfterWords includeWhitespace) + { + const auto move = [&] (auto b, auto e, auto iter) + { + const auto isSpace = [] (juce_wchar c) { return CharacterFunctions::isWhitespace (c); }; + + const auto start = [&] { - const auto text = [&]() -> String - { - if (isForwards) - return textInterface.getText ({ currentPosition, textInterface.getTotalNumCharacters() }); + if (iter == b && includeBoundary == IncludeThisBoundary::yes) + return b; - const auto str = textInterface.getText ({ 0, currentPosition }); + const auto nudged = iter - (iter != b && includeBoundary == IncludeThisBoundary::yes ? 1 : 0); - auto start = str.getCharPointer(); - auto end = start.findTerminatingNull(); - const auto size = getAddressDifference (end.getAddress(), start.getAddress()); + return includeWhitespace == IncludeWhitespaceAfterWords::yes + ? std::find_if (nudged, e, isSpace) + : std::find_if_not (nudged, e, isSpace); + }(); + + const auto found = includeWhitespace == IncludeWhitespaceAfterWords::yes + ? std::find_if_not (start, e, isSpace) + : std::find_if (start, e, isSpace); + + return countDifference (iter, found); + }; + + return direction == Direction::forwards ? move (begin, end, ptr) + : -move (std::make_reverse_iterator (end), + std::make_reverse_iterator (begin), + std::make_reverse_iterator (ptr)); + } - String reversed; + /* Returns the number of characters between ptr and the beginning of the next line in a + specific direction. + */ + template + static int findNextLineOffset (CharPtr begin, + CharPtr end, + CharPtr ptr, + Direction direction, + IncludeThisBoundary includeBoundary) + { + const auto findNewline = [] (auto from, auto to) { return std::find (from, to, juce_wchar { '\n' }); }; - if (size > 0) - { - reversed.preallocateBytes ((size_t) size); + if (direction == Direction::forwards) + { + if (ptr != begin && includeBoundary == IncludeThisBoundary::yes && *(ptr - 1) == '\n') + return 0; - auto destPtr = reversed.getCharPointer(); + const auto newline = findNewline (ptr, end); + return countDifference (ptr, newline) + (newline == end ? 0 : 1); + } + + const auto rbegin = std::make_reverse_iterator (ptr); + const auto rend = std::make_reverse_iterator (begin); - for (;;) - { - destPtr.write (*--end); + return -countDifference (rbegin, findNewline (rbegin + (rbegin == rend || includeBoundary == IncludeThisBoundary::yes ? 0 : 1), rend)); + } - if (end == start) - break; - } + /* Unfortunately, the method of computing end-points of text units depends on context, and on + the current platform. - destPtr.writeNull(); - } + Some examples of different behaviour: + - On Android, updating the cursor/selection always searches for the next text unit boundary; + but on Windows, ExpandToEnclosingUnit() should not move the starting point of the + selection if it already at a unit boundary. This means that we need both inclusive and + exclusive methods for finding the next text boundary. + - On Android, moving the cursor by 'words' should move to the first space following a + non-space character in the requested direction. On Windows, a 'word' includes trailing + whitespace, but not preceding whitespace. This means that we need a way of specifying + whether whitespace should be included when navigating by words. + */ + static int findTextBoundary (const AccessibilityTextInterface& textInterface, + int currentPosition, + BoundaryType boundary, + Direction direction, + IncludeThisBoundary includeBoundary, + IncludeWhitespaceAfterWords includeWhitespace) + { + const auto numCharacters = textInterface.getTotalNumCharacters(); + const auto isForwards = (direction == Direction::forwards); + const auto currentClamped = jlimit (0, numCharacters, currentPosition); - return reversed; - }(); + switch (boundary) + { + case BoundaryType::character: + { + const auto offset = includeBoundary == IncludeThisBoundary::yes ? 0 + : (isForwards ? 1 : -1); + return jlimit (0, numCharacters, currentPosition + offset); + } - auto tokens = (boundary == BoundaryType::line ? StringArray::fromLines (text) - : StringArray::fromTokens (text, false)); + case BoundaryType::word: + { + const auto str = textInterface.getText ({ 0, numCharacters }); + return currentClamped + findNextWordEndOffset (str.begin(), + str.end(), + str.begin() + currentClamped, + direction, + includeBoundary, + includeWhitespace); + } - return currentPosition + offsetWithDirecton (tokens[0].length()); + case BoundaryType::line: + { + const auto str = textInterface.getText ({ 0, numCharacters }); + return currentClamped + findNextLineOffset (str.begin(), + str.end(), + str.begin() + currentClamped, + direction, + includeBoundary); } case BoundaryType::document: @@ -106,6 +239,31 @@ jassertfalse; return -1; } -} + + /* Adjusts the current text selection range, using an algorithm appropriate for cursor movement + on Android. + */ + static Range findNewSelectionRangeAndroid (const AccessibilityTextInterface& textInterface, + BoundaryType boundaryType, + ExtendSelection extend, + Direction direction) + { + const auto oldPos = textInterface.getTextInsertionOffset(); + const auto cursorPos = findTextBoundary (textInterface, + oldPos, + boundaryType, + direction, + IncludeThisBoundary::no, + IncludeWhitespaceAfterWords::no); + + if (extend == ExtendSelection::no) + return { cursorPos, cursorPos }; + + const auto currentSelection = textInterface.getSelection(); + const auto start = currentSelection.getStart(); + const auto end = currentSelection.getEnd(); + return Range::between (cursorPos, oldPos == start ? end : start); + } +}; } // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,155 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2020 - Raw Material Software Limited + + 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 6 End-User License + Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + + End User License Agreement: www.juce.com/juce-6-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +namespace juce +{ + +struct AccessibilityTextHelpersTest : public UnitTest +{ + AccessibilityTextHelpersTest() + : UnitTest ("AccessibilityTextHelpers", UnitTestCategories::gui) {} + + void runTest() override + { + using ATH = AccessibilityTextHelpers; + + beginTest ("Android find word end"); + { + const auto testMultiple = [this] (String str, + int start, + const std::vector& collection) + { + auto it = collection.begin(); + + for (const auto direction : { ATH::Direction::forwards, ATH::Direction::backwards }) + { + for (const auto includeBoundary : { ATH::IncludeThisBoundary::no, ATH::IncludeThisBoundary::yes }) + { + for (const auto includeWhitespace : { ATH::IncludeWhitespaceAfterWords::no, ATH::IncludeWhitespaceAfterWords::yes }) + { + const auto actual = ATH::findNextWordEndOffset (str.begin(), str.end(), str.begin() + start, direction, includeBoundary, includeWhitespace); + const auto expected = *it++; + expect (expected == actual); + } + } + } + }; + + // Character Indices 0 3 56 13 50 51 + // | | || | | | + const auto string = String ("hello world \r\n with some spaces in this sentence ") + String (CharPointer_UTF8 ("\xe2\x88\xae E\xe2\x8b\x85""da = Q")); + // Direction forwards forwards forwards forwards backwards backwards backwards backwards + // IncludeBoundary no no yes yes no no yes yes + // IncludeWhitespace no yes no yes no yes no yes + testMultiple (string, 0, { 5, 6, 5, 0, 0, 0, 0, 0 }); + testMultiple (string, 3, { 2, 3, 2, 3, -3, -3, -3, -3 }); + testMultiple (string, 5, { 6, 1, 0, 1, -5, -5, -5, 0 }); + testMultiple (string, 6, { 5, 9, 5, 0, -6, -1, 0, -1 }); + testMultiple (string, 13, { 6, 2, 6, 2, -7, -2, -7, -2 }); + testMultiple (string, 50, { 1, 2, 1, 0, -9, -1, 0, -1 }); + testMultiple (string, 51, { 5, 1, 0, 1, -1, -2, -1, 0 }); + + testMultiple (" a b ", 0, { 3, 2, 0, 2, 0, 0, 0, 0 }); + testMultiple (" a b ", 1, { 2, 1, 2, 1, -1, -1, -1, -1 }); + } + + beginTest ("Android text range adjustment"); + { + const auto testMultiple = [this] (String str, + Range initial, + auto boundary, + const std::vector>& collection) + { + auto it = collection.begin(); + + for (auto extend : { ATH::ExtendSelection::no, ATH::ExtendSelection::yes }) + { + for (auto direction : { ATH::Direction::forwards, ATH::Direction::backwards }) + { + for (auto insert : { CursorPosition::begin, CursorPosition::end }) + { + const MockAccessibilityTextInterface mock { str, initial, insert }; + const auto actual = ATH::findNewSelectionRangeAndroid (mock, boundary, extend, direction); + const auto expected = *it++; + expect (expected == actual); + } + } + } + }; + + // Extend no no no no yes yes yes yes + // Direction forwards forwards backwards backwards forwards forwards backwards backwards + // Insert begin end begin end begin end begin end + testMultiple ("hello world", { 5, 5 }, ATH::BoundaryType::character, { { 6, 6 }, { 6, 6 }, { 4, 4 }, { 4, 4 }, { 5, 6 }, { 5, 6 }, { 4, 5 }, { 4, 5 } }); + testMultiple ("hello world", { 0, 0 }, ATH::BoundaryType::character, { { 1, 1 }, { 1, 1 }, { 0, 0 }, { 0, 0 }, { 0, 1 }, { 0, 1 }, { 0, 0 }, { 0, 0 } }); + testMultiple ("hello world", { 11, 11 }, ATH::BoundaryType::character, { { 11, 11 }, { 11, 11 }, { 10, 10 }, { 10, 10 }, { 11, 11 }, { 11, 11 }, { 10, 11 }, { 10, 11 } }); + testMultiple ("hello world", { 4, 5 }, ATH::BoundaryType::character, { { 5, 5 }, { 6, 6 }, { 3, 3 }, { 4, 4 }, { 5, 5 }, { 4, 6 }, { 3, 5 }, { 4, 4 } }); + testMultiple ("hello world", { 0, 1 }, ATH::BoundaryType::character, { { 1, 1 }, { 2, 2 }, { 0, 0 }, { 0, 0 }, { 1, 1 }, { 0, 2 }, { 0, 1 }, { 0, 0 } }); + testMultiple ("hello world", { 10, 11 }, ATH::BoundaryType::character, { { 11, 11 }, { 11, 11 }, { 9, 9 }, { 10, 10 }, { 11, 11 }, { 10, 11 }, { 9, 11 }, { 10, 10 } }); + + testMultiple ("foo bar baz", { 0, 0 }, ATH::BoundaryType::word, { { 3, 3 }, { 3, 3 }, { 0, 0 }, { 0, 0 }, { 0, 3 }, { 0, 3 }, { 0, 0 }, { 0, 0 } }); + testMultiple ("foo bar baz", { 1, 6 }, ATH::BoundaryType::word, { { 3, 3 }, { 8, 8 }, { 0, 0 }, { 5, 5 }, { 3, 6 }, { 1, 8 }, { 0, 6 }, { 1, 5 } }); + testMultiple ("foo bar baz", { 3, 3 }, ATH::BoundaryType::word, { { 8, 8 }, { 8, 8 }, { 0, 0 }, { 0, 0 }, { 3, 8 }, { 3, 8 }, { 0, 3 }, { 0, 3 } }); + testMultiple ("foo bar baz", { 3, 5 }, ATH::BoundaryType::word, { { 8, 8 }, { 8, 8 }, { 0, 0 }, { 0, 0 }, { 5, 8 }, { 3, 8 }, { 0, 5 }, { 0, 3 } }); + + testMultiple ("foo bar\n\n\na b\nc d e", { 0, 0 }, ATH::BoundaryType::line, { { 8, 8 }, { 8, 8 }, { 0, 0 }, { 0, 0 }, { 0, 8 }, { 0, 8 }, { 0, 0 }, { 0, 0 } }); + testMultiple ("foo bar\n\n\na b\nc d e", { 7, 7 }, ATH::BoundaryType::line, { { 8, 8 }, { 8, 8 }, { 0, 0 }, { 0, 0 }, { 7, 8 }, { 7, 8 }, { 0, 7 }, { 0, 7 } }); + testMultiple ("foo bar\n\n\na b\nc d e", { 8, 8 }, ATH::BoundaryType::line, { { 9, 9 }, { 9, 9 }, { 0, 0 }, { 0, 0 }, { 8, 9 }, { 8, 9 }, { 0, 8 }, { 0, 8 } }); + + testMultiple ("foo bar\r\na b\r\nxyz", { 0, 0 }, ATH::BoundaryType::line, { { 9, 9 }, { 9, 9 }, { 0, 0 }, { 0, 0 }, { 0, 9 }, { 0, 9 }, { 0, 0 }, { 0, 0 } }); + testMultiple ("foo bar\r\na b\r\nxyz", { 10, 10 }, ATH::BoundaryType::line, { { 14, 14 }, { 14, 14 }, { 9, 9 }, { 9, 9 }, { 10, 14 }, { 10, 14 }, { 9, 10 }, { 9, 10 } }); + } + } + + enum class CursorPosition { begin, end }; + + class MockAccessibilityTextInterface : public AccessibilityTextInterface + { + public: + MockAccessibilityTextInterface (String stringIn, Range selectionIn, CursorPosition insertIn) + : string (stringIn), selection (selectionIn), insert (insertIn) {} + + bool isDisplayingProtectedText() const override { return false; } + bool isReadOnly() const override { return false; } + int getTotalNumCharacters() const override { return string.length(); } + Range getSelection() const override { return selection; } + int getTextInsertionOffset() const override { return insert == CursorPosition::begin ? selection.getStart() : selection.getEnd(); } + String getText (Range range) const override { return string.substring (range.getStart(), range.getEnd()); } + RectangleList getTextBounds (Range) const override { return {}; } + int getOffsetAtPoint (Point) const override { return 0; } + + void setSelection (Range newRange) override { selection = newRange; } + void setText (const String& newText) override { string = newText; } + + private: + String string; + Range selection; + CursorPosition insert; + }; +}; + +static AccessibilityTextHelpersTest accessibilityTextHelpersTest; + +} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -59,7 +59,10 @@ #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ STATICMETHOD (obtain, "obtain", "(I)Landroid/view/accessibility/AccessibilityEvent;") \ METHOD (setPackageName, "setPackageName", "(Ljava/lang/CharSequence;)V") \ - METHOD (setSource, "setSource", "(Landroid/view/View;I)V") \ + METHOD (setSource, "setSource","(Landroid/view/View;I)V") \ + METHOD (setAction, "setAction", "(I)V") \ + METHOD (setFromIndex, "setFromIndex", "(I)V") \ + METHOD (setToIndex, "setToIndex", "(I)V") \ DECLARE_JNI_CLASS (AndroidAccessibilityEvent, "android/view/accessibility/AccessibilityEvent") #undef JNI_CLASS_MEMBERS @@ -74,13 +77,14 @@ { constexpr int HOST_VIEW_ID = -1; - constexpr int TYPE_VIEW_CLICKED = 0x00000001, - TYPE_VIEW_SELECTED = 0x00000004, - TYPE_VIEW_ACCESSIBILITY_FOCUSED = 0x00008000, - TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 0x00010000, - TYPE_WINDOW_CONTENT_CHANGED = 0x00000800, - TYPE_VIEW_TEXT_SELECTION_CHANGED = 0x00002000, - TYPE_VIEW_TEXT_CHANGED = 0x00000010; + constexpr int TYPE_VIEW_CLICKED = 0x00000001, + TYPE_VIEW_SELECTED = 0x00000004, + TYPE_VIEW_ACCESSIBILITY_FOCUSED = 0x00008000, + TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 0x00010000, + TYPE_WINDOW_CONTENT_CHANGED = 0x00000800, + TYPE_VIEW_TEXT_SELECTION_CHANGED = 0x00002000, + TYPE_VIEW_TEXT_CHANGED = 0x00000010, + TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 0x00020000; constexpr int CONTENT_CHANGE_TYPE_SUBTREE = 0x00000001, CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 0x00000004; @@ -198,8 +202,6 @@ return nullptr; } -void sendAccessibilityEventImpl (const AccessibilityHandler& handler, int eventType, int contentChangeTypes); - //============================================================================== class AccessibilityNativeHandle { @@ -377,7 +379,7 @@ { env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.setText, - javaString (textInterface->getText ({ 0, textInterface->getTotalNumCharacters() })).get()); + javaString (textInterface->getAllText()).get()); const auto isReadOnly = textInterface->isReadOnly(); @@ -481,10 +483,15 @@ case ACTION_CLICK: { + // Invoking the action may delete this handler + const WeakReference savedHandle { this }; + if ((accessibilityHandler.getCurrentState().isCheckable() && accessibilityHandler.getActions().invoke (AccessibilityActionType::toggle)) || accessibilityHandler.getActions().invoke (AccessibilityActionType::press)) { - sendAccessibilityEventImpl (accessibilityHandler, TYPE_VIEW_CLICKED, 0); + if (savedHandle != nullptr) + sendAccessibilityEventImpl (accessibilityHandler, TYPE_VIEW_CLICKED, 0); + return true; } @@ -556,7 +563,10 @@ return env->CallIntMethod (arguments, AndroidBundle.getInt, key.get()); }; - return { getKey (selectionStartKey), getKey (selectionEndKey) }; + const auto start = getKey (selectionStartKey); + const auto end = getKey (selectionEndKey); + + return Range::between (start, end); } return {}; @@ -636,6 +646,78 @@ bool isInPopulateNodeInfo() const noexcept { return inPopulateNodeInfo; } + static bool areAnyAccessibilityClientsActive() + { + auto* env = getEnv(); + auto appContext = getAppContext(); + + if (appContext.get() != nullptr) + { + LocalRef accessibilityManager (env->CallObjectMethod (appContext.get(), AndroidContext.getSystemService, + javaString ("accessibility").get())); + + if (accessibilityManager != nullptr) + return env->CallBooleanMethod (accessibilityManager.get(), AndroidAccessibilityManager.isEnabled); + } + + return false; + } + + template + static void sendAccessibilityEventExtendedImpl (const AccessibilityHandler& handler, + int eventType, + ModificationCallback&& modificationCallback) + { + if (! areAnyAccessibilityClientsActive()) + return; + + if (const auto sourceView = getSourceView (handler)) + { + const auto* nativeImpl = handler.getNativeImplementation(); + + if (nativeImpl == nullptr || nativeImpl->isInPopulateNodeInfo()) + return; + + auto* env = getEnv(); + auto appContext = getAppContext(); + + if (appContext.get() == nullptr) + return; + + LocalRef event (env->CallStaticObjectMethod (AndroidAccessibilityEvent, + AndroidAccessibilityEvent.obtain, + eventType)); + + env->CallVoidMethod (event, + AndroidAccessibilityEvent.setPackageName, + env->CallObjectMethod (appContext.get(), + AndroidContext.getPackageName)); + + env->CallVoidMethod (event, + AndroidAccessibilityEvent.setSource, + sourceView, + nativeImpl->getVirtualViewId()); + + modificationCallback (event); + + env->CallBooleanMethod (sourceView, + AndroidViewGroup.requestSendAccessibilityEvent, + sourceView, + event.get()); + } + } + + static void sendAccessibilityEventImpl (const AccessibilityHandler& handler, int eventType, int contentChangeTypes) + { + sendAccessibilityEventExtendedImpl (handler, eventType, [contentChangeTypes] (auto event) + { + if (contentChangeTypes != 0 && accessibilityEventSetContentChangeTypes != nullptr) + getEnv()->CallVoidMethod (event, + accessibilityEventSetContentChangeTypes, + contentChangeTypes); + }); + } + private: static std::unordered_map virtualViewIdMap; @@ -654,7 +736,7 @@ const auto valueString = [this]() -> String { if (auto* textInterface = accessibilityHandler.getTextInterface()) - return textInterface->getText ({ 0, textInterface->getTotalNumCharacters() }); + return textInterface->getAllText(); if (auto* valueInterface = accessibilityHandler.getValueInterface()) return valueInterface->getCurrentValueAsString(); @@ -674,66 +756,68 @@ bool moveCursor (jobject arguments, bool forwards) { - if (auto* textInterface = accessibilityHandler.getTextInterface()) - { - const auto granularityKey = javaString ("ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT"); - const auto extendSelectionKey = javaString ("ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN"); + using ATH = AccessibilityTextHelpers; - auto* env = getEnv(); - - const auto boundaryType = [&] - { - const auto granularity = env->CallIntMethod (arguments, - AndroidBundle.getInt, - granularityKey.get()); + auto* textInterface = accessibilityHandler.getTextInterface(); - using BoundaryType = AccessibilityTextHelpers::BoundaryType; + if (textInterface == nullptr) + return false; - switch (granularity) - { - case MOVEMENT_GRANULARITY_CHARACTER: return BoundaryType::character; - case MOVEMENT_GRANULARITY_WORD: return BoundaryType::word; - case MOVEMENT_GRANULARITY_LINE: return BoundaryType::line; - case MOVEMENT_GRANULARITY_PARAGRAPH: - case MOVEMENT_GRANULARITY_PAGE: return BoundaryType::document; - } + const auto granularityKey = javaString ("ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT"); + const auto extendSelectionKey = javaString ("ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN"); - jassertfalse; - return BoundaryType::character; - }(); + auto* env = getEnv(); - using Direction = AccessibilityTextHelpers::Direction; + const auto boundaryType = [&] + { + const auto granularity = env->CallIntMethod (arguments, AndroidBundle.getInt, granularityKey.get()); - const auto cursorPos = AccessibilityTextHelpers::findTextBoundary (*textInterface, - textInterface->getTextInsertionOffset(), - boundaryType, - forwards ? Direction::forwards - : Direction::backwards); + using BoundaryType = ATH::BoundaryType; - const auto newSelection = [&]() -> Range + switch (granularity) { - const auto currentSelection = textInterface->getSelection(); - const auto extendSelection = env->CallBooleanMethod (arguments, - AndroidBundle.getBoolean, - extendSelectionKey.get()); + case MOVEMENT_GRANULARITY_CHARACTER: return BoundaryType::character; + case MOVEMENT_GRANULARITY_WORD: return BoundaryType::word; + case MOVEMENT_GRANULARITY_LINE: return BoundaryType::line; + case MOVEMENT_GRANULARITY_PARAGRAPH: + case MOVEMENT_GRANULARITY_PAGE: return BoundaryType::document; + } - if (! extendSelection) - return { cursorPos, cursorPos }; + jassertfalse; + return BoundaryType::character; + }(); - const auto start = currentSelection.getStart(); - const auto end = currentSelection.getEnd(); + const auto direction = forwards + ? ATH::Direction::forwards + : ATH::Direction::backwards; + + const auto extend = env->CallBooleanMethod (arguments, AndroidBundle.getBoolean, extendSelectionKey.get()) + ? ATH::ExtendSelection::yes + : ATH::ExtendSelection::no; + + const auto oldSelection = textInterface->getSelection(); + const auto newSelection = ATH::findNewSelectionRangeAndroid (*textInterface, boundaryType, extend, direction); + textInterface->setSelection (newSelection); - if (forwards) - return { start, jmax (start, cursorPos) }; + // Required for Android to read back the text that the cursor moved over + sendAccessibilityEventExtendedImpl (accessibilityHandler, TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY, [&] (auto event) + { + env->CallVoidMethod (event, + AndroidAccessibilityEvent.setAction, + forwards ? ACTION_NEXT_AT_MOVEMENT_GRANULARITY : ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY); - return { jmin (start, cursorPos), end }; - }(); + env->CallVoidMethod (event, + AndroidAccessibilityEvent.setFromIndex, + oldSelection.getStart() != newSelection.getStart() ? oldSelection.getStart() + : oldSelection.getEnd()); - textInterface->setSelection (newSelection); - return true; - } + env->CallVoidMethod (event, + AndroidAccessibilityEvent.setToIndex, + oldSelection.getStart() != newSelection.getStart() ? newSelection.getStart() + : newSelection.getEnd()); + }); - return false; + return true; } AccessibilityHandler& accessibilityHandler; @@ -742,6 +826,8 @@ //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AccessibilityNativeHandle) + + JUCE_DECLARE_WEAK_REFERENCEABLE (AccessibilityNativeHandle) }; std::unordered_map AccessibilityNativeHandle::virtualViewIdMap; @@ -758,67 +844,6 @@ return nativeImpl.get(); } -static bool areAnyAccessibilityClientsActive() -{ - auto* env = getEnv(); - auto appContext = getAppContext(); - - if (appContext.get() != nullptr) - { - LocalRef accessibilityManager (env->CallObjectMethod (appContext.get(), AndroidContext.getSystemService, - javaString ("accessibility").get())); - - if (accessibilityManager != nullptr) - return env->CallBooleanMethod (accessibilityManager.get(), AndroidAccessibilityManager.isEnabled); - } - - return false; -} - -void sendAccessibilityEventImpl (const AccessibilityHandler& handler, int eventType, int contentChangeTypes) -{ - if (! areAnyAccessibilityClientsActive()) - return; - - if (const auto sourceView = getSourceView (handler)) - { - const auto* nativeImpl = handler.getNativeImplementation(); - - if (nativeImpl == nullptr || nativeImpl->isInPopulateNodeInfo()) - return; - - auto* env = getEnv(); - auto appContext = getAppContext(); - - if (appContext.get() == nullptr) - return; - - LocalRef event (env->CallStaticObjectMethod (AndroidAccessibilityEvent, - AndroidAccessibilityEvent.obtain, - eventType)); - - env->CallVoidMethod (event, - AndroidAccessibilityEvent.setPackageName, - env->CallObjectMethod (appContext.get(), - AndroidContext.getPackageName)); - - env->CallVoidMethod (event, - AndroidAccessibilityEvent.setSource, - sourceView, - nativeImpl->getVirtualViewId()); - - if (contentChangeTypes != 0 && accessibilityEventSetContentChangeTypes != nullptr) - env->CallVoidMethod (event, - accessibilityEventSetContentChangeTypes, - contentChangeTypes); - - env->CallBooleanMethod (sourceView, - AndroidViewGroup.requestSendAccessibilityEvent, - sourceView, - event.get()); - } -} - void notifyAccessibilityEventInternal (const AccessibilityHandler& handler, InternalAccessibilityEvent eventType) { @@ -827,7 +852,7 @@ || eventType == InternalAccessibilityEvent::elementMovedOrResized) { if (auto* parent = handler.getParent()) - sendAccessibilityEventImpl (*parent, TYPE_WINDOW_CONTENT_CHANGED, CONTENT_CHANGE_TYPE_SUBTREE); + AccessibilityNativeHandle::sendAccessibilityEventImpl (*parent, TYPE_WINDOW_CONTENT_CHANGED, CONTENT_CHANGE_TYPE_SUBTREE); return; } @@ -852,7 +877,7 @@ }(); if (notification != 0) - sendAccessibilityEventImpl (handler, notification, 0); + AccessibilityNativeHandle::sendAccessibilityEventImpl (handler, notification, 0); } void AccessibilityHandler::notifyAccessibilityEvent (AccessibilityEvent eventType) const @@ -885,13 +910,13 @@ return 0; }(); - sendAccessibilityEventImpl (*this, notification, contentChangeTypes); + AccessibilityNativeHandle::sendAccessibilityEventImpl (*this, notification, contentChangeTypes); } void AccessibilityHandler::postAnnouncement (const String& announcementString, AnnouncementPriority) { - if (! areAnyAccessibilityClientsActive()) + if (! AccessibilityNativeHandle::areAnyAccessibilityClientsActive()) return; const auto rootView = [] diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -41,31 +41,6 @@ #define JUCE_IOS_CONTAINER_API_AVAILABLE 1 #endif -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") - -constexpr auto juceUIAccessibilityContainerTypeNone = - #if JUCE_IOS_CONTAINER_API_AVAILABLE - UIAccessibilityContainerTypeNone; - #else - 0; - #endif - -constexpr auto juceUIAccessibilityContainerTypeDataTable = - #if JUCE_IOS_CONTAINER_API_AVAILABLE - UIAccessibilityContainerTypeDataTable; - #else - 1; - #endif - -constexpr auto juceUIAccessibilityContainerTypeList = - #if JUCE_IOS_CONTAINER_API_AVAILABLE - UIAccessibilityContainerTypeList; - #else - 2; - #endif - -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - #define JUCE_NATIVE_ACCESSIBILITY_INCLUDED 1 //============================================================================== @@ -164,7 +139,12 @@ if (auto* handler = getHandler (self)) { if (handler->getTableInterface() != nullptr) - return juceUIAccessibilityContainerTypeDataTable; + { + if (@available (iOS 11.0, *)) + return UIAccessibilityContainerTypeDataTable; + + return 1; // UIAccessibilityContainerTypeDataTable + } const auto role = handler->getRole(); @@ -172,11 +152,17 @@ || role == AccessibilityRole::list || role == AccessibilityRole::tree) { - return juceUIAccessibilityContainerTypeList; + if (@available (iOS 11.0, *)) + return UIAccessibilityContainerTypeList; + + return 2; // UIAccessibilityContainerTypeList } } - return juceUIAccessibilityContainerTypeNone; + if (@available (iOS 11.0, *)) + return UIAccessibilityContainerTypeNone; + + return 0; // UIAccessibilityContainerTypeNone } }; @@ -225,8 +211,11 @@ addMethod (@selector (accessibilityDataTableCellElementForRow:column:), getAccessibilityDataTableCellElementForRowColumn); addMethod (@selector (accessibilityRowCount), getAccessibilityRowCount); addMethod (@selector (accessibilityColumnCount), getAccessibilityColumnCount); + addProtocol (@protocol (UIAccessibilityContainerDataTable)); + addMethod (@selector (accessibilityRowRange), getAccessibilityRowIndexRange); addMethod (@selector (accessibilityColumnRange), getAccessibilityColumnIndexRange); + addProtocol (@protocol (UIAccessibilityContainerDataTableCell)); } #endif @@ -435,7 +424,7 @@ static id getAccessibilityDataTableCellElementForRowColumn (id self, SEL, NSUInteger row, NSUInteger column) { - if (auto* tableInterface = getTableInterface (self)) + if (auto* tableInterface = getEnclosingInterface (getHandler (self), &AccessibilityHandler::getTableInterface)) if (auto* cellHandler = tableInterface->getCellHandler ((int) row, (int) column)) return (id) cellHandler->getNativeImplementation(); diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,6 +23,7 @@ ============================================================================== */ +API_AVAILABLE (macos (10.10)) static void juceFreeAccessibilityPlatformSpecificData (NSAccessibilityElement*) {} namespace juce @@ -35,16 +36,17 @@ #define JUCE_NATIVE_ACCESSIBILITY_INCLUDED 1 -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") - //============================================================================== class AccessibilityHandler::AccessibilityNativeImpl { public: explicit AccessibilityNativeImpl (AccessibilityHandler& handler) - : accessibilityElement (AccessibilityElement::create (handler)) - {} + { + if (@available (macOS 10.10, *)) + accessibilityElement = AccessibilityElement::create (handler); + } + API_AVAILABLE (macos (10.10)) NSAccessibilityElement* getAccessibilityElement() const noexcept { return accessibilityElement.get(); @@ -52,7 +54,7 @@ private: //============================================================================== - class AccessibilityElement : public AccessibleObjCClass> + class API_AVAILABLE (macos (10.10)) AccessibilityElement : public AccessibleObjCClass> { public: static Holder create (AccessibilityHandler& handler) @@ -278,7 +280,7 @@ if (auto* handler = getHandler (self)) { if (handler->getCurrentState().isCheckable()) - return handler->getCurrentState().isChecked() ? @(1) : @(0); + return juceStringToNS (handler->getCurrentState().isChecked() ? TRANS ("On") : TRANS ("Off")); return getAccessibilityValueFromInterfaces (*handler); } @@ -830,6 +832,7 @@ }; //============================================================================== + API_AVAILABLE (macos (10.10)) AccessibilityElement::Holder accessibilityElement; //============================================================================== @@ -839,7 +842,10 @@ //============================================================================== AccessibilityNativeHandle* AccessibilityHandler::getNativeImplementation() const { - return (AccessibilityNativeHandle*) nativeImpl->getAccessibilityElement(); + if (@available (macOS 10.10, *)) + return (AccessibilityNativeHandle*) nativeImpl->getAccessibilityElement(); + + return nullptr; } static bool areAnyAccessibilityClientsActive() @@ -873,12 +879,15 @@ if (! areAnyAccessibilityClientsActive() || notification == NSAccessibilityNotificationName{}) return; - if (id accessibilityElement = (id) handler.getNativeImplementation()) + if (@available (macOS 10.9, *)) { - sendAccessibilityEvent (accessibilityElement, notification, - (notification == NSAccessibilityLayoutChangedNotification - ? @{ NSAccessibilityUIElementsKey: @[ accessibilityElement ] } - : nil)); + if (id accessibilityElement = (id) handler.getNativeImplementation()) + { + sendAccessibilityEvent (accessibilityElement, notification, + (notification == NSAccessibilityLayoutChangedNotification + ? @{ NSAccessibilityUIElementsKey: @[ accessibilityElement ] } + : nil)); + } } } @@ -937,10 +946,13 @@ if (! areAnyAccessibilityClientsActive()) return; - if (@available (macOS 10.10, *)) - { + if (@available (macOS 10.9, *)) + { auto nsPriority = [priority] { + // The below doesn't get noticed by the @available check above + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability") + switch (priority) { case AnnouncementPriority::low: return NSAccessibilityPriorityLow; @@ -950,6 +962,8 @@ jassertfalse; return NSAccessibilityPriorityLow; + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE }(); sendAccessibilityEvent ((id) [NSApp mainWindow], @@ -959,6 +973,4 @@ } } -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - } // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -71,6 +71,18 @@ static AccessibilityTableInterface* getTableInterface (id self) noexcept { return getInterface (self, &AccessibilityHandler::getTableInterface); } static AccessibilityCellInterface* getCellInterface (id self) noexcept { return getInterface (self, &AccessibilityHandler::getCellInterface); } + template + static auto getEnclosingInterface (AccessibilityHandler* handler, MemberFn fn) noexcept -> decltype ((std::declval().*fn)()) + { + if (handler == nullptr) + return nullptr; + + if (auto* interface = (handler->*fn)()) + return interface; + + return getEnclosingInterface (handler->getParent(), fn); + } + static bool hasEditableText (AccessibilityHandler& handler) noexcept { return handler.getRole() == AccessibilityRole::editableText diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -73,7 +73,7 @@ { uiaWrapper->disconnectProvider (provider); - if (providerCount == 0) + if (providerCount == 0 && JUCEApplicationBase::isStandaloneApp()) uiaWrapper->disconnectAllProviders(); } } @@ -206,10 +206,14 @@ { if (auto* valueInterface = getValueInterface()) { - VARIANT newValue; - VariantHelpers::setString (valueInterface->getCurrentValueAsString(), &newValue); + const auto propertyType = getRole() == AccessibilityRole::slider ? UIA_RangeValueValuePropertyId + : UIA_ValueValuePropertyId; - sendAccessibilityPropertyChangedEvent (*this, UIA_ValueValuePropertyId, newValue); + const auto value = getRole() == AccessibilityRole::slider + ? VariantHelpers::getWithValue (valueInterface->getCurrentValue()) + : VariantHelpers::getWithValue (valueInterface->getCurrentValueAsString()); + + sendAccessibilityPropertyChangedEvent (*this, propertyType, value); } return; @@ -284,12 +288,12 @@ //============================================================================== namespace WindowsAccessibility { - long getUiaRootObjectId() + static long getUiaRootObjectId() { return static_cast (UiaRootObjectId); } - bool handleWmGetObject (AccessibilityHandler* handler, WPARAM wParam, LPARAM lParam, LRESULT* res) + static bool handleWmGetObject (AccessibilityHandler* handler, WPARAM wParam, LPARAM lParam, LRESULT* res) { if (isStartingUpOrShuttingDown() || (handler == nullptr || ! isHandlerValid (*handler))) return false; @@ -308,7 +312,7 @@ return false; } - void revokeUIAMapEntriesForWindow (HWND hwnd) + static void revokeUIAMapEntriesForWindow (HWND hwnd) { if (auto* uiaWrapper = WindowsUIAWrapper::getInstanceWithoutCreating()) uiaWrapper->returnRawElementProvider (hwnd, 0, 0, nullptr); diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -28,6 +28,17 @@ namespace VariantHelpers { + namespace Detail + { + template + inline VARIANT getWithValueGeneric (Fn&& setter, ValueType value) + { + VARIANT result{}; + setter (value, &result); + return result; + } + } + inline void clear (VARIANT* variant) { variant->vt = VT_EMPTY; @@ -56,6 +67,9 @@ variant->vt = VT_R8; variant->dblVal = value; } + + inline VARIANT getWithValue (double value) { return Detail::getWithValueGeneric (&setDouble, value); } + inline VARIANT getWithValue (const String& value) { return Detail::getWithValueGeneric (&setString, value); } } inline JUCE_COMRESULT addHandlersToArray (const std::vector& handlers, SAFEARRAY** pRetVal) diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -246,17 +246,22 @@ if (auto* textInterface = owner->getHandler().getTextInterface()) { - const auto boundaryType = getBoundaryType (unit); + using ATH = AccessibilityTextHelpers; - const auto start = AccessibilityTextHelpers::findTextBoundary (*textInterface, - selectionRange.getStart(), - boundaryType, - AccessibilityTextHelpers::Direction::backwards); - - const auto end = AccessibilityTextHelpers::findTextBoundary (*textInterface, - start, - boundaryType, - AccessibilityTextHelpers::Direction::forwards); + const auto boundaryType = getBoundaryType (unit); + const auto start = ATH::findTextBoundary (*textInterface, + selectionRange.getStart(), + boundaryType, + ATH::Direction::backwards, + ATH::IncludeThisBoundary::yes, + ATH::IncludeWhitespaceAfterWords::no); + + const auto end = ATH::findTextBoundary (*textInterface, + start, + boundaryType, + ATH::Direction::forwards, + ATH::IncludeThisBoundary::no, + ATH::IncludeWhitespaceAfterWords::yes); selectionRange = Range (start, end); @@ -411,19 +416,39 @@ JUCE_COMRESULT Move (ComTypes::TextUnit unit, int count, int* pRetVal) override { - return owner->withTextInterface (pRetVal, [&] (const AccessibilityTextInterface&) + return owner->withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface) { - if (count > 0) - { - MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_End, unit, count, pRetVal); - MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_Start, unit, count, pRetVal); - } - else if (count < 0) + using ATH = AccessibilityTextHelpers; + + const auto boundaryType = getBoundaryType (unit); + const auto previousUnitBoundary = ATH::findTextBoundary (textInterface, + selectionRange.getStart(), + boundaryType, + ATH::Direction::backwards, + ATH::IncludeThisBoundary::yes, + ATH::IncludeWhitespaceAfterWords::no); + + auto numMoved = 0; + auto movedEndpoint = previousUnitBoundary; + + for (; numMoved < std::abs (count); ++numMoved) { - MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_Start, unit, count, pRetVal); - MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_End, unit, count, pRetVal); + const auto nextEndpoint = ATH::findTextBoundary (textInterface, + movedEndpoint, + boundaryType, + count > 0 ? ATH::Direction::forwards : ATH::Direction::backwards, + ATH::IncludeThisBoundary::no, + count > 0 ? ATH::IncludeWhitespaceAfterWords::yes : ATH::IncludeWhitespaceAfterWords::no); + + if (nextEndpoint == movedEndpoint) + break; + + movedEndpoint = nextEndpoint; } + *pRetVal = numMoved; + + ExpandToEnclosingUnit (unit); return S_OK; }); } @@ -461,34 +486,37 @@ if (count == 0 || textInterface.getTotalNumCharacters() == 0) return S_OK; - auto endpointToMove = (endpoint == ComTypes::TextPatternRangeEndpoint_Start ? selectionRange.getStart() - : selectionRange.getEnd()); + const auto endpointToMove = (endpoint == ComTypes::TextPatternRangeEndpoint_Start ? selectionRange.getStart() + : selectionRange.getEnd()); - const auto direction = (count > 0 ? AccessibilityTextHelpers::Direction::forwards - : AccessibilityTextHelpers::Direction::backwards); + using ATH = AccessibilityTextHelpers; - const auto boundaryType = getBoundaryType (unit); + const auto direction = (count > 0 ? ATH::Direction::forwards + : ATH::Direction::backwards); - // handle case where endpoint is on a boundary - if (AccessibilityTextHelpers::findTextBoundary (textInterface, endpointToMove, boundaryType, direction) == endpointToMove) - endpointToMove += (direction == AccessibilityTextHelpers::Direction::forwards ? 1 : -1); + const auto boundaryType = getBoundaryType (unit); + auto movedEndpoint = endpointToMove; - int numMoved; - for (numMoved = 0; numMoved < std::abs (count); ++numMoved) + int numMoved = 0; + for (; numMoved < std::abs (count); ++numMoved) { - auto nextEndpoint = AccessibilityTextHelpers::findTextBoundary (textInterface, - endpointToMove, - boundaryType, - direction); + auto nextEndpoint = ATH::findTextBoundary (textInterface, + movedEndpoint, + boundaryType, + direction, + ATH::IncludeThisBoundary::no, + direction == ATH::Direction::forwards ? ATH::IncludeWhitespaceAfterWords::yes + : ATH::IncludeWhitespaceAfterWords::no); - if (nextEndpoint == endpointToMove) + if (nextEndpoint == movedEndpoint) break; - endpointToMove = nextEndpoint; + movedEndpoint = nextEndpoint; } *pRetVal = numMoved; - setEndpointChecked (endpoint, endpointToMove); + + setEndpointChecked (endpoint, movedEndpoint); return S_OK; }); diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java juce-7.0.0~ds0/modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java --- juce-6.1.5~ds0/modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderCursor.java juce-7.0.0~ds0/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderCursor.java --- juce-6.1.5~ds0/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderCursor.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderCursor.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java juce-7.0.0~ds0/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java --- juce-6.1.5~ds0/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceActivity.java juce-7.0.0~ds0/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceActivity.java --- juce-6.1.5~ds0/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceActivity.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceActivity.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -33,6 +33,7 @@ { //============================================================================== private native void appNewIntent (Intent intent); + private native void appOnResume(); @Override protected void onNewIntent (Intent intent) @@ -42,4 +43,12 @@ appNewIntent (intent); } + + @Override + protected void onResume() + { + super.onResume(); + + appOnResume(); + } } diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceSharingContentProvider.java juce-7.0.0~ds0/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceSharingContentProvider.java --- juce-6.1.5~ds0/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceSharingContentProvider.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceSharingContentProvider.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_android_ContentSharer.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_android_ContentSharer.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_android_ContentSharer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_android_ContentSharer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -337,7 +337,7 @@ canSpecifyMimeTypes = fileExtension.isNotEmpty(); if (canSpecifyMimeTypes) - mimeTypes.addArray (getMimeTypesForFileExtension (fileExtension)); + mimeTypes.addArray (MimeTypeTable::getMimeTypesForFileExtension (fileExtension)); else mimeTypes.clear(); @@ -597,8 +597,8 @@ if (extension.isEmpty()) return nullptr; - return juceStringArrayToJava (filterMimeTypes (getMimeTypesForFileExtension (extension), - juceString (mimeTypeFilter.get()))); + return juceStringArrayToJava (filterMimeTypes (MimeTypeTable::getMimeTypesForFileExtension (extension), + juceString (mimeTypeFilter.get()))); } void sharingFinished (int resultCode) diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_android_FileChooser.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_android_FileChooser.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_android_FileChooser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_android_FileChooser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,19 @@ namespace juce { +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getItemCount, "getItemCount", "()I") \ + METHOD (getItemAt, "getItemAt", "(I)Landroid/content/ClipData$Item;") + +DECLARE_JNI_CLASS (ClipData, "android/content/ClipData") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getUri, "getUri", "()Landroid/net/Uri;") + +DECLARE_JNI_CLASS (ClipDataItem, "android/content/ClipData$Item") +#undef JNI_CLASS_MEMBERS + class FileChooser::Native : public FileChooser::Pimpl { public: @@ -40,6 +53,7 @@ auto sdkVersion = getAndroidSDKVersion(); auto saveMode = ((flags & FileBrowserComponent::saveMode) != 0); auto selectsDirectories = ((flags & FileBrowserComponent::canSelectDirectories) != 0); + auto canSelectMultiple = ((flags & FileBrowserComponent::canSelectMultipleItems) != 0); // You cannot save a directory jassert (! (saveMode && selectsDirectories)); @@ -85,6 +99,13 @@ uri.get()); } + if (canSelectMultiple && sdkVersion >= 18) + { + env->CallObjectMethod (intent.get(), + AndroidIntent.putExtraBool, + javaString ("android.intent.extra.ALLOW_MULTIPLE").get(), + true); + } if (! selectsDirectories) { @@ -169,22 +190,41 @@ currentFileChooser = nullptr; auto* env = getEnv(); - Array chosenURLs; - - if (resultCode == /*Activity.RESULT_OK*/ -1 && intentData != nullptr) + const auto getUrls = [&]() -> Array { - LocalRef uri (env->CallObjectMethod (intentData.get(), AndroidIntent.getData)); + if (resultCode != /*Activity.RESULT_OK*/ -1 || intentData == nullptr) + return {}; - if (uri != nullptr) - { - auto jStr = (jstring) env->CallObjectMethod (uri, JavaObject.toString); + Array chosenURLs; - if (jStr != nullptr) + const auto addUrl = [env, &chosenURLs] (jobject uri) + { + if (auto jStr = (jstring) env->CallObjectMethod (uri, JavaObject.toString)) chosenURLs.add (URL (juceString (env, jStr))); + }; + + if (LocalRef clipData { env->CallObjectMethod (intentData.get(), AndroidIntent.getClipData) }) + { + const auto count = env->CallIntMethod (clipData.get(), ClipData.getItemCount); + + for (auto i = 0; i < count; ++i) + { + if (LocalRef item { env->CallObjectMethod (clipData.get(), ClipData.getItemAt, i) }) + { + if (LocalRef itemUri { env->CallObjectMethod (item.get(), ClipDataItem.getUri) }) + addUrl (itemUri.get()); + } + } } - } + else if (LocalRef uri { env->CallObjectMethod (intentData.get(), AndroidIntent.getData )}) + { + addUrl (uri.get()); + } + + return chosenURLs; + }; - owner.finished (chosenURLs); + owner.finished (getUrls()); } static Native* currentFileChooser; @@ -200,7 +240,7 @@ { auto extension = wildcard.fromLastOccurrenceOf (".", false, false); - result.addArray (getMimeTypesForFileExtension (extension)); + result.addArray (MimeTypeTable::getMimeTypesForFileExtension (extension)); } } diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_android_Windowing.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_android_Windowing.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_android_Windowing.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_android_Windowing.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -126,12 +126,18 @@ //============================================================================== #if JUCE_PUSH_NOTIFICATIONS && JUCE_MODULE_AVAILABLE_juce_gui_extra - extern bool juce_handleNotificationIntent (void*); - extern void juce_firebaseDeviceNotificationsTokenRefreshed (void*); - extern void juce_firebaseRemoteNotificationReceived (void*); - extern void juce_firebaseRemoteMessagesDeleted(); - extern void juce_firebaseRemoteMessageSent(void*); - extern void juce_firebaseRemoteMessageSendError (void*, void*); + bool juce_handleNotificationIntent (void*); + void juce_firebaseDeviceNotificationsTokenRefreshed (void*); + void juce_firebaseRemoteNotificationReceived (void*); + void juce_firebaseRemoteMessagesDeleted(); + void juce_firebaseRemoteMessageSent(void*); + void juce_firebaseRemoteMessageSendError (void*, void*); +#endif + +#if JUCE_IN_APP_PURCHASES && JUCE_MODULE_AVAILABLE_juce_product_unlocking + void juce_handleOnResume(); +#else + static void juce_handleOnResume() {} #endif //============================================================================== @@ -631,6 +637,12 @@ (float) localPos.y * scale)); } + OptionalBorderSize getFrameSizeIfPresent() const override + { + // TODO + return {}; + } + BorderSize getFrameSize() const override { // TODO @@ -673,8 +685,8 @@ handleMouseEvent (MouseInputSource::InputSourceType::touch, pos, ModifierKeys::currentModifiers.withoutMouseButtons(), - MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, + MouseInputSource::defaultPressure, + MouseInputSource::defaultOrientation, time, {}, index); @@ -696,8 +708,8 @@ handleMouseEvent (MouseInputSource::InputSourceType::touch, pos, ModifierKeys::currentModifiers.withoutMouseButtons().withFlags (ModifierKeys::leftButtonModifier), - MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, + MouseInputSource::defaultPressure, + MouseInputSource::defaultOrientation, time, {}, index); @@ -717,8 +729,8 @@ handleMouseEvent (MouseInputSource::InputSourceType::touch, pos, ModifierKeys::currentModifiers.withoutMouseButtons(), - MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, + MouseInputSource::defaultPressure, + MouseInputSource::defaultOrientation, time, {}, index); @@ -744,11 +756,11 @@ { case ACTION_HOVER_ENTER: case ACTION_HOVER_MOVE: - sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_ENTER, 0); + AccessibilityNativeHandle::sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_ENTER, 0); break; case ACTION_HOVER_EXIT: - sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_EXIT, 0); + AccessibilityNativeHandle::sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_EXIT, 0); break; } } @@ -930,11 +942,13 @@ void dismissPendingTextInput() override { + closeInputMethodContext(); + view.callVoidMethod (ComponentPeerView.showKeyboard, javaString ("").get()); if (! isTimerRunning()) startTimer (500); - } + } //============================================================================== void handlePaintCallback (jobject canvas, jobject paint) @@ -1207,7 +1221,9 @@ bm.lineStride = width * static_cast (sizeof (jint)); bm.pixelStride = static_cast (sizeof (jint)); bm.pixelFormat = Image::ARGB; - bm.data = (uint8*) (data + x + y * width); + const auto offset = (size_t) x + (size_t) y * (size_t) width; + bm.data = (uint8*) (data + offset); + bm.size = sizeof (jint) * (((size_t) height * (size_t) width) - offset); } ImagePixelData::Ptr clone() override @@ -2083,7 +2099,8 @@ struct JuceActivityNewIntentListener { #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - CALLBACK (appNewIntent, "appNewIntent", "(Landroid/content/Intent;)V") + CALLBACK (appNewIntent, "appNewIntent", "(Landroid/content/Intent;)V") \ + CALLBACK (appOnResume, "appOnResume", "()V") DECLARE_JNI_CLASS (JavaActivity, JUCE_PUSH_NOTIFICATIONS_ACTIVITY) #undef JNI_CLASS_MEMBERS @@ -2092,6 +2109,11 @@ { juce_handleNotificationIntent (static_cast (intentData)); } + + static void JNICALL appOnResume (JNIEnv*, jobject) + { + juce_handleOnResume(); + } }; JuceActivityNewIntentListener::JavaActivity_Class JuceActivityNewIntentListener::JavaActivity; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_common_MimeTypes.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_common_MimeTypes.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_common_MimeTypes.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_common_MimeTypes.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,693 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-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. - - ============================================================================== -*/ - -namespace juce -{ - -struct MimeTypeTableEntry -{ - const char* fileExtension, *mimeType; - - static MimeTypeTableEntry table[641]; -}; - -static StringArray getMimeTypesForFileExtension (const String& fileExtension) -{ - StringArray result; - - for (auto type : MimeTypeTableEntry::table) - if (fileExtension == type.fileExtension) - result.add (type.mimeType); - - return result; -} - -//============================================================================== -MimeTypeTableEntry MimeTypeTableEntry::table[641] = -{ - {"3dm", "x-world/x-3dmf"}, - {"3dmf", "x-world/x-3dmf"}, - {"a", "application/octet-stream"}, - {"aab", "application/x-authorware-bin"}, - {"aam", "application/x-authorware-map"}, - {"aas", "application/x-authorware-seg"}, - {"abc", "text/vnd.abc"}, - {"acgi", "text/html"}, - {"afl", "video/animaflex"}, - {"ai", "application/postscript"}, - {"aif", "audio/aiff"}, - {"aif", "audio/x-aiff"}, - {"aifc", "audio/aiff"}, - {"aifc", "audio/x-aiff"}, - {"aiff", "audio/aiff"}, - {"aiff", "audio/x-aiff"}, - {"aim", "application/x-aim"}, - {"aip", "text/x-audiosoft-intra"}, - {"ani", "application/x-navi-animation"}, - {"aos", "application/x-nokia-9000-communicator-add-on-software"}, - {"aps", "application/mime"}, - {"arc", "application/octet-stream"}, - {"arj", "application/arj"}, - {"arj", "application/octet-stream"}, - {"art", "image/x-jg"}, - {"asf", "video/x-ms-asf"}, - {"asm", "text/x-asm"}, - {"asp", "text/asp"}, - {"asx", "application/x-mplayer2"}, - {"asx", "video/x-ms-asf"}, - {"asx", "video/x-ms-asf-plugin"}, - {"au", "audio/basic"}, - {"au", "audio/x-au"}, - {"avi", "application/x-troff-msvideo"}, - {"avi", "video/avi"}, - {"avi", "video/msvideo"}, - {"avi", "video/x-msvideo"}, - {"avs", "video/avs-video"}, - {"bcpio", "application/x-bcpio"}, - {"bin", "application/mac-binary"}, - {"bin", "application/macbinary"}, - {"bin", "application/octet-stream"}, - {"bin", "application/x-binary"}, - {"bin", "application/x-macbinary"}, - {"bm", "image/bmp"}, - {"bmp", "image/bmp"}, - {"bmp", "image/x-windows-bmp"}, - {"boo", "application/book"}, - {"book", "application/book"}, - {"boz", "application/x-bzip2"}, - {"bsh", "application/x-bsh"}, - {"bz", "application/x-bzip"}, - {"bz2", "application/x-bzip2"}, - {"c", "text/plain"}, - {"c", "text/x-c"}, - {"c++", "text/plain"}, - {"cat", "application/vnd.ms-pki.seccat"}, - {"cc", "text/plain"}, - {"cc", "text/x-c"}, - {"ccad", "application/clariscad"}, - {"cco", "application/x-cocoa"}, - {"cdf", "application/cdf"}, - {"cdf", "application/x-cdf"}, - {"cdf", "application/x-netcdf"}, - {"cer", "application/pkix-cert"}, - {"cer", "application/x-x509-ca-cert"}, - {"cha", "application/x-chat"}, - {"chat", "application/x-chat"}, - {"class", "application/java"}, - {"class", "application/java-byte-code"}, - {"class", "application/x-java-class"}, - {"com", "application/octet-stream"}, - {"com", "text/plain"}, - {"conf", "text/plain"}, - {"cpio", "application/x-cpio"}, - {"cpp", "text/x-c"}, - {"cpt", "application/mac-compactpro"}, - {"cpt", "application/x-compactpro"}, - {"cpt", "application/x-cpt"}, - {"crl", "application/pkcs-crl"}, - {"crl", "application/pkix-crl"}, - {"crt", "application/pkix-cert"}, - {"crt", "application/x-x509-ca-cert"}, - {"crt", "application/x-x509-user-cert"}, - {"csh", "application/x-csh"}, - {"csh", "text/x-script.csh"}, - {"css", "application/x-pointplus"}, - {"css", "text/css"}, - {"cxx", "text/plain"}, - {"dcr", "application/x-director"}, - {"deepv", "application/x-deepv"}, - {"def", "text/plain"}, - {"der", "application/x-x509-ca-cert"}, - {"dif", "video/x-dv"}, - {"dir", "application/x-director"}, - {"dl", "video/dl"}, - {"dl", "video/x-dl"}, - {"doc", "application/msword"}, - {"dot", "application/msword"}, - {"dp", "application/commonground"}, - {"drw", "application/drafting"}, - {"dump", "application/octet-stream"}, - {"dv", "video/x-dv"}, - {"dvi", "application/x-dvi"}, - {"dwf", "drawing/x-dwf"}, - {"dwf", "model/vnd.dwf"}, - {"dwg", "application/acad"}, - {"dwg", "image/vnd.dwg"}, - {"dwg", "image/x-dwg"}, - {"dxf", "application/dxf"}, - {"dxf", "image/vnd.dwg"}, - {"dxf", "image/x-dwg"}, - {"dxr", "application/x-director"}, - {"el", "text/x-script.elisp"}, - {"elc", "application/x-bytecode.elisp"}, - {"elc", "application/x-elc"}, - {"env", "application/x-envoy"}, - {"eps", "application/postscript"}, - {"es", "application/x-esrehber"}, - {"etx", "text/x-setext"}, - {"evy", "application/envoy"}, - {"evy", "application/x-envoy"}, - {"exe", "application/octet-stream"}, - {"f", "text/plain"}, - {"f", "text/x-fortran"}, - {"f77", "text/x-fortran"}, - {"f90", "text/plain"}, - {"f90", "text/x-fortran"}, - {"fdf", "application/vnd.fdf"}, - {"fif", "application/fractals"}, - {"fif", "image/fif"}, - {"fli", "video/fli"}, - {"fli", "video/x-fli"}, - {"flo", "image/florian"}, - {"flx", "text/vnd.fmi.flexstor"}, - {"fmf", "video/x-atomic3d-feature"}, - {"for", "text/plain"}, - {"for", "text/x-fortran"}, - {"fpx", "image/vnd.fpx"}, - {"fpx", "image/vnd.net-fpx"}, - {"frl", "application/freeloader"}, - {"funk", "audio/make"}, - {"g", "text/plain"}, - {"g3", "image/g3fax"}, - {"gif", "image/gif"}, - {"gl", "video/gl"}, - {"gl", "video/x-gl"}, - {"gsd", "audio/x-gsm"}, - {"gsm", "audio/x-gsm"}, - {"gsp", "application/x-gsp"}, - {"gss", "application/x-gss"}, - {"gtar", "application/x-gtar"}, - {"gz", "application/x-compressed"}, - {"gz", "application/x-gzip"}, - {"gzip", "application/x-gzip"}, - {"gzip", "multipart/x-gzip"}, - {"h", "text/plain"}, - {"h", "text/x-h"}, - {"hdf", "application/x-hdf"}, - {"help", "application/x-helpfile"}, - {"hgl", "application/vnd.hp-hpgl"}, - {"hh", "text/plain"}, - {"hh", "text/x-h"}, - {"hlb", "text/x-script"}, - {"hlp", "application/hlp"}, - {"hlp", "application/x-helpfile"}, - {"hlp", "application/x-winhelp"}, - {"hpg", "application/vnd.hp-hpgl"}, - {"hpgl", "application/vnd.hp-hpgl"}, - {"hqx", "application/binhex"}, - {"hqx", "application/binhex4"}, - {"hqx", "application/mac-binhex"}, - {"hqx", "application/mac-binhex40"}, - {"hqx", "application/x-binhex40"}, - {"hqx", "application/x-mac-binhex40"}, - {"hta", "application/hta"}, - {"htc", "text/x-component"}, - {"htm", "text/html"}, - {"html", "text/html"}, - {"htmls", "text/html"}, - {"htt", "text/webviewhtml"}, - {"htx", "text/html"}, - {"ice", "x-conference/x-cooltalk"}, - {"ico", "image/x-icon"}, - {"idc", "text/plain"}, - {"ief", "image/ief"}, - {"iefs", "image/ief"}, - {"iges", "application/iges"}, - {"iges", "model/iges"}, - {"igs", "application/iges"}, - {"igs", "model/iges"}, - {"ima", "application/x-ima"}, - {"imap", "application/x-httpd-imap"}, - {"inf", "application/inf"}, - {"ins", "application/x-internett-signup"}, - {"ip", "application/x-ip2"}, - {"isu", "video/x-isvideo"}, - {"it", "audio/it"}, - {"iv", "application/x-inventor"}, - {"ivr", "i-world/i-vrml"}, - {"ivy", "application/x-livescreen"}, - {"jam", "audio/x-jam"}, - {"jav", "text/plain"}, - {"jav", "text/x-java-source"}, - {"java", "text/plain"}, - {"java", "text/x-java-source"}, - {"jcm", "application/x-java-commerce"}, - {"jfif", "image/jpeg"}, - {"jfif", "image/pjpeg"}, - {"jpe", "image/jpeg"}, - {"jpe", "image/pjpeg"}, - {"jpeg", "image/jpeg"}, - {"jpeg", "image/pjpeg"}, - {"jpg", "image/jpeg"}, - {"jpg", "image/pjpeg"}, - {"jps", "image/x-jps"}, - {"js", "application/x-javascript"}, - {"jut", "image/jutvision"}, - {"kar", "audio/midi"}, - {"kar", "music/x-karaoke"}, - {"ksh", "application/x-ksh"}, - {"ksh", "text/x-script.ksh"}, - {"la", "audio/nspaudio"}, - {"la", "audio/x-nspaudio"}, - {"lam", "audio/x-liveaudio"}, - {"latex", "application/x-latex"}, - {"lha", "application/lha"}, - {"lha", "application/octet-stream"}, - {"lha", "application/x-lha"}, - {"lhx", "application/octet-stream"}, - {"list", "text/plain"}, - {"lma", "audio/nspaudio"}, - {"lma", "audio/x-nspaudio"}, - {"log", "text/plain"}, - {"lsp", "application/x-lisp"}, - {"lsp", "text/x-script.lisp"}, - {"lst", "text/plain"}, - {"lsx", "text/x-la-asf"}, - {"ltx", "application/x-latex"}, - {"lzh", "application/octet-stream"}, - {"lzh", "application/x-lzh"}, - {"lzx", "application/lzx"}, - {"lzx", "application/octet-stream"}, - {"lzx", "application/x-lzx"}, - {"m", "text/plain"}, - {"m", "text/x-m"}, - {"m1v", "video/mpeg"}, - {"m2a", "audio/mpeg"}, - {"m2v", "video/mpeg"}, - {"m3u", "audio/x-mpequrl"}, - {"man", "application/x-troff-man"}, - {"map", "application/x-navimap"}, - {"mar", "text/plain"}, - {"mbd", "application/mbedlet"}, - {"mc$", "application/x-magic-cap-package-1.0"}, - {"mcd", "application/mcad"}, - {"mcd", "application/x-mathcad"}, - {"mcf", "image/vasa"}, - {"mcf", "text/mcf"}, - {"mcp", "application/netmc"}, - {"me", "application/x-troff-me"}, - {"mht", "message/rfc822"}, - {"mhtml", "message/rfc822"}, - {"mid", "application/x-midi"}, - {"mid", "audio/midi"}, - {"mid", "audio/x-mid"}, - {"mid", "audio/x-midi"}, - {"mid", "music/crescendo"}, - {"mid", "x-music/x-midi"}, - {"midi", "application/x-midi"}, - {"midi", "audio/midi"}, - {"midi", "audio/x-mid"}, - {"midi", "audio/x-midi"}, - {"midi", "music/crescendo"}, - {"midi", "x-music/x-midi"}, - {"mif", "application/x-frame"}, - {"mif", "application/x-mif"}, - {"mime", "message/rfc822"}, - {"mime", "www/mime"}, - {"mjf", "audio/x-vnd.audioexplosion.mjuicemediafile"}, - {"mjpg", "video/x-motion-jpeg"}, - {"mm", "application/base64"}, - {"mm", "application/x-meme"}, - {"mme", "application/base64"}, - {"mod", "audio/mod"}, - {"mod", "audio/x-mod"}, - {"moov", "video/quicktime"}, - {"mov", "video/quicktime"}, - {"movie", "video/x-sgi-movie"}, - {"mp2", "audio/mpeg"}, - {"mp2", "audio/x-mpeg"}, - {"mp2", "video/mpeg"}, - {"mp2", "video/x-mpeg"}, - {"mp2", "video/x-mpeq2a"}, - {"mp3", "audio/mpeg"}, - {"mp3", "audio/mpeg3"}, - {"mp3", "audio/x-mpeg-3"}, - {"mp3", "video/mpeg"}, - {"mp3", "video/x-mpeg"}, - {"mpa", "audio/mpeg"}, - {"mpa", "video/mpeg"}, - {"mpc", "application/x-project"}, - {"mpe", "video/mpeg"}, - {"mpeg", "video/mpeg"}, - {"mpg", "audio/mpeg"}, - {"mpg", "video/mpeg"}, - {"mpga", "audio/mpeg"}, - {"mpp", "application/vnd.ms-project"}, - {"mpt", "application/x-project"}, - {"mpv", "application/x-project"}, - {"mpx", "application/x-project"}, - {"mrc", "application/marc"}, - {"ms", "application/x-troff-ms"}, - {"mv", "video/x-sgi-movie"}, - {"my", "audio/make"}, - {"mzz", "application/x-vnd.audioexplosion.mzz"}, - {"nap", "image/naplps"}, - {"naplps", "image/naplps"}, - {"nc", "application/x-netcdf"}, - {"ncm", "application/vnd.nokia.configuration-message"}, - {"nif", "image/x-niff"}, - {"niff", "image/x-niff"}, - {"nix", "application/x-mix-transfer"}, - {"nsc", "application/x-conference"}, - {"nvd", "application/x-navidoc"}, - {"o", "application/octet-stream"}, - {"oda", "application/oda"}, - {"omc", "application/x-omc"}, - {"omcd", "application/x-omcdatamaker"}, - {"omcr", "application/x-omcregerator"}, - {"p", "text/x-pascal"}, - {"p10", "application/pkcs10"}, - {"p10", "application/x-pkcs10"}, - {"p12", "application/pkcs-12"}, - {"p12", "application/x-pkcs12"}, - {"p7a", "application/x-pkcs7-signature"}, - {"p7c", "application/pkcs7-mime"}, - {"p7c", "application/x-pkcs7-mime"}, - {"p7m", "application/pkcs7-mime"}, - {"p7m", "application/x-pkcs7-mime"}, - {"p7r", "application/x-pkcs7-certreqresp"}, - {"p7s", "application/pkcs7-signature"}, - {"part", "application/pro_eng"}, - {"pas", "text/pascal"}, - {"pbm", "image/x-portable-bitmap"}, - {"pcl", "application/vnd.hp-pcl"}, - {"pcl", "application/x-pcl"}, - {"pct", "image/x-pict"}, - {"pcx", "image/x-pcx"}, - {"pdb", "chemical/x-pdb"}, - {"pdf", "application/pdf"}, - {"pfunk", "audio/make"}, - {"pfunk", "audio/make.my.funk"}, - {"pgm", "image/x-portable-graymap"}, - {"pgm", "image/x-portable-greymap"}, - {"pic", "image/pict"}, - {"pict", "image/pict"}, - {"pkg", "application/x-newton-compatible-pkg"}, - {"pko", "application/vnd.ms-pki.pko"}, - {"pl", "text/plain"}, - {"pl", "text/x-script.perl"}, - {"plx", "application/x-pixclscript"}, - {"pm", "image/x-xpixmap"}, - {"pm", "text/x-script.perl-module"}, - {"pm4", "application/x-pagemaker"}, - {"pm5", "application/x-pagemaker"}, - {"png", "image/png"}, - {"pnm", "application/x-portable-anymap"}, - {"pnm", "image/x-portable-anymap"}, - {"pot", "application/mspowerpoint"}, - {"pot", "application/vnd.ms-powerpoint"}, - {"pov", "model/x-pov"}, - {"ppa", "application/vnd.ms-powerpoint"}, - {"ppm", "image/x-portable-pixmap"}, - {"pps", "application/mspowerpoint"}, - {"pps", "application/vnd.ms-powerpoint"}, - {"ppt", "application/mspowerpoint"}, - {"ppt", "application/powerpoint"}, - {"ppt", "application/vnd.ms-powerpoint"}, - {"ppt", "application/x-mspowerpoint"}, - {"ppz", "application/mspowerpoint"}, - {"pre", "application/x-freelance"}, - {"prt", "application/pro_eng"}, - {"ps", "application/postscript"}, - {"psd", "application/octet-stream"}, - {"pvu", "paleovu/x-pv"}, - {"pwz", "application/vnd.ms-powerpoint"}, - {"py", "text/x-script.python"}, - {"pyc", "application/x-bytecode.python"}, - {"qcp", "audio/vnd.qcelp"}, - {"qd3", "x-world/x-3dmf"}, - {"qd3d", "x-world/x-3dmf"}, - {"qif", "image/x-quicktime"}, - {"qt", "video/quicktime"}, - {"qtc", "video/x-qtc"}, - {"qti", "image/x-quicktime"}, - {"qtif", "image/x-quicktime"}, - {"ra", "audio/x-pn-realaudio"}, - {"ra", "audio/x-pn-realaudio-plugin"}, - {"ra", "audio/x-realaudio"}, - {"ram", "audio/x-pn-realaudio"}, - {"ras", "application/x-cmu-raster"}, - {"ras", "image/cmu-raster"}, - {"ras", "image/x-cmu-raster"}, - {"rast", "image/cmu-raster"}, - {"rexx", "text/x-script.rexx"}, - {"rf", "image/vnd.rn-realflash"}, - {"rgb", "image/x-rgb"}, - {"rm", "application/vnd.rn-realmedia"}, - {"rm", "audio/x-pn-realaudio"}, - {"rmi", "audio/mid"}, - {"rmm", "audio/x-pn-realaudio"}, - {"rmp", "audio/x-pn-realaudio"}, - {"rmp", "audio/x-pn-realaudio-plugin"}, - {"rng", "application/ringing-tones"}, - {"rng", "application/vnd.nokia.ringing-tone"}, - {"rnx", "application/vnd.rn-realplayer"}, - {"roff", "application/x-troff"}, - {"rp", "image/vnd.rn-realpix"}, - {"rpm", "audio/x-pn-realaudio-plugin"}, - {"rt", "text/richtext"}, - {"rt", "text/vnd.rn-realtext"}, - {"rtf", "application/rtf"}, - {"rtf", "application/x-rtf"}, - {"rtf", "text/richtext"}, - {"rtx", "application/rtf"}, - {"rtx", "text/richtext"}, - {"rv", "video/vnd.rn-realvideo"}, - {"s", "text/x-asm"}, - {"s3m", "audio/s3m"}, - {"saveme", "application/octet-stream"}, - {"sbk", "application/x-tbook"}, - {"scm", "application/x-lotusscreencam"}, - {"scm", "text/x-script.guile"}, - {"scm", "text/x-script.scheme"}, - {"scm", "video/x-scm"}, - {"sdml", "text/plain"}, - {"sdp", "application/sdp"}, - {"sdp", "application/x-sdp"}, - {"sdr", "application/sounder"}, - {"sea", "application/sea"}, - {"sea", "application/x-sea"}, - {"set", "application/set"}, - {"sgm", "text/sgml"}, - {"sgm", "text/x-sgml"}, - {"sgml", "text/sgml"}, - {"sgml", "text/x-sgml"}, - {"sh", "application/x-bsh"}, - {"sh", "application/x-sh"}, - {"sh", "application/x-shar"}, - {"sh", "text/x-script.sh"}, - {"shar", "application/x-bsh"}, - {"shar", "application/x-shar"}, - {"shtml", "text/html"}, - {"shtml", "text/x-server-parsed-html"}, - {"sid", "audio/x-psid"}, - {"sit", "application/x-sit"}, - {"sit", "application/x-stuffit"}, - {"skd", "application/x-koan"}, - {"skm", "application/x-koan"}, - {"skp", "application/x-koan"}, - {"skt", "application/x-koan"}, - {"sl", "application/x-seelogo"}, - {"smi", "application/smil"}, - {"smil", "application/smil"}, - {"snd", "audio/basic"}, - {"snd", "audio/x-adpcm"}, - {"sol", "application/solids"}, - {"spc", "application/x-pkcs7-certificates"}, - {"spc", "text/x-speech"}, - {"spl", "application/futuresplash"}, - {"spr", "application/x-sprite"}, - {"sprite", "application/x-sprite"}, - {"src", "application/x-wais-source"}, - {"ssi", "text/x-server-parsed-html"}, - {"ssm", "application/streamingmedia"}, - {"sst", "application/vnd.ms-pki.certstore"}, - {"step", "application/step"}, - {"stl", "application/sla"}, - {"stl", "application/vnd.ms-pki.stl"}, - {"stl", "application/x-navistyle"}, - {"stp", "application/step"}, - {"sv4cpio,", "application/x-sv4cpio"}, - {"sv4crc", "application/x-sv4crc"}, - {"svf", "image/vnd.dwg"}, - {"svf", "image/x-dwg"}, - {"svr", "application/x-world"}, - {"svr", "x-world/x-svr"}, - {"swf", "application/x-shockwave-flash"}, - {"t", "application/x-troff"}, - {"talk", "text/x-speech"}, - {"tar", "application/x-tar"}, - {"tbk", "application/toolbook"}, - {"tbk", "application/x-tbook"}, - {"tcl", "application/x-tcl"}, - {"tcl", "text/x-script.tcl"}, - {"tcsh", "text/x-script.tcsh"}, - {"tex", "application/x-tex"}, - {"texi", "application/x-texinfo"}, - {"texinfo,", "application/x-texinfo"}, - {"text", "application/plain"}, - {"text", "text/plain"}, - {"tgz", "application/gnutar"}, - {"tgz", "application/x-compressed"}, - {"tif", "image/tiff"}, - {"tif", "image/x-tiff"}, - {"tiff", "image/tiff"}, - {"tiff", "image/x-tiff"}, - {"tr", "application/x-troff"}, - {"tsi", "audio/tsp-audio"}, - {"tsp", "application/dsptype"}, - {"tsp", "audio/tsplayer"}, - {"tsv", "text/tab-separated-values"}, - {"turbot", "image/florian"}, - {"txt", "text/plain"}, - {"uil", "text/x-uil"}, - {"uni", "text/uri-list"}, - {"unis", "text/uri-list"}, - {"unv", "application/i-deas"}, - {"uri", "text/uri-list"}, - {"uris", "text/uri-list"}, - {"ustar", "application/x-ustar"}, - {"ustar", "multipart/x-ustar"}, - {"uu", "application/octet-stream"}, - {"uu", "text/x-uuencode"}, - {"uue", "text/x-uuencode"}, - {"vcd", "application/x-cdlink"}, - {"vcs", "text/x-vcalendar"}, - {"vda", "application/vda"}, - {"vdo", "video/vdo"}, - {"vew", "application/groupwise"}, - {"viv", "video/vivo"}, - {"viv", "video/vnd.vivo"}, - {"vivo", "video/vivo"}, - {"vivo", "video/vnd.vivo"}, - {"vmd", "application/vocaltec-media-desc"}, - {"vmf", "application/vocaltec-media-file"}, - {"voc", "audio/voc"}, - {"voc", "audio/x-voc"}, - {"vos", "video/vosaic"}, - {"vox", "audio/voxware"}, - {"vqe", "audio/x-twinvq-plugin"}, - {"vqf", "audio/x-twinvq"}, - {"vql", "audio/x-twinvq-plugin"}, - {"vrml", "application/x-vrml"}, - {"vrml", "model/vrml"}, - {"vrml", "x-world/x-vrml"}, - {"vrt", "x-world/x-vrt"}, - {"vsd", "application/x-visio"}, - {"vst", "application/x-visio"}, - {"vsw", "application/x-visio"}, - {"w60", "application/wordperfect6.0"}, - {"w61", "application/wordperfect6.1"}, - {"w6w", "application/msword"}, - {"wav", "audio/wav"}, - {"wav", "audio/x-wav"}, - {"wb1", "application/x-qpro"}, - {"wbmp", "image/vnd.wap.wbmp"}, - {"web", "application/vnd.xara"}, - {"wiz", "application/msword"}, - {"wk1", "application/x-123"}, - {"wmf", "windows/metafile"}, - {"wml", "text/vnd.wap.wml"}, - {"wmlc", "application/vnd.wap.wmlc"}, - {"wmls", "text/vnd.wap.wmlscript"}, - {"wmlsc", "application/vnd.wap.wmlscriptc"}, - {"word", "application/msword"}, - {"wp", "application/wordperfect"}, - {"wp5", "application/wordperfect"}, - {"wp5", "application/wordperfect6.0"}, - {"wp6", "application/wordperfect"}, - {"wpd", "application/wordperfect"}, - {"wpd", "application/x-wpwin"}, - {"wq1", "application/x-lotus"}, - {"wri", "application/mswrite"}, - {"wri", "application/x-wri"}, - {"wrl", "application/x-world"}, - {"wrl", "model/vrml"}, - {"wrl", "x-world/x-vrml"}, - {"wrz", "model/vrml"}, - {"wrz", "x-world/x-vrml"}, - {"wsc", "text/scriplet"}, - {"wsrc", "application/x-wais-source"}, - {"wtk", "application/x-wintalk"}, - {"xbm", "image/x-xbitmap"}, - {"xbm", "image/x-xbm"}, - {"xbm", "image/xbm"}, - {"xdr", "video/x-amt-demorun"}, - {"xgz", "xgl/drawing"}, - {"xif", "image/vnd.xiff"}, - {"xl", "application/excel"}, - {"xla", "application/excel"}, - {"xla", "application/x-excel"}, - {"xla", "application/x-msexcel"}, - {"xlb", "application/excel"}, - {"xlb", "application/vnd.ms-excel"}, - {"xlb", "application/x-excel"}, - {"xlc", "application/excel"}, - {"xlc", "application/vnd.ms-excel"}, - {"xlc", "application/x-excel"}, - {"xld", "application/excel"}, - {"xld", "application/x-excel"}, - {"xlk", "application/excel"}, - {"xlk", "application/x-excel"}, - {"xll", "application/excel"}, - {"xll", "application/vnd.ms-excel"}, - {"xll", "application/x-excel"}, - {"xlm", "application/excel"}, - {"xlm", "application/vnd.ms-excel"}, - {"xlm", "application/x-excel"}, - {"xls", "application/excel"}, - {"xls", "application/vnd.ms-excel"}, - {"xls", "application/x-excel"}, - {"xls", "application/x-msexcel"}, - {"xlt", "application/excel"}, - {"xlt", "application/x-excel"}, - {"xlv", "application/excel"}, - {"xlv", "application/x-excel"}, - {"xlw", "application/excel"}, - {"xlw", "application/vnd.ms-excel"}, - {"xlw", "application/x-excel"}, - {"xlw", "application/x-msexcel"}, - {"xm", "audio/xm"}, - {"xml", "application/xml"}, - {"xml", "text/xml"}, - {"xmz", "xgl/movie"}, - {"xpix", "application/x-vnd.ls-xpix"}, - {"xpm", "image/x-xpixmap"}, - {"xpm", "image/xpm"}, - {"x-png", "image/png"}, - {"xsr", "video/x-amt-showrun"}, - {"xwd", "image/x-xwd"}, - {"xwd", "image/x-xwindowdump"}, - {"xyz", "chemical/x-pdb"}, - {"z", "application/x-compress"}, - {"z", "application/x-compressed"}, - {"zip", "application/x-compressed"}, - {"zip", "application/x-zip-compressed"}, - {"zip", "application/zip"}, - {"zip", "multipart/x-zip"}, - {"zoo", "application/octet-stream"} -}; - -} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_ios_FileChooser.mm juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_ios_FileChooser.mm --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_ios_FileChooser.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_ios_FileChooser.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,6 +23,13 @@ ============================================================================== */ +#include "juce_mac_CGMetalLayerRenderer.h" + +#if TARGET_OS_SIMULATOR && JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS + #warning JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS uses parts of the Metal API that are currently unsupported in the simulator - falling back to JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS=0 + #undef JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS +#endif + #if defined (__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 #define JUCE_HAS_IOS_POINTER_SUPPORT 1 #else @@ -112,16 +119,30 @@ using namespace juce; +struct CADisplayLinkDeleter +{ + void operator() (CADisplayLink* displayLink) const noexcept + { + [displayLink invalidate]; + [displayLink release]; + } +}; + @interface JuceUIView : UIView { @public UIViewComponentPeer* owner; UITextView* hiddenTextView; + std::unique_ptr displayLink; } - (JuceUIView*) initWithOwner: (UIViewComponentPeer*) owner withFrame: (CGRect) frame; - (void) dealloc; ++ (Class) layerClass; + +- (void) displayLinkCallback: (CADisplayLink*) dl; + - (void) drawRect: (CGRect) r; - (void) touchesBegan: (NSSet*) touches withEvent: (UIEvent*) event; @@ -192,8 +213,7 @@ }; class UIViewComponentPeer : public ComponentPeer, - public FocusChangeListener, - public UIViewPeerControllerReceiver + private UIViewPeerControllerReceiver { public: UIViewComponentPeer (Component&, int windowStyleFlags, UIView* viewToAttachTo); @@ -211,26 +231,30 @@ controller = [newController retain]; } - Rectangle getBounds() const override { return getBounds (! isSharedWindow); } + Rectangle getBounds() const override { return getBounds (! isSharedWindow); } Rectangle getBounds (bool global) const; Point localToGlobal (Point relativePosition) override; Point globalToLocal (Point screenPosition) override; using ComponentPeer::localToGlobal; using ComponentPeer::globalToLocal; void setAlpha (float newAlpha) override; - void setMinimised (bool) override {} - bool isMinimised() const override { return false; } + void setMinimised (bool) override {} + bool isMinimised() const override { return false; } void setFullScreen (bool shouldBeFullScreen) override; - bool isFullScreen() const override { return fullScreen; } + bool isFullScreen() const override { return fullScreen; } bool contains (Point localPos, bool trueIfInAChildWindow) const override; - BorderSize getFrameSize() const override { return BorderSize(); } + OptionalBorderSize getFrameSizeIfPresent() const override { return {}; } + BorderSize getFrameSize() const override { return BorderSize(); } bool setAlwaysOnTop (bool alwaysOnTop) override; void toFront (bool makeActiveWindow) override; void toBehind (ComponentPeer* other) override; void setIcon (const Image& newIcon) override; - StringArray getAvailableRenderingEngines() override { return StringArray ("CoreGraphics Renderer"); } + StringArray getAvailableRenderingEngines() override { return StringArray ("CoreGraphics Renderer"); } + + void displayLinkCallback(); void drawRect (CGRect); + void drawRectWithContext (CGContextRef, CGRect); bool canBecomeKeyWindow(); //============================================================================== @@ -239,10 +263,10 @@ bool isFocused() const override; void grabFocus() override; void textInputRequired (Point, TextInputTarget&) override; + void dismissPendingTextInput() override; BOOL textViewReplaceCharacters (Range, const String&); - void updateHiddenTextContent (TextInputTarget*); - void globalFocusChanged (Component*) override; + void updateHiddenTextContent (TextInputTarget&); void updateScreenBounds(); @@ -307,6 +331,9 @@ } }; + std::unique_ptr metalRenderer; + RectangleList deferredRepaints; + //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIViewComponentPeer) }; @@ -459,6 +486,11 @@ [super initWithFrame: frame]; owner = peer; + displayLink.reset ([CADisplayLink displayLinkWithTarget: self + selector: @selector (displayLinkCallback:)]); + [displayLink.get() addToRunLoop: [NSRunLoop mainRunLoop] + forMode: NSDefaultRunLoopMode]; + hiddenTextView = [[UITextView alloc] initWithFrame: CGRectZero]; [self addSubview: hiddenTextView]; hiddenTextView.delegate = self; @@ -493,10 +525,29 @@ [hiddenTextView removeFromSuperview]; [hiddenTextView release]; + displayLink = nullptr; + [super dealloc]; } //============================================================================== ++ (Class) layerClass +{ + #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS + if (@available (iOS 12, *)) + return [CAMetalLayer class]; + #endif + + return [CALayer class]; +} + +- (void) displayLinkCallback: (CADisplayLink*) dl +{ + if (owner != nullptr) + owner->displayLinkCallback(); +} + +//============================================================================== - (void) drawRect: (CGRect) r { if (owner != nullptr) @@ -665,11 +716,14 @@ view.opaque = component.isOpaque(); view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent: 0]; - #if JUCE_COREGRAPHICS_DRAW_ASYNC - if (! getComponentAsyncLayerBackedViewDisabled (component)) - [[view layer] setDrawsAsynchronously: YES]; + #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS + if (@available (iOS 12, *)) + metalRenderer = std::make_unique ((CAMetalLayer*) view.layer, comp); #endif + if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0) + [[view layer] setDrawsAsynchronously: YES]; + if (isSharedWindow) { window = [viewToAttachTo window]; @@ -699,8 +753,6 @@ setTitle (component.getName()); setVisible (component.isVisible()); - - Desktop::getInstance().addFocusChangeListener (this); } static UIViewComponentPeer* currentlyFocusedPeer = nullptr; @@ -711,7 +763,6 @@ currentlyFocusedPeer = nullptr; currentTouches.deleteAllTouchesForPeer (this); - Desktop::getInstance().removeFocusChangeListener (this); view->owner = nullptr; [view removeFromSuperview]; @@ -957,7 +1008,7 @@ // this forces a mouse-enter/up event, in case for some reason we didn't get a mouse-up before. handleMouseEvent (MouseInputSource::InputSourceType::touch, pos, modsToSend.withoutMouseButtons(), - MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, time, {}, touchIndex); + MouseInputSource::defaultPressure, MouseInputSource::defaultOrientation, time, {}, touchIndex); if (! isValidPeer (this)) // (in case this component was deleted by the event) return; @@ -982,10 +1033,10 @@ // NB: some devices return 0 or 1.0 if pressure is unknown, so we'll clip our value to a believable range: auto pressure = maximumForce > 0 ? jlimit (0.0001f, 0.9999f, getTouchForce (touch) / maximumForce) - : MouseInputSource::invalidPressure; + : MouseInputSource::defaultPressure; handleMouseEvent (MouseInputSource::InputSourceType::touch, - pos, modsToSend, pressure, MouseInputSource::invalidOrientation, time, { }, touchIndex); + pos, modsToSend, pressure, MouseInputSource::defaultOrientation, time, { }, touchIndex); if (! isValidPeer (this)) // (in case this component was deleted by the event) return; @@ -993,7 +1044,7 @@ if (isUp (mouseEventFlags)) { handleMouseEvent (MouseInputSource::InputSourceType::touch, MouseInputSource::offscreenMousePos, modsToSend, - MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, time, {}, touchIndex); + MouseInputSource::defaultPressure, MouseInputSource::defaultOrientation, time, {}, touchIndex); if (! isValidPeer (this)) return; @@ -1010,7 +1061,7 @@ handleMouseEvent (MouseInputSource::InputSourceType::touch, pos, ModifierKeys::currentModifiers, - MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, + MouseInputSource::defaultPressure, MouseInputSource::defaultOrientation, UIViewComponentPeer::getMouseTime ([[NSProcessInfo processInfo] systemUptime]), {}); } @@ -1075,8 +1126,18 @@ } } -void UIViewComponentPeer::textInputRequired (Point, TextInputTarget&) +void UIViewComponentPeer::textInputRequired (Point pos, TextInputTarget& target) { + view->hiddenTextView.frame = CGRectMake (pos.x, pos.y, 0, 0); + + updateHiddenTextContent (target); + [view->hiddenTextView becomeFirstResponder]; +} + +void UIViewComponentPeer::dismissPendingTextInput() +{ + closeInputMethodContext(); + [view->hiddenTextView resignFirstResponder]; } static UIKeyboardType getUIKeyboardType (TextInputTarget::VirtualKeyboardType type) noexcept @@ -1095,11 +1156,11 @@ return UIKeyboardTypeDefault; } -void UIViewComponentPeer::updateHiddenTextContent (TextInputTarget* target) +void UIViewComponentPeer::updateHiddenTextContent (TextInputTarget& target) { - view->hiddenTextView.keyboardType = getUIKeyboardType (target->getKeyboardType()); - view->hiddenTextView.text = juceStringToNS (target->getTextInRange (Range (0, target->getHighlightedRegion().getStart()))); - view->hiddenTextView.selectedRange = NSMakeRange ((NSUInteger) target->getHighlightedRegion().getStart(), 0); + view->hiddenTextView.keyboardType = getUIKeyboardType (target.getKeyboardType()); + view->hiddenTextView.text = juceStringToNS (target.getTextInRange (Range (0, target.getHighlightedRegion().getStart()))); + view->hiddenTextView.selectedRange = NSMakeRange ((NSUInteger) target.getHighlightedRegion().getStart(), 0); } BOOL UIViewComponentPeer::textViewReplaceCharacters (Range range, const String& text) @@ -1120,29 +1181,49 @@ target->insertTextAtCaret (text); if (deletionChecker != nullptr) - updateHiddenTextContent (target); + updateHiddenTextContent (*target); } return NO; } -void UIViewComponentPeer::globalFocusChanged (Component*) +//============================================================================== +void UIViewComponentPeer::displayLinkCallback() { - if (auto* target = findCurrentTextInputTarget()) + if (deferredRepaints.isEmpty()) + return; + + auto dispatchRectangles = [this] () { - if (auto* comp = dynamic_cast (target)) + // We shouldn't need this preprocessor guard, but when running in the simulator + // CAMetalLayer is flagged as requiring iOS 13 + #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS + if (metalRenderer != nullptr) { - auto pos = component.getLocalPoint (comp, Point()); - view->hiddenTextView.frame = CGRectMake (pos.x, pos.y, 0, 0); + if (@available (iOS 12, *)) + { + return metalRenderer->drawRectangleList ((CAMetalLayer*) view.layer, + (float) view.contentScaleFactor, + view.frame, + component, + [this] (CGContextRef ctx, CGRect r) { drawRectWithContext (ctx, r); }, + deferredRepaints); + } - updateHiddenTextContent (target); - [view->hiddenTextView becomeFirstResponder]; + // The creation of metalRenderer should already be guarded with @available (iOS 12, *). + jassertfalse; + return false; } - } - else - { - [view->hiddenTextView resignFirstResponder]; - } + #endif + + for (const auto& r : deferredRepaints) + [view setNeedsDisplayInRect: convertToCGRect (r)]; + + return true; + }; + + if (dispatchRectangles()) + deferredRepaints.clear(); } //============================================================================== @@ -1151,8 +1232,11 @@ if (r.size.width < 1.0f || r.size.height < 1.0f) return; - CGContextRef cg = UIGraphicsGetCurrentContext(); + drawRectWithContext (UIGraphicsGetCurrentContext(), r); +} +void UIViewComponentPeer::drawRectWithContext (CGContextRef cg, CGRect) +{ if (! component.isOpaque()) CGContextClearRect (cg, CGContextGetClipBoundingBox (cg)); @@ -1209,9 +1293,12 @@ void UIViewComponentPeer::repaint (const Rectangle& area) { if (insideDrawRect || ! MessageManager::getInstance()->isThisTheMessageThread()) + { (new AsyncRepaintMessage (this, area))->post(); - else - [view setNeedsDisplayInRect: convertToCGRect (area)]; + return; + } + + deferredRepaints.add (area.toFloat()); } void UIViewComponentPeer::performAnyPendingRepaintsNow() diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_ios_Windowing.mm juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_ios_Windowing.mm --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_ios_Windowing.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_ios_Windowing.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_linux_Windowing.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_linux_Windowing.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_linux_Windowing.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_linux_Windowing.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -92,14 +92,8 @@ } //============================================================================== - void setBounds (const Rectangle& newBounds, bool isNowFullScreen) override + void forceSetBounds (const Rectangle& correctedNewBounds, bool isNowFullScreen) { - const auto correctedNewBounds = newBounds.withSize (jmax (1, newBounds.getWidth()), - jmax (1, newBounds.getHeight())); - - if (bounds == correctedNewBounds && fullScreen == isNowFullScreen) - return; - bounds = correctedNewBounds; updateScaleFactorFromNewBounds (bounds, false); @@ -120,6 +114,15 @@ } } + void setBounds (const Rectangle& newBounds, bool isNowFullScreen) override + { + const auto correctedNewBounds = newBounds.withSize (jmax (1, newBounds.getWidth()), + jmax (1, newBounds.getHeight())); + + if (bounds != correctedNewBounds || fullScreen != isNowFullScreen) + forceSetBounds (correctedNewBounds, isNowFullScreen); + } + Point getScreenPosition (bool physical) const { auto physicalParentPosition = XWindowSystem::getInstance()->getPhysicalParentScreenPosition(); @@ -141,19 +144,25 @@ return bounds; } - BorderSize getFrameSize() const override + OptionalBorderSize getFrameSizeIfPresent() const override { return windowBorder; } + BorderSize getFrameSize() const override + { + const auto optionalBorderSize = getFrameSizeIfPresent(); + return optionalBorderSize ? (*optionalBorderSize) : BorderSize(); + } + Point localToGlobal (Point relativePosition) override { - return relativePosition + getScreenPosition (false).toFloat(); + return localToGlobal (*this, relativePosition); } Point globalToLocal (Point screenPosition) override { - return screenPosition - getScreenPosition (false).toFloat(); + return globalToLocal (*this, screenPosition); } using ComponentPeer::localToGlobal; @@ -232,8 +241,11 @@ if (! c->isVisible()) continue; - if (auto* peer = c->getPeer()) - if (peer->contains (localPos + bounds.getPosition() - peer->getBounds().getPosition(), true)) + auto* otherPeer = c->getPeer(); + jassert (otherPeer == nullptr || dynamic_cast (c->getPeer()) != nullptr); + + if (auto* peer = static_cast (otherPeer)) + if (peer->contains (globalToLocal (*peer, localToGlobal (*this, localPos.toFloat())).roundToInt(), true)) return false; } @@ -362,9 +374,20 @@ void updateBorderSize() { if ((styleFlags & windowHasTitleBar) == 0) - windowBorder = {}; - else if (windowBorder.getTopAndBottom() == 0 && windowBorder.getLeftAndRight() == 0) - windowBorder = XWindowSystem::getInstance()->getBorderSize (windowH); + { + windowBorder = ComponentPeer::OptionalBorderSize { BorderSize() }; + } + else if (! windowBorder + || ((*windowBorder).getTopAndBottom() == 0 && (*windowBorder).getLeftAndRight() == 0)) + { + windowBorder = [&]() + { + if (auto unscaledBorderSize = XWindowSystem::getInstance()->getBorderSize (windowH)) + return OptionalBorderSize { (*unscaledBorderSize).multipliedBy (1.0 / currentScaleFactor) }; + + return OptionalBorderSize {}; + }(); + } } //============================================================================== @@ -423,12 +446,31 @@ if (! totalArea.isEmpty()) { - if (image.isNull() || image.getWidth() < totalArea.getWidth() + const auto wasImageNull = image.isNull(); + + if (wasImageNull || image.getWidth() < totalArea.getWidth() || image.getHeight() < totalArea.getHeight()) { image = XWindowSystem::getInstance()->createImage (isSemiTransparentWindow, totalArea.getWidth(), totalArea.getHeight(), useARGBImagesForRendering); + if (wasImageNull) + { + // After calling createImage() XWindowSystem::getWindowBounds() will return + // changed coordinates that look like the result of some position + // defaulting mechanism. If we handle a configureNotifyEvent after + // createImage() and before we would issue new, valid coordinates, we will + // apply these default, unwanted coordinates to our window. To avoid that + // we immediately send another positioning message to guarantee that the + // next configureNotifyEvent will read valid values. + // + // This issue only occurs right after peer creation, when the image is + // null. Updating when only the width or height is changed would lead to + // incorrect behaviour. + peer.forceSetBounds (ScalingHelpers::scaledScreenPosToUnscaled (peer.component, + peer.component.getBoundsInParent()), + peer.isFullScreen()); + } } startTimer (repaintTimerPeriod); @@ -471,6 +513,19 @@ }; //============================================================================== + template + static Point localToGlobal (This& t, Point relativePosition) + { + return relativePosition + t.getScreenPosition (false).toFloat(); + } + + template + static Point globalToLocal (This& t, Point screenPosition) + { + return screenPosition - t.getScreenPosition (false).toFloat(); + } + + //============================================================================== void settingChanged (const XWindowSystemUtilities::XSetting& settingThatHasChanged) override { static StringArray possibleSettings { XWindowSystem::getWindowScalingFactorSettingName(), @@ -504,7 +559,7 @@ ::Window windowH = {}, parentWindow = {}; Rectangle bounds; - BorderSize windowBorder; + ComponentPeer::OptionalBorderSize windowBorder; bool fullScreen = false, isAlwaysOnTop = false; double currentScaleFactor = 1.0; Array glRepaintListeners; @@ -888,12 +943,14 @@ return {}; } +void juce_LinuxAddRepaintListener (ComponentPeer* peer, Component* dummy); void juce_LinuxAddRepaintListener (ComponentPeer* peer, Component* dummy) { if (auto* linuxPeer = dynamic_cast (peer)) linuxPeer->addOpenGLRepaintListener (dummy); } +void juce_LinuxRemoveRepaintListener (ComponentPeer* peer, Component* dummy); void juce_LinuxRemoveRepaintListener (ComponentPeer* peer, Component* dummy) { if (auto* linuxPeer = dynamic_cast (peer)) diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,365 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +// The CoreGraphicsMetalLayerRenderer requires macOS 10.14 and iOS 12. +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") + +namespace juce +{ + +//============================================================================== +class CoreGraphicsMetalLayerRenderer +{ +public: + //============================================================================== + CoreGraphicsMetalLayerRenderer (CAMetalLayer* layer, const Component& comp) + { + device.reset (MTLCreateSystemDefaultDevice()); + + layer.device = device.get(); + layer.framebufferOnly = NO; + layer.pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB; + layer.opaque = comp.isOpaque(); + layer.allowsNextDrawableTimeout = NO; + + commandQueue.reset ([device.get() newCommandQueue]); + + memoryBlitEvent.reset ([device.get() newSharedEvent]); + } + + ~CoreGraphicsMetalLayerRenderer() + { + stopGpuCommandSubmission = true; + [memoryBlitCommandBuffer.get() waitUntilCompleted]; + } + + template + bool drawRectangleList (CAMetalLayer* layer, + float scaleFactor, + CGRect viewFrame, + const Component& comp, + Callback&& drawRectWithContext, + const RectangleList& dirtyRegions) + { + if (resources != nullptr) + { + // If we haven't finished blitting the CPU texture to the GPU then + // report that we have been unable to draw anything. + if (memoryBlitEvent.get().signaledValue != memoryBlitCounter + 1) + return false; + + ++memoryBlitCounter; + } + + layer.contentsScale = scaleFactor; + const auto drawableSizeTansform = CGAffineTransformMakeScale (layer.contentsScale, + layer.contentsScale); + const auto transformedFrameSize = CGSizeApplyAffineTransform (viewFrame.size, drawableSizeTansform); + + const auto componentHeight = comp.getHeight(); + + if (! CGSizeEqualToSize (layer.drawableSize, transformedFrameSize)) + { + layer.drawableSize = transformedFrameSize; + resources = std::make_unique (device.get(), layer, componentHeight); + } + + auto gpuTexture = resources->getGpuTexture(); + + if (gpuTexture == nullptr) + { + jassertfalse; + return false; + } + + auto cgContext = resources->getCGContext(); + + for (auto rect : dirtyRegions) + { + const auto cgRect = convertToCGRect (rect); + + CGContextSaveGState (cgContext); + + CGContextClipToRect (cgContext, cgRect); + drawRectWithContext (cgContext, cgRect); + + CGContextRestoreGState (cgContext); + } + + resources->signalBufferModifiedByCpu(); + + auto sharedTexture = resources->getSharedTexture(); + + memoryBlitCommandBuffer.reset ([commandQueue.get() commandBuffer]); + + // Command buffers are usually considered temporary, and are automatically released by + // the operating system when the rendering pipeline is finsihed. However, we want to keep + // this one alive so that we can wait for pipeline completion in the destructor. + [memoryBlitCommandBuffer.get() retain]; + + auto blitCommandEncoder = [memoryBlitCommandBuffer.get() blitCommandEncoder]; + [blitCommandEncoder copyFromTexture: sharedTexture + sourceSlice: 0 + sourceLevel: 0 + sourceOrigin: MTLOrigin{} + sourceSize: MTLSize { sharedTexture.width, sharedTexture.height, 1 } + toTexture: gpuTexture + destinationSlice: 0 + destinationLevel: 0 + destinationOrigin: MTLOrigin{}]; + [blitCommandEncoder endEncoding]; + + // Signal that the GPU has finished using the CPU texture + [memoryBlitCommandBuffer.get() encodeSignalEvent: memoryBlitEvent.get() + value: memoryBlitCounter + 1]; + + [memoryBlitCommandBuffer.get() addScheduledHandler: ^(id) + { + // We're on a Metal thread, so we can make a blocking nextDrawable call + // without stalling the message thread. + + // Check if we can do an early exit. + if (stopGpuCommandSubmission) + return; + + @autoreleasepool + { + id drawable = [layer nextDrawable]; + + id presentationCommandBuffer = [commandQueue.get() commandBuffer]; + + auto presentationBlitCommandEncoder = [presentationCommandBuffer blitCommandEncoder]; + [presentationBlitCommandEncoder copyFromTexture: gpuTexture + sourceSlice: 0 + sourceLevel: 0 + sourceOrigin: MTLOrigin{} + sourceSize: MTLSize { gpuTexture.width, gpuTexture.height, 1 } + toTexture: drawable.texture + destinationSlice: 0 + destinationLevel: 0 + destinationOrigin: MTLOrigin{}]; + [presentationBlitCommandEncoder endEncoding]; + + [presentationCommandBuffer addScheduledHandler: ^(id) + { + [drawable present]; + }]; + + [presentationCommandBuffer commit]; + } + }]; + + [memoryBlitCommandBuffer.get() commit]; + + return true; + } + +private: + //============================================================================== + static auto alignTo (size_t n, size_t alignment) + { + return ((n + alignment - 1) / alignment) * alignment; + } + + //============================================================================== + struct TextureDeleter + { + void operator() (id texture) const noexcept + { + [texture setPurgeableState: MTLPurgeableStateEmpty]; + [texture release]; + } + }; + + using TextureUniquePtr = std::unique_ptr>, TextureDeleter>; + + //============================================================================== + class GpuTexturePool + { + public: + GpuTexturePool (id metalDevice, MTLTextureDescriptor* descriptor) + { + for (auto& t : textureCache) + t.reset ([metalDevice newTextureWithDescriptor: descriptor]); + } + + id take() const + { + auto iter = std::find_if (textureCache.begin(), textureCache.end(), + [] (const TextureUniquePtr& t) { return [t.get() retainCount] == 1; }); + return iter == textureCache.end() ? nullptr : (*iter).get(); + } + + private: + std::array textureCache; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GpuTexturePool) + JUCE_DECLARE_NON_MOVEABLE (GpuTexturePool) + }; + + //============================================================================== + class Resources + { + public: + Resources (id metalDevice, CAMetalLayer* layer, int componentHeight) + { + const auto bytesPerRow = alignTo ((size_t) layer.drawableSize.width * 4, 256); + + const auto allocationSize = cpuRenderMemory.ensureSize (bytesPerRow * (size_t) layer.drawableSize.height); + + buffer.reset ([metalDevice newBufferWithBytesNoCopy: cpuRenderMemory.get() + length: allocationSize + options: + #if JUCE_MAC + MTLResourceStorageModeManaged + #else + MTLResourceStorageModeShared + #endif + deallocator: nullptr]); + + auto* textureDesc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat: layer.pixelFormat + width: (NSUInteger) layer.drawableSize.width + height: (NSUInteger) layer.drawableSize.height + mipmapped: NO]; + textureDesc.storageMode = + #if JUCE_MAC + MTLStorageModeManaged; + #else + MTLStorageModeShared; + #endif + textureDesc.usage = MTLTextureUsageShaderRead; + + sharedTexture.reset ([buffer.get() newTextureWithDescriptor: textureDesc + offset: 0 + bytesPerRow: bytesPerRow]); + + cgContext.reset (CGBitmapContextCreate (cpuRenderMemory.get(), + (size_t) layer.drawableSize.width, + (size_t) layer.drawableSize.height, + 8, // Bits per component + bytesPerRow, + CGColorSpaceCreateWithName (kCGColorSpaceSRGB), + (uint32_t) kCGImageAlphaPremultipliedFirst | (uint32_t) kCGBitmapByteOrder32Host)); + + CGContextScaleCTM (cgContext.get(), layer.contentsScale, layer.contentsScale); + CGContextConcatCTM (cgContext.get(), CGAffineTransformMake (1, 0, 0, -1, 0, componentHeight)); + + textureDesc.storageMode = MTLStorageModePrivate; + gpuTexturePool = std::make_unique (metalDevice, textureDesc); + } + + CGContextRef getCGContext() const noexcept { return cgContext.get(); } + id getSharedTexture() const noexcept { return sharedTexture.get(); } + id getGpuTexture() noexcept { return gpuTexturePool == nullptr ? nullptr : gpuTexturePool->take(); } + + void signalBufferModifiedByCpu() + { + #if JUCE_MAC + [buffer.get() didModifyRange: { 0, buffer.get().length }]; + #endif + } + + private: + class AlignedMemory + { + public: + AlignedMemory() = default; + + void* get() + { + return allocation != nullptr ? allocation->data : nullptr; + } + + size_t ensureSize (size_t newSize) + { + const auto alignedSize = alignTo (newSize, pagesize); + + if (alignedSize > size) + { + size = std::max (alignedSize, alignTo ((size_t) (size * growthFactor), pagesize)); + allocation = std::make_unique (pagesize, size); + } + + return size; + } + + private: + static constexpr float growthFactor = 1.3f; + + const size_t pagesize = (size_t) getpagesize(); + + struct AllocationWrapper + { + AllocationWrapper (size_t alignment, size_t allocationSize) + { + if (posix_memalign (&data, alignment, allocationSize) != 0) + jassertfalse; + } + + ~AllocationWrapper() + { + ::free (data); + } + + void* data = nullptr; + }; + + std::unique_ptr allocation; + size_t size = 0; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AlignedMemory) + JUCE_DECLARE_NON_MOVEABLE (AlignedMemory) + }; + + AlignedMemory cpuRenderMemory; + + detail::ContextPtr cgContext; + + ObjCObjectHandle> buffer; + TextureUniquePtr sharedTexture; + std::unique_ptr gpuTexturePool; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Resources) + JUCE_DECLARE_NON_MOVEABLE (Resources) + }; + + //============================================================================== + std::unique_ptr resources; + + ObjCObjectHandle> device; + ObjCObjectHandle> commandQueue; + ObjCObjectHandle> memoryBlitCommandBuffer; + ObjCObjectHandle> memoryBlitEvent; + + uint64_t memoryBlitCounter = 0; + std::atomic stopGpuCommandSubmission { false }; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreGraphicsMetalLayerRenderer) + JUCE_DECLARE_NON_MOVEABLE (CoreGraphicsMetalLayerRenderer) +}; + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +} diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_mac_FileChooser.mm juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_mac_FileChooser.mm --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_mac_FileChooser.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_mac_FileChooser.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -112,10 +112,13 @@ preview->addToDesktop (0, (void*) nsViewPreview); preview->setVisible (true); - if (! isSave) + if (@available (macOS 10.11, *)) { - auto* openPanel = static_cast (panel); - [openPanel setAccessoryViewDisclosed: YES]; + if (! isSave) + { + auto* openPanel = static_cast (panel); + [openPanel setAccessoryViewDisclosed: YES]; + } } } diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_mac_MainMenu.mm juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_mac_MainMenu.mm --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_mac_MainMenu.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_mac_MainMenu.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,6 +23,8 @@ ============================================================================== */ +#include "juce_mac_CGMetalLayerRenderer.h" + @interface NSEvent (DeviceDelta) - (float)deviceDeltaX; - (float)deviceDeltaY; @@ -31,16 +33,36 @@ //============================================================================== namespace juce { - typedef void (*AppFocusChangeCallback)(); - extern AppFocusChangeCallback appFocusChangeCallback; - typedef bool (*CheckEventBlockedByModalComps) (NSEvent*); - extern CheckEventBlockedByModalComps isEventBlockedByModalComps; -} -namespace juce -{ +using AppFocusChangeCallback = void (*)(); +extern AppFocusChangeCallback appFocusChangeCallback; +using CheckEventBlockedByModalComps = bool (*) (NSEvent*); +extern CheckEventBlockedByModalComps isEventBlockedByModalComps; //============================================================================== +static void resetTrackingArea (NSView* view) +{ + const auto trackingAreas = [view trackingAreas]; + + jassert ([trackingAreas count] <= 1); + + for (NSTrackingArea* area in trackingAreas) + [view removeTrackingArea: area]; + + const auto options = NSTrackingMouseEnteredAndExited + | NSTrackingMouseMoved + | NSTrackingEnabledDuringMouseDrag + | NSTrackingActiveAlways + | NSTrackingInVisibleRect; + + const NSUniquePtr trackingArea { [[NSTrackingArea alloc] initWithRect: [view bounds] + options: options + owner: view + userInfo: nil] }; + + [view addTrackingArea: trackingArea.get()]; +} + static constexpr int translateVirtualToAsciiKeyCode (int keyCode) noexcept { switch (keyCode) @@ -101,8 +123,7 @@ constexpr int extendedKeyModifier = 0x30000; //============================================================================== -class NSViewComponentPeer : public ComponentPeer, - private Timer +class NSViewComponentPeer : public ComponentPeer { public: NSViewComponentPeer (Component& comp, const int windowStyleFlags, NSView* viewToAttachTo) @@ -121,15 +142,7 @@ [view registerForDraggedTypes: getSupportedDragTypes()]; - const auto options = NSTrackingMouseEnteredAndExited - | NSTrackingMouseMoved - | NSTrackingEnabledDuringMouseDrag - | NSTrackingActiveAlways - | NSTrackingInVisibleRect; - [view addTrackingArea: [[NSTrackingArea alloc] initWithRect: r - options: options - owner: view - userInfo: nil]]; + resetTrackingArea (view); notificationCenter = [NSNotificationCenter defaultCenter]; @@ -140,8 +153,8 @@ [view setPostsFrameChangedNotifications: YES]; - #if USE_COREGRAPHICS_RENDERING && JUCE_COREGRAPHICS_DRAW_ASYNC - if (! getComponentAsyncLayerBackedViewDisabled (component)) + #if USE_COREGRAPHICS_RENDERING + if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0) { if (@available (macOS 10.8, *)) { @@ -151,6 +164,8 @@ } #endif + createCVDisplayLink(); + if (isSharedWindow) { window = [viewToAttachTo window]; @@ -245,6 +260,9 @@ ~NSViewComponentPeer() override { + CVDisplayLinkStop (displayLink); + dispatch_source_cancel (displaySource); + [notificationCenter removeObserver: view]; setOwner (view, nullptr); @@ -429,20 +447,14 @@ if (isSharedWindow) return; - setCollectionBehaviour (shouldBeFullScreen); + if (shouldBeFullScreen) + setCollectionBehaviour (true); if (isMinimised()) setMinimised (false); - if (hasNativeTitleBar()) - { - if (shouldBeFullScreen != isFullScreen()) - [window toggleFullScreen: nil]; - } - else - { - [window zoom: nil]; - } + if (shouldBeFullScreen != isFullScreen()) + [window toggleFullScreen: nil]; } bool isFullScreen() const override @@ -493,12 +505,12 @@ : (v == view); } - BorderSize getFrameSize() const override + OptionalBorderSize getFrameSizeIfPresent() const override { - BorderSize b; - if (! isSharedWindow) { + BorderSize b; + NSRect v = [view convertRect: [view frame] toView: nil]; NSRect w = [window frame]; @@ -506,9 +518,19 @@ b.setBottom ((int) v.origin.y); b.setLeft ((int) v.origin.x); b.setRight ((int) (w.size.width - (v.origin.x + v.size.width))); + + return OptionalBorderSize { b }; } - return b; + return {}; + } + + BorderSize getFrameSize() const override + { + if (const auto frameSize = getFrameSizeIfPresent()) + return *frameSize; + + return {}; } bool hasNativeTitleBar() const @@ -684,7 +706,7 @@ else // moved into another window which overlaps this one, so trigger an exit handleMouseEvent (MouseInputSource::InputSourceType::mouse, MouseInputSource::offscreenMousePos, ModifierKeys::currentModifiers, - getMousePressure (ev), MouseInputSource::invalidOrientation, getMouseTime (ev)); + getMousePressure (ev), MouseInputSource::defaultOrientation, getMouseTime (ev)); showArrowCursorIfNeeded(); } @@ -778,11 +800,13 @@ name: NSWindowWillMiniaturizeNotification object: currentWindow]; - #if JUCE_COREGRAPHICS_DRAW_ASYNC [notificationCenter removeObserver: view name: NSWindowDidBecomeKeyNotification object: currentWindow]; - #endif + + [notificationCenter removeObserver: view + name: NSWindowDidChangeScreenNotification + object: currentWindow]; } if (isSharedWindow && [view window] == window && newWindow == nullptr) @@ -796,7 +820,7 @@ { updateModifiers (ev); handleMouseEvent (MouseInputSource::InputSourceType::mouse, getMousePos (ev, view), ModifierKeys::currentModifiers, - getMousePressure (ev), MouseInputSource::invalidOrientation, getMouseTime (ev)); + getMousePressure (ev), MouseInputSource::defaultOrientation, getMouseTime (ev)); } bool handleKeyEvent (NSEvent* ev, bool isKeyDown) @@ -914,6 +938,11 @@ JUCE_END_IGNORE_WARNINGS_GCC_LIKE }(); + drawRectWithContext (cg, r); + } + + void drawRectWithContext (CGContextRef cg, NSRect r) + { if (! component.isOpaque()) CGContextClearRect (cg, CGContextGetClipBoundingBox (cg)); @@ -932,10 +961,12 @@ }; #if USE_COREGRAPHICS_RENDERING && JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS - // This option invokes a separate paint call for each rectangle of the clip region. - // It's a long story, but this is a basically a workaround for a CGContext not having - // a way of finding whether a rectangle falls within its clip region - if (usingCoreGraphics) + // This was a workaround for a CGContext not having a way of finding whether a rectangle + // falls within its clip region. However Apple removed the capability of + // [view getRectsBeingDrawn: ...] sometime around 10.13, so on later versions of macOS + // numRects will always be 1 and you'll need to use a CoreGraphicsMetalLayerRenderer + // to avoid CoreGraphics consolidating disparate rects. + if (usingCoreGraphics && metalRenderer == nullptr) { const NSRect* rects = nullptr; NSInteger numRects = 0; @@ -948,7 +979,7 @@ NSRect rect = rects[i]; CGContextSaveGState (cg); CGContextClipToRect (cg, CGRectMake (rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)); - drawRectWithContext (cg, rect, displayScale); + renderRect (cg, rect, displayScale); CGContextRestoreGState (cg); } @@ -958,11 +989,11 @@ } #endif - drawRectWithContext (cg, r, displayScale); + renderRect (cg, r, displayScale); invalidateTransparentWindowShadow(); } - void drawRectWithContext (CGContextRef cg, NSRect r, float displayScale) + void renderRect (CGContextRef cg, NSRect r, float displayScale) { #if USE_COREGRAPHICS_RENDERING if (usingCoreGraphics) @@ -1020,48 +1051,89 @@ // a few when there's a lot of activity. // As a work around for this, we use a RectangleList to do our own coalescing of regions before // asynchronously asking the OS to repaint them. - deferredRepaints.add ((float) area.getX(), (float) area.getY(), - (float) area.getWidth(), (float) area.getHeight()); + deferredRepaints.add (area.toFloat()); + } - if (isTimerRunning()) + static bool shouldThrottleRepaint() + { + return areAnyWindowsInLiveResize(); + } + + void setNeedsDisplayRectangles() + { + if (deferredRepaints.isEmpty()) return; auto now = Time::getMillisecondCounter(); auto msSinceLastRepaint = (lastRepaintTime >= now) ? now - lastRepaintTime : (std::numeric_limits::max() - lastRepaintTime) + now; - static uint32 minimumRepaintInterval = 1000 / 30; // 30fps + constexpr uint32 minimumRepaintInterval = 1000 / 30; // 30fps // When windows are being resized, artificially throttling high-frequency repaints helps // to stop the event queue getting clogged, and keeps everything working smoothly. // For some reason Logic also needs this throttling to record parameter events correctly. if (msSinceLastRepaint < minimumRepaintInterval && shouldThrottleRepaint()) - { - startTimer (static_cast (minimumRepaintInterval - msSinceLastRepaint)); return; - } - setNeedsDisplayRectangles(); - } + #if USE_COREGRAPHICS_RENDERING && JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS + // We require macOS 10.14 to use the Metal layer renderer + if (@available (macOS 10.14, *)) + { + const auto& comp = getComponent(); - static bool shouldThrottleRepaint() - { - return areAnyWindowsInLiveResize() || ! JUCEApplication::isStandaloneApp(); - } + // If we are resizing we need to fall back to synchronous drawing to avoid artefacts + if (areAnyWindowsInLiveResize()) + { + if (metalRenderer != nullptr) + { + metalRenderer.reset(); + view.wantsLayer = NO; + view.layer = nil; + deferredRepaints = comp.getLocalBounds().toFloat(); + } + } + else + { + if (metalRenderer == nullptr) + { + view.wantsLayer = YES; + view.layerContentsRedrawPolicy = NSViewLayerContentsRedrawDuringViewResize; + view.layerContentsPlacement = NSViewLayerContentsPlacementTopLeft; + view.layer = [CAMetalLayer layer]; + metalRenderer = std::make_unique ((CAMetalLayer*) view.layer, getComponent()); + deferredRepaints = comp.getLocalBounds().toFloat(); + } + } + } + #endif - void timerCallback() override - { - setNeedsDisplayRectangles(); - stopTimer(); - } + auto dispatchRectangles = [this] () + { + if (@available (macOS 10.14, *)) + { + if (metalRenderer != nullptr) + { + return metalRenderer->drawRectangleList ((CAMetalLayer*) view.layer, + (float) [[view window] backingScaleFactor], + view.frame, + getComponent(), + [this] (CGContextRef ctx, CGRect r) { drawRectWithContext (ctx, r); }, + deferredRepaints); + } + } - void setNeedsDisplayRectangles() - { - for (auto& i : deferredRepaints) - [view setNeedsDisplayInRect: makeNSRect (i)]; + for (auto& i : deferredRepaints) + [view setNeedsDisplayInRect: makeNSRect (i)]; + + return true; + }; - lastRepaintTime = Time::getMillisecondCounter(); - deferredRepaints.clear(); + if (dispatchRectangles()) + { + lastRepaintTime = Time::getMillisecondCounter(); + deferredRepaints.clear(); + } } void performAnyPendingRepaintsNow() override @@ -1094,13 +1166,34 @@ return false; } - void sendModalInputAttemptIfBlocked() + enum class KeyWindowChanged { no, yes }; + + void sendModalInputAttemptIfBlocked (KeyWindowChanged keyChanged) { - if (isBlockedByModalComponent()) - if (auto* modal = Component::getCurrentlyModalComponent()) - if (auto* otherPeer = modal->getPeer()) - if ((otherPeer->getStyleFlags() & ComponentPeer::windowIsTemporary) != 0) - modal->inputAttemptWhenModal(); + if (! isBlockedByModalComponent()) + return; + + if (auto* modal = Component::getCurrentlyModalComponent()) + { + if (auto* otherPeer = modal->getPeer()) + { + const auto modalPeerIsTemporary = (otherPeer->getStyleFlags() & ComponentPeer::windowIsTemporary) != 0; + + if (! modalPeerIsTemporary) + return; + + // When a peer resigns key status, it might be because we just created a modal + // component that is now key. + // In this case, we should only dismiss the modal component if it isn't key, + // implying that a third window has become key. + const auto modalPeerIsKey = [NSApp keyWindow] == static_cast (otherPeer)->window; + + if (keyChanged == KeyWindowChanged::yes && modalPeerIsKey) + return; + + modal->inputAttemptWhenModal(); + } + } } bool canBecomeKeyWindow() @@ -1144,6 +1237,12 @@ void redirectMovedOrResized() { handleMovedOrResized(); + setNeedsDisplayRectangles(); + } + + void windowDidChangeScreen() + { + updateCVDisplayLinkScreen(); } void viewMovedToWindow() @@ -1163,7 +1262,7 @@ { [notificationCenter addObserver: view selector: dismissModalsSelector - name: NSWindowDidMoveNotification + name: NSWindowWillMoveNotification object: currentWindow]; [notificationCenter addObserver: view @@ -1180,13 +1279,20 @@ selector: resignKeySelector name: NSWindowDidResignKeyNotification object: currentWindow]; + + [notificationCenter addObserver: view + selector: @selector (windowDidChangeScreen:) + name: NSWindowDidChangeScreenNotification + object: currentWindow]; + + updateCVDisplayLinkScreen(); } } void dismissModals() { if (hasNativeTitleBar() || isSharedWindow) - sendModalInputAttemptIfBlocked(); + sendModalInputAttemptIfBlocked (KeyWindowChanged::no); } void becomeKey() @@ -1197,7 +1303,7 @@ void resignKey() { viewFocusLoss(); - sendModalInputAttemptIfBlocked(); + sendModalInputAttemptIfBlocked (KeyWindowChanged::yes); } void liveResizingStart() @@ -1300,35 +1406,7 @@ // has a Z label). Therefore, we need to query the current keyboard // layout to figure out what character the key would have produced // if the shift key was not pressed - String unmodified; - - #if JUCE_SUPPORT_CARBON - if (auto currentKeyboard = CFUniquePtr (TISCopyCurrentKeyboardInputSource())) - { - if (auto layoutData = (CFDataRef) TISGetInputSourceProperty (currentKeyboard, - kTISPropertyUnicodeKeyLayoutData)) - { - if (auto* layoutPtr = (const UCKeyboardLayout*) CFDataGetBytePtr (layoutData)) - { - UInt32 keysDown = 0; - UniChar buffer[4]; - UniCharCount actual; - - if (UCKeyTranslate (layoutPtr, [ev keyCode], kUCKeyActionDown, 0, LMGetKbdType(), - kUCKeyTranslateNoDeadKeysBit, &keysDown, sizeof (buffer) / sizeof (UniChar), - &actual, buffer) == 0) - unmodified = String (CharPointer_UTF16 (reinterpret_cast (buffer)), 4); - } - } - } - - // did the above layout conversion fail - if (unmodified.isEmpty()) - #endif - { - unmodified = nsStringToJuce ([ev charactersIgnoringModifiers]); - } - + String unmodified = nsStringToJuce ([ev charactersIgnoringModifiers]); auto keyCode = (int) unmodified[0]; if (keyCode == 0x19) // (backwards-tab) @@ -1432,7 +1510,7 @@ return [NSArray arrayWithObjects: type, (NSString*) kPasteboardTypeFileURLPromise, NSPasteboardTypeString, nil]; } - BOOL sendDragCallback (const int type, id sender) + BOOL sendDragCallback (bool (ComponentPeer::* callback) (const DragInfo&), id sender) { NSPasteboard* pasteboard = [sender draggingPasteboard]; NSString* contentType = [pasteboard availableTypeFromArray: getSupportedDragTypes()]; @@ -1440,9 +1518,10 @@ if (contentType == nil) return false; - NSPoint p = [view convertPoint: [sender draggingLocation] fromView: nil]; + const auto p = localToGlobal (convertToPointFloat ([view convertPoint: [sender draggingLocation] fromView: nil])); + ComponentPeer::DragInfo dragInfo; - dragInfo.position.setXY ((int) p.x, (int) p.y); + dragInfo.position = ScalingHelpers::screenPosToLocalPos (component, p).roundToInt(); if (contentType == NSPasteboardTypeString) dragInfo.text = nsStringToJuce ([pasteboard stringForType: NSPasteboardTypeString]); @@ -1450,15 +1529,7 @@ dragInfo.files = getDroppedFiles (pasteboard, contentType); if (! dragInfo.isEmpty()) - { - switch (type) - { - case 0: return handleDragMove (dragInfo); - case 1: return handleDragExit (dragInfo); - case 2: return handleDragDrop (dragInfo); - default: jassertfalse; break; - } - } + return (this->*callback) (dragInfo); return false; } @@ -1539,7 +1610,7 @@ void grabFocus() override { - if (window != nil && [window canBecomeKeyWindow]) + if (window != nil) { [window makeKeyWindow]; [window makeFirstResponder: view]; @@ -1550,7 +1621,7 @@ void textInputRequired (Point, TextInputTarget&) override {} - void dismissPendingTextInput() override + void closeInputMethodContext() override { stringBeingComposed.clear(); const auto* inputContext = [NSTextInputContext currentInputContext]; @@ -1594,6 +1665,7 @@ String stringBeingComposed; NSNotificationCenter* notificationCenter = nil; + Rectangle lastSizeBeforeZoom; RectangleList deferredRepaints; uint32 lastRepaintTime; @@ -1769,12 +1841,60 @@ void setFullScreenSizeConstraints (const ComponentBoundsConstrainer& c) { - const auto minSize = NSMakeSize (static_cast (c.getMinimumWidth()), - 0.0f); - [window setMinFullScreenContentSize: minSize]; - [window setMaxFullScreenContentSize: NSMakeSize (100000, 100000)]; + if (@available (macOS 10.11, *)) + { + const auto minSize = NSMakeSize (static_cast (c.getMinimumWidth()), + 0.0f); + [window setMinFullScreenContentSize: minSize]; + [window setMaxFullScreenContentSize: NSMakeSize (100000, 100000)]; + } } + //============================================================================== + void onDisplaySourceCallback() + { + setNeedsDisplayRectangles(); + } + + void onDisplayLinkCallback() + { + dispatch_source_merge_data (displaySource, 1); + } + + static CVReturn displayLinkCallback (CVDisplayLinkRef, const CVTimeStamp*, const CVTimeStamp*, + CVOptionFlags, CVOptionFlags*, void* context) + { + static_cast (context)->onDisplayLinkCallback(); + return kCVReturnSuccess; + } + + void updateCVDisplayLinkScreen() + { + auto viewDisplayID = (CGDirectDisplayID) [[window.screen.deviceDescription objectForKey: @"NSScreenNumber"] unsignedIntegerValue]; + auto result = CVDisplayLinkSetCurrentCGDisplay (displayLink, viewDisplayID); + jassertquiet (result == kCVReturnSuccess); + } + + void createCVDisplayLink() + { + displaySource = dispatch_source_create (DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, dispatch_get_main_queue()); + dispatch_source_set_event_handler (displaySource, ^(){ onDisplaySourceCallback(); }); + dispatch_resume (displaySource); + + auto cvReturn = CVDisplayLinkCreateWithActiveCGDisplays (&displayLink); + jassertquiet (cvReturn == kCVReturnSuccess); + + cvReturn = CVDisplayLinkSetOutputCallback (displayLink, &displayLinkCallback, this); + jassertquiet (cvReturn == kCVReturnSuccess); + + CVDisplayLinkStart (displayLink); + } + + CVDisplayLinkRef displayLink = nullptr; + dispatch_source_t displaySource = nullptr; + + std::unique_ptr metalRenderer; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NSViewComponentPeer) }; @@ -1820,6 +1940,7 @@ { addMethod (@selector (isOpaque), isOpaque); addMethod (@selector (drawRect:), drawRect); + addMethod (@selector (updateTrackingAreas), updateTrackingAreas); addMethod (@selector (mouseDown:), mouseDown); addMethod (@selector (mouseUp:), mouseUp); addMethod (@selector (mouseDragged:), mouseDragged); @@ -1837,6 +1958,7 @@ addMethod (@selector (acceptsFirstMouse:), acceptsFirstMouse); addMethod (@selector (windowWillMiniaturize:), windowWillMiniaturize); addMethod (@selector (windowDidDeminiaturize:), windowDidDeminiaturize); + addMethod (@selector (windowDidChangeScreen:), windowDidChangeScreen); addMethod (@selector (wantsDefaultClipping), wantsDefaultClipping); addMethod (@selector (worksWhenModal), worksWhenModal); addMethod (@selector (viewDidMoveToWindow), viewDidMoveToWindow); @@ -1902,6 +2024,13 @@ } private: + static void updateTrackingAreas (id self, SEL) + { + sendSuperclassMessage (self, @selector (updateTrackingAreas)); + + resetTrackingArea (static_cast (self)); + } + static void mouseDown (id self, SEL s, NSEvent* ev) { if (JUCEApplicationBase::isStandaloneApp()) @@ -2003,6 +2132,12 @@ } } + static void windowDidChangeScreen (id self, SEL, NSNotification*) + { + if (auto* p = getOwner (self)) + p->windowDidChangeScreen(); + } + static BOOL isOpaque (id self, SEL) { auto* owner = getOwner (self); @@ -2190,7 +2325,7 @@ static NSDragOperation draggingUpdated (id self, SEL, id sender) { if (auto* owner = getOwner (self)) - if (owner->sendDragCallback (0, sender)) + if (owner->sendDragCallback (&NSViewComponentPeer::handleDragMove, sender)) return NSDragOperationGeneric; return NSDragOperationNone; @@ -2203,7 +2338,7 @@ static void draggingExited (id self, SEL, id sender) { - callOnOwner (self, &NSViewComponentPeer::sendDragCallback, 1, sender); + callOnOwner (self, &NSViewComponentPeer::sendDragCallback, &NSViewComponentPeer::handleDragExit, sender); } static BOOL prepareForDragOperation (id, SEL, id) @@ -2214,7 +2349,7 @@ static BOOL performDragOperation (id self, SEL, id sender) { auto* owner = getOwner (self); - return owner != nullptr && owner->sendDragCallback (2, sender); + return owner != nullptr && owner->sendDragCallback (&NSViewComponentPeer::handleDragDrop, sender); } static void concludeDragOperation (id, SEL, id) {} @@ -2303,6 +2438,7 @@ addMethod (@selector (windowWillResize:toSize:), windowWillResize); addMethod (@selector (windowDidExitFullScreen:), windowDidExitFullScreen); addMethod (@selector (windowWillEnterFullScreen:), windowWillEnterFullScreen); + addMethod (@selector (windowWillExitFullScreen:), windowWillExitFullScreen); addMethod (@selector (windowWillStartLiveResize:), windowWillStartLiveResize); addMethod (@selector (windowDidEndLiveResize:), windowDidEndLiveResize); addMethod (@selector (window:shouldPopUpDocumentPathMenu:), shouldPopUpPathMenu); @@ -2321,6 +2457,8 @@ addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), shouldAllowIconDrag); + addMethod (@selector (toggleFullScreen:), toggleFullScreen); + addProtocol (@protocol (NSWindowDelegate)); registerClass(); @@ -2353,30 +2491,42 @@ #endif } - static NSRect windowWillUseStandardFrame (id self, SEL, NSWindow*, NSRect r) + static NSRect windowWillUseStandardFrame (id self, SEL, NSWindow* window, NSRect r) { if (auto* owner = getOwner (self)) { if (auto* constrainer = owner->getConstrainer()) { - const auto originalBounds = owner->getFrameSize().addedTo (owner->getComponent().getScreenBounds()).toFloat(); - const auto expanded = originalBounds.withWidth ((float) constrainer->getMaximumWidth()) - .withHeight ((float) constrainer->getMaximumHeight()); - const auto constrained = expanded.constrainedWithin (convertToRectFloat (flippedScreenRect (r))); - return flippedScreenRect (makeNSRect (constrained)); + if (auto* screen = [window screen]) + { + const auto safeScreenBounds = convertToRectFloat (flippedScreenRect (owner->hasNativeTitleBar() ? r : [screen visibleFrame])); + const auto originalBounds = owner->getFrameSize().addedTo (owner->getComponent().getScreenBounds()).toFloat(); + const auto expanded = originalBounds.withWidth ((float) constrainer->getMaximumWidth()) + .withHeight ((float) constrainer->getMaximumHeight()); + const auto constrained = expanded.constrainedWithin (safeScreenBounds); + + return flippedScreenRect (makeNSRect ([&] + { + if (constrained == owner->getBounds().toFloat()) + return owner->lastSizeBeforeZoom.toFloat(); + + owner->lastSizeBeforeZoom = owner->getBounds().toFloat(); + return constrained; + }())); + } } } return r; } - static BOOL windowShouldZoomToFrame (id self, SEL, NSWindow* window, NSRect frame) + static BOOL windowShouldZoomToFrame (id self, SEL, NSWindow*, NSRect) { if (auto* owner = getOwner (self)) if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0) return NO; - return convertToRectFloat ([window frame]).withZeroOrigin() != convertToRectFloat (frame).withZeroOrigin(); + return YES; } static BOOL canBecomeKeyWindow (id self, SEL) @@ -2459,12 +2609,39 @@ return frameRect.size; } + static void toggleFullScreen (id self, SEL name, id sender) + { + if (auto* owner = getOwner (self)) + { + const auto isFullScreen = owner->isFullScreen(); + + if (! isFullScreen) + owner->lastSizeBeforeZoom = owner->getBounds().toFloat(); + + sendSuperclassMessage (self, name, sender); + + if (isFullScreen) + { + [NSApp setPresentationOptions: NSApplicationPresentationDefault]; + owner->setBounds (owner->lastSizeBeforeZoom.toNearestInt(), false); + } + } + } + static void windowDidExitFullScreen (id self, SEL, NSNotification*) { if (auto* owner = getOwner (self)) owner->resetWindowPresentation(); } + static void windowWillExitFullScreen (id self, SEL, NSNotification*) + { + // The exit-fullscreen animation looks bad on Monterey if the window isn't resizable... + if (auto* owner = getOwner (self)) + if (auto* window = owner->window) + [window setStyleMask: [window styleMask] | NSWindowStyleMaskResizable]; + } + static void windowWillEnterFullScreen (id self, SEL, NSNotification*) { if (SystemStats::getOperatingSystemType() <= SystemStats::MacOSX_10_9) diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_mac_Windowing.mm juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_mac_Windowing.mm --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_mac_Windowing.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_mac_Windowing.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -43,7 +43,15 @@ int getResult() const { - switch (getRawResult()) + return convertResult ([getAlert() runModal]); + } + + using AsyncUpdater::triggerAsyncUpdate; + +private: + static int convertResult (NSModalResponse response) + { + switch (response) { case NSAlertFirstButtonReturn: return 0; case NSAlertSecondButtonReturn: return 1; @@ -55,15 +63,37 @@ return 0; } - using AsyncUpdater::triggerAsyncUpdate; - -private: void handleAsyncUpdate() override { - auto result = getResult(); + if (auto* comp = options.getAssociatedComponent()) + { + if (auto* peer = comp->getPeer()) + { + if (auto* view = static_cast (peer->getNativeHandle())) + { + if (auto* window = [view window]) + { + if (@available (macOS 10.9, *)) + { + [getAlert() beginSheetModalForWindow: window completionHandler: ^(NSModalResponse result) + { + handleModalFinished (result); + }]; + + return; + } + } + } + } + } + handleModalFinished ([getAlert() runModal]); + } + + void handleModalFinished (NSModalResponse result) + { if (callback != nullptr) - callback->modalStateFinished (result); + callback->modalStateFinished (convertResult (result)); delete this; } @@ -74,7 +104,7 @@ [alert addButtonWithTitle: juceStringToNS (button)]; } - NSInteger getRawResult() const + NSAlert* getAlert() const { NSAlert* alert = [[[NSAlert alloc] init] autorelease]; @@ -90,7 +120,7 @@ addButton (alert, options.getButtonText (1)); addButton (alert, options.getButtonText (2)); - return [alert runModal]; + return alert; } MessageBoxOptions options; @@ -125,13 +155,14 @@ #if JUCE_MODAL_LOOPS_PERMITTED void JUCE_CALLTYPE NativeMessageBox::showMessageBox (MessageBoxIconType iconType, const String& title, const String& message, - Component* /*associatedComponent*/) + Component* associatedComponent) { showDialog (MessageBoxOptions() .withIconType (iconType) .withTitle (title) .withMessage (message) - .withButton (TRANS("OK")), + .withButton (TRANS("OK")) + .withAssociatedComponent (associatedComponent), nullptr, AlertWindowMappings::messageBox); } @@ -143,20 +174,21 @@ void JUCE_CALLTYPE NativeMessageBox::showMessageBoxAsync (MessageBoxIconType iconType, const String& title, const String& message, - Component* /*associatedComponent*/, + Component* associatedComponent, ModalComponentManager::Callback* callback) { showDialog (MessageBoxOptions() .withIconType (iconType) .withTitle (title) .withMessage (message) - .withButton (TRANS("OK")), + .withButton (TRANS("OK")) + .withAssociatedComponent (associatedComponent), callback, AlertWindowMappings::messageBox); } bool JUCE_CALLTYPE NativeMessageBox::showOkCancelBox (MessageBoxIconType iconType, const String& title, const String& message, - Component* /*associatedComponent*/, + Component* associatedComponent, ModalComponentManager::Callback* callback) { return showDialog (MessageBoxOptions() @@ -164,13 +196,14 @@ .withTitle (title) .withMessage (message) .withButton (TRANS("OK")) - .withButton (TRANS("Cancel")), + .withButton (TRANS("Cancel")) + .withAssociatedComponent (associatedComponent), callback, AlertWindowMappings::okCancel) != 0; } int JUCE_CALLTYPE NativeMessageBox::showYesNoCancelBox (MessageBoxIconType iconType, const String& title, const String& message, - Component* /*associatedComponent*/, + Component* associatedComponent, ModalComponentManager::Callback* callback) { return showDialog (MessageBoxOptions() @@ -179,13 +212,14 @@ .withMessage (message) .withButton (TRANS("Yes")) .withButton (TRANS("No")) - .withButton (TRANS("Cancel")), + .withButton (TRANS("Cancel")) + .withAssociatedComponent (associatedComponent), callback, AlertWindowMappings::yesNoCancel); } int JUCE_CALLTYPE NativeMessageBox::showYesNoBox (MessageBoxIconType iconType, const String& title, const String& message, - Component* /*associatedComponent*/, + Component* associatedComponent, ModalComponentManager::Callback* callback) { return showDialog (MessageBoxOptions() @@ -193,7 +227,8 @@ .withTitle (title) .withMessage (message) .withButton (TRANS("Yes")) - .withButton (TRANS("No")), + .withButton (TRANS("No")) + .withAssociatedComponent (associatedComponent), callback, AlertWindowMappings::okCancel); } diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_MultiTouchMapper.h juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_MultiTouchMapper.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_MultiTouchMapper.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_MultiTouchMapper.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -212,7 +212,7 @@ }; //============================================================================== - HDROP createHDrop (const StringArray& fileNames) + static HDROP createHDrop (const StringArray& fileNames) { size_t totalBytes = 0; for (int i = fileNames.size(); --i >= 0;) diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_win32_Windowing.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_win32_Windowing.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/juce_win32_Windowing.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/juce_win32_Windowing.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -61,7 +61,7 @@ #if JUCE_DEBUG int numActiveScopedDpiAwarenessDisablers = 0; - bool isInScopedDPIAwarenessDisabler() { return numActiveScopedDpiAwarenessDisablers > 0; } + static bool isInScopedDPIAwarenessDisabler() { return numActiveScopedDpiAwarenessDisablers > 0; } extern HWND juce_messageWindowHandle; #endif @@ -472,17 +472,18 @@ #endif } -static bool isPerMonitorDPIAwareThread() +static bool isPerMonitorDPIAwareThread (GetThreadDPIAwarenessContextFunc getThreadDPIAwarenessContextIn = getThreadDPIAwarenessContext, + GetAwarenessFromDpiAwarenessContextFunc getAwarenessFromDPIAwarenessContextIn = getAwarenessFromDPIAwarenessContext) { #if ! JUCE_WIN_PER_MONITOR_DPI_AWARE return false; #else setDPIAwareness(); - if (getThreadDPIAwarenessContext != nullptr - && getAwarenessFromDPIAwarenessContext != nullptr) + if (getThreadDPIAwarenessContextIn != nullptr + && getAwarenessFromDPIAwarenessContextIn != nullptr) { - return (getAwarenessFromDPIAwarenessContext (getThreadDPIAwarenessContext()) + return (getAwarenessFromDPIAwarenessContextIn (getThreadDPIAwarenessContextIn()) == DPI_Awareness::DPI_Awareness_Per_Monitor_Aware); } @@ -576,12 +577,17 @@ ScopedDPIAwarenessDisabler::ScopedDPIAwarenessDisabler() { - if (! isPerMonitorDPIAwareThread()) + static auto localGetThreadDpiAwarenessContext = (GetThreadDPIAwarenessContextFunc) getUser32Function ("GetThreadDpiAwarenessContext"); + static auto localGetAwarenessFromDpiAwarenessContextFunc = (GetAwarenessFromDpiAwarenessContextFunc) getUser32Function ("GetAwarenessFromDpiAwarenessContext"); + + if (! isPerMonitorDPIAwareThread (localGetThreadDpiAwarenessContext, localGetAwarenessFromDpiAwarenessContextFunc)) return; - if (setThreadDPIAwarenessContext != nullptr) + static auto localSetThreadDPIAwarenessContext = (SetThreadDPIAwarenessContextFunc) getUser32Function ("SetThreadDpiAwarenessContext"); + + if (localSetThreadDPIAwarenessContext != nullptr) { - previousContext = setThreadDPIAwarenessContext (DPI_AWARENESS_CONTEXT_UNAWARE); + previousContext = localSetThreadDPIAwarenessContext (DPI_AWARENESS_CONTEXT_UNAWARE); #if JUCE_DEBUG ++numActiveScopedDpiAwarenessDisablers; @@ -593,7 +599,10 @@ { if (previousContext != nullptr) { - setThreadDPIAwarenessContext ((DPI_AWARENESS_CONTEXT) previousContext); + static auto localSetThreadDPIAwarenessContext = (SetThreadDPIAwarenessContextFunc) getUser32Function ("SetThreadDpiAwarenessContext"); + + if (localSetThreadDPIAwarenessContext != nullptr) + localSetThreadDPIAwarenessContext ((DPI_AWARENESS_CONTEXT) previousContext); #if JUCE_DEBUG --numActiveScopedDpiAwarenessDisablers; @@ -649,6 +658,7 @@ return p; } +JUCE_API double getScaleFactorForWindow (HWND h); JUCE_API double getScaleFactorForWindow (HWND h) { // NB. Using a local function here because we need to call this method from the plug-in wrappers @@ -758,6 +768,11 @@ #endif } + ~NativeDarkModeChangeDetectorImpl() + { + UnhookWindowsHookEx (hook); + } + bool isDarkModeEnabled() const noexcept { return darkModeEnabled; } private: @@ -825,6 +840,7 @@ return upright; } +int64 getMouseEventTime(); int64 getMouseEventTime() { static int64 eventTimeOffset = 0; @@ -990,7 +1006,9 @@ void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override { - bitmap.data = imageData + x * pixelStride + y * lineStride; + const auto offset = (size_t) (x * pixelStride + y * lineStride); + bitmap.data = imageData + offset; + bitmap.size = (size_t) (lineStride * height) - offset; bitmap.pixelFormat = pixelFormat; bitmap.lineStride = lineStride; bitmap.pixelStride = pixelStride; @@ -1095,7 +1113,7 @@ //============================================================================== namespace IconConverters { - Image createImageFromHICON (HICON icon) + static Image createImageFromHICON (HICON icon) { if (icon == nullptr) return {}; @@ -1203,6 +1221,7 @@ return {}; } + HICON createHICONFromImage (const Image& image, const BOOL isIcon, int hotspotX, int hotspotY); HICON createHICONFromImage (const Image& image, const BOOL isIcon, int hotspotX, int hotspotY) { auto nativeBitmap = new WindowsBitmapImage (Image::ARGB, image.getWidth(), image.getHeight(), true); @@ -1226,7 +1245,7 @@ DeleteObject (mask); return hi; } -} +} // namespace IconConverters //============================================================================== JUCE_IUNKNOWNCLASS (ITipInvocation, "37c994e7-432b-4834-a2f7-dce1f13b834b") @@ -1245,93 +1264,6 @@ namespace juce { -struct OnScreenKeyboard : public DeletedAtShutdown, - private Timer -{ - void activate() - { - shouldBeActive = true; - startTimer (10); - } - - void deactivate() - { - shouldBeActive = false; - startTimer (10); - } - - JUCE_DECLARE_SINGLETON_SINGLETHREADED (OnScreenKeyboard, false) - -private: - OnScreenKeyboard() - { - tipInvocation.CoCreateInstance (ITipInvocation::getCLSID(), CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER); - } - - ~OnScreenKeyboard() override - { - clearSingletonInstance(); - } - - void timerCallback() override - { - stopTimer(); - - if (reentrant || tipInvocation == nullptr) - return; - - const ScopedValueSetter setter (reentrant, true, false); - - auto isActive = isKeyboardVisible(); - - if (isActive != shouldBeActive) - { - if (! isActive) - { - tipInvocation->Toggle (GetDesktopWindow()); - } - else - { - if (auto hwnd = FindWindow (L"IPTip_Main_Window", nullptr)) - PostMessage (hwnd, WM_SYSCOMMAND, (int) SC_CLOSE, 0); - } - } - } - - bool isVisible() - { - if (auto hwnd = FindWindowEx (nullptr, nullptr, L"ApplicationFrameWindow", nullptr)) - return FindWindowEx (hwnd, nullptr, L"Windows.UI.Core.CoreWindow", L"Microsoft Text Input Application") != nullptr; - - return false; - } - - bool isVisibleLegacy() - { - if (auto hwnd = FindWindow (L"IPTip_Main_Window", nullptr)) - { - auto style = GetWindowLong (hwnd, GWL_STYLE); - return (style & WS_DISABLED) == 0 && (style & WS_VISIBLE) != 0; - } - - return false; - } - - bool isKeyboardVisible() - { - if (isVisible()) - return true; - - // isVisible() may fail on Win10 versions < 1709 so try the old method too - return isVisibleLegacy(); - } - - bool shouldBeActive = false, reentrant = false; - ComSmartPtr tipInvocation; -}; - -JUCE_IMPLEMENT_SINGLETON (OnScreenKeyboard) - //============================================================================== struct HSTRING_PRIVATE; typedef HSTRING_PRIVATE* HSTRING; @@ -1391,7 +1323,7 @@ return; LPCWSTR uwpClassName = L"Windows.UI.ViewManagement.UIViewSettings"; - HSTRING uwpClassId; + HSTRING uwpClassId = nullptr; if (createHString (uwpClassName, (::UINT32) wcslen (uwpClassName), &uwpClassId) != S_OK || uwpClassId == nullptr) @@ -1411,30 +1343,6 @@ } } - bool isTabletModeActivatedForWindow (::HWND hWnd) const - { - if (viewSettingsInterop == nullptr) - return false; - - ComSmartPtr viewSettings; - - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") - - if (viewSettingsInterop->GetForWindow (hWnd, __uuidof (IUIViewSettings), - (void**) viewSettings.resetAndGetPointerAddress()) == S_OK - && viewSettings != nullptr) - { - IUIViewSettings::UserInteractionMode mode; - - if (viewSettings->GetUserInteractionMode (&mode) == S_OK) - return mode == IUIViewSettings::Touch; - } - - JUCE_END_IGNORE_WARNINGS_GCC_LIKE - - return false; - } - private: //============================================================================== struct ComBaseModule @@ -1465,7 +1373,251 @@ }; //============================================================================== +static HMONITOR getMonitorFromOutput (ComSmartPtr output) +{ + DXGI_OUTPUT_DESC desc = {}; + return (FAILED (output->GetDesc (&desc)) || ! desc.AttachedToDesktop) + ? nullptr + : desc.Monitor; +} + +struct VBlankListener +{ + virtual void onVBlank() = 0; +}; + +//============================================================================== +class VSyncThread : private Thread, + private AsyncUpdater +{ +public: + VSyncThread (ComSmartPtr out, + HMONITOR mon, + VBlankListener& listener) + : Thread ("VSyncThread"), + output (out), + monitor (mon) + { + listeners.push_back (listener); + startThread (10); + } + + ~VSyncThread() override + { + stopThread (-1); + cancelPendingUpdate(); + } + + void updateMonitor() + { + monitor = getMonitorFromOutput (output); + } + + HMONITOR getMonitor() const noexcept { return monitor; } + + void addListener (VBlankListener& listener) + { + listeners.push_back (listener); + } + + bool removeListener (const VBlankListener& listener) + { + auto it = std::find_if (listeners.cbegin(), + listeners.cend(), + [&listener] (const auto& l) { return &(l.get()) == &listener; }); + + if (it != listeners.cend()) + { + listeners.erase (it); + return true; + } + + return false; + } + + bool hasNoListeners() const noexcept + { + return listeners.empty(); + } + + bool hasListener (const VBlankListener& listener) const noexcept + { + return std::any_of (listeners.cbegin(), + listeners.cend(), + [&listener] (const auto& l) { return &(l.get()) == &listener; }); + } + +private: + //============================================================================== + void run() override + { + while (! threadShouldExit()) + { + if (output->WaitForVBlank() == S_OK) + triggerAsyncUpdate(); + else + Thread::sleep (1); + } + } + + void handleAsyncUpdate() override + { + for (auto& listener : listeners) + listener.get().onVBlank(); + } + + //============================================================================== + ComSmartPtr output; + HMONITOR monitor = nullptr; + std::vector> listeners; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSyncThread) + JUCE_DECLARE_NON_MOVEABLE (VSyncThread) +}; + +//============================================================================== +class VBlankDispatcher : public DeletedAtShutdown +{ +public: + void updateDisplay (VBlankListener& listener, HMONITOR monitor) + { + if (monitor == nullptr) + { + removeListener (listener); + return; + } + + auto threadWithListener = threads.end(); + auto threadWithMonitor = threads.end(); + + for (auto it = threads.begin(); it != threads.end(); ++it) + { + if ((*it)->hasListener (listener)) + threadWithListener = it; + + if ((*it)->getMonitor() == monitor) + threadWithMonitor = it; + + if (threadWithListener != threads.end() + && threadWithMonitor != threads.end()) + { + if (threadWithListener == threadWithMonitor) + return; + + (*threadWithMonitor)->addListener (listener); + + // This may invalidate iterators, so be careful! + removeListener (threadWithListener, listener); + return; + } + } + + if (threadWithMonitor != threads.end()) + { + (*threadWithMonitor)->addListener (listener); + return; + } + + if (threadWithListener != threads.end()) + removeListener (threadWithListener, listener); + + for (auto adapter : adapters) + { + UINT i = 0; + ComSmartPtr output; + + while (adapter->EnumOutputs (i, output.resetAndGetPointerAddress()) != DXGI_ERROR_NOT_FOUND) + { + if (getMonitorFromOutput (output) == monitor) + { + threads.emplace_back (std::make_unique (output, monitor, listener)); + return; + } + + ++i; + } + } + } + + void removeListener (const VBlankListener& listener) + { + for (auto it = threads.begin(); it != threads.end(); ++it) + if (removeListener (it, listener)) + return; + } + + void reconfigureDisplays() + { + adapters.clear(); + + ComSmartPtr factory; + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") + CreateDXGIFactory (__uuidof (IDXGIFactory), (void**)factory.resetAndGetPointerAddress()); + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + UINT i = 0; + ComSmartPtr adapter; + + while (factory->EnumAdapters (i, adapter.resetAndGetPointerAddress()) != DXGI_ERROR_NOT_FOUND) + { + adapters.push_back (adapter); + ++i; + } + + for (auto& thread : threads) + thread->updateMonitor(); + + threads.erase (std::remove_if (threads.begin(), + threads.end(), + [] (const auto& thread) { return thread->getMonitor() == nullptr; }), + threads.end()); + } + + JUCE_DECLARE_SINGLETON_SINGLETHREADED (VBlankDispatcher, true) + +private: + //============================================================================== + using Threads = std::vector>; + + VBlankDispatcher() + { + reconfigureDisplays(); + } + + ~VBlankDispatcher() override + { + threads.clear(); + clearSingletonInstance(); + } + + // This may delete the corresponding thread and invalidate iterators, + // so be careful! + bool removeListener (Threads::iterator it, const VBlankListener& listener) + { + if ((*it)->removeListener (listener)) + { + if ((*it)->hasNoListeners()) + threads.erase (it); + + return true; + } + + return false; + } + + //============================================================================== + std::vector> adapters; + Threads threads; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VBlankDispatcher) + JUCE_DECLARE_NON_MOVEABLE (VBlankDispatcher) +}; + +JUCE_IMPLEMENT_SINGLETON (VBlankDispatcher) + +//============================================================================== class HWNDComponentPeer : public ComponentPeer, + private VBlankListener, private Timer #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client , public ModifierKeyReceiver @@ -1490,8 +1642,6 @@ setTitle (component.getName()); updateShadower(); - OnScreenKeyboard::getInstance(); - getNativeRealtimeModifiers = [] { HWNDComponentPeer::updateKeyModifiers(); @@ -1505,10 +1655,15 @@ return ModifierKeys::currentModifiers; }; + + if (updateCurrentMonitor()) + VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor); } ~HWNDComponentPeer() override { + VBlankDispatcher::getInstance()->removeListener (*this); + // do this first to avoid messages arriving for this window before it's destroyed JuceWindowIdentifier::setAsJUCEWindow (hwnd, false); @@ -1583,6 +1738,13 @@ void setBounds (const Rectangle& bounds, bool isNowFullScreen) override { + // If we try to set new bounds while handling an existing position change, + // Windows may get confused about our current scale and size. + // This can happen when moving a window between displays, because the mouse-move + // generator in handlePositionChanged can cause the window to move again. + if (inHandlePositionChanged) + return; + const ScopedValueSetter scope (shouldIgnoreModalDismiss, true); fullScreen = isNowFullScreen; @@ -1608,7 +1770,7 @@ if (! hasMoved) flags |= SWP_NOMOVE; if (! hasResized) flags |= SWP_NOSIZE; - setWindowPos (hwnd, newBounds, flags, numInDpiChange == 0); + setWindowPos (hwnd, newBounds, flags, ! inDpiChange); if (hasResized && isValidPeer (this)) { @@ -1757,6 +1919,11 @@ return w == hwnd || (trueIfInAChildWindow && (IsChild (hwnd, w) != 0)); } + OptionalBorderSize getFrameSizeIfPresent() const override + { + return ComponentPeer::OptionalBorderSize { windowBorder }; + } + BorderSize getFrameSize() const override { return windowBorder; @@ -1838,36 +2005,61 @@ void textInputRequired (Point, TextInputTarget&) override { if (! hasCreatedCaret) + hasCreatedCaret = CreateCaret (hwnd, (HBITMAP) 1, 0, 0); + + if (hasCreatedCaret) { - hasCreatedCaret = true; - CreateCaret (hwnd, (HBITMAP) 1, 0, 0); + SetCaretPos (0, 0); + ShowCaret (hwnd); } - ShowCaret (hwnd); - SetCaretPos (0, 0); + ImmAssociateContext (hwnd, nullptr); - if (uwpViewSettings.isTabletModeActivatedForWindow (hwnd)) - OnScreenKeyboard::getInstance()->activate(); + // MSVC complains about the nullptr argument, but the docs for this + // function say that the second argument is ignored when the third + // argument is IACE_DEFAULT. + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6387) + ImmAssociateContextEx (hwnd, nullptr, IACE_DEFAULT); + JUCE_END_IGNORE_WARNINGS_MSVC } - void dismissPendingTextInput() override + void closeInputMethodContext() override { imeHandler.handleSetContext (hwnd, false); + } - if (uwpViewSettings.isTabletModeActivatedForWindow (hwnd)) - OnScreenKeyboard::getInstance()->deactivate(); + void dismissPendingTextInput() override + { + closeInputMethodContext(); + + ImmAssociateContext (hwnd, nullptr); + + if (std::exchange (hasCreatedCaret, false)) + DestroyCaret(); } void repaint (const Rectangle& area) override { - auto r = RECTFromRectangle ((area.toDouble() * getPlatformScaleFactor()).getSmallestIntegerContainer()); - InvalidateRect (hwnd, &r, FALSE); + deferredRepaints.add ((area.toDouble() * getPlatformScaleFactor()).getSmallestIntegerContainer()); + } + + void dispatchDeferredRepaints() + { + for (auto deferredRect : deferredRepaints) + { + auto r = RECTFromRectangle (deferredRect); + InvalidateRect (hwnd, &r, FALSE); + } + + deferredRepaints.clear(); } void performAnyPendingRepaintsNow() override { if (component.isVisible()) { + dispatchDeferredRepaints(); + WeakReference localRef (&component); MSG m; @@ -1878,6 +2070,12 @@ } //============================================================================== + void onVBlank() override + { + dispatchDeferredRepaints(); + } + + //============================================================================== static HWNDComponentPeer* getOwnerOfWindow (HWND h) noexcept { if (h != nullptr && JuceWindowIdentifier::isJUCEWindow (h)) @@ -1981,8 +2179,9 @@ private: Point getMousePos (POINTL mousePos) const { - return peer.getComponent().getLocalPoint (nullptr, convertPhysicalScreenPointToLogical (pointFromPOINT ({ mousePos.x, mousePos.y }), - (HWND) peer.getNativeHandle()).toFloat()); + const auto originalPos = pointFromPOINT ({ mousePos.x, mousePos.y }); + const auto logicalPos = convertPhysicalScreenPointToLogical (originalPos, peer.hwnd); + return ScalingHelpers::screenPosToLocalPos (peer.component, logicalPos.toFloat()); } struct DroppedData @@ -2125,7 +2324,8 @@ #endif double scaleFactor = 1.0; - int numInDpiChange = 0; + bool inDpiChange = 0, inHandlePositionChanged = 0; + HMONITOR currentMonitor = nullptr; bool isAccessibilityActive = false; @@ -2394,6 +2594,13 @@ } else { + TCHAR messageBuffer[256] = {}; + + FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + nullptr, GetLastError(), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), + messageBuffer, (DWORD) numElementsInArray (messageBuffer) - 1, nullptr); + + DBG (messageBuffer); jassertfalse; } } @@ -2798,8 +3005,8 @@ if (now >= lastMouseTime + minTimeBetweenMouses) { lastMouseTime = now; - doMouseEvent (position, MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, modsToSend); + doMouseEvent (position, MouseInputSource::defaultPressure, + MouseInputSource::defaultOrientation, modsToSend); } } @@ -2825,7 +3032,7 @@ isDragging = true; - doMouseEvent (position, MouseInputSource::invalidPressure); + doMouseEvent (position, MouseInputSource::defaultPressure); } } @@ -2852,7 +3059,7 @@ // NB: under some circumstances (e.g. double-clicking a native title bar), a mouse-up can // arrive without a mouse-down, so in that case we need to avoid sending a message. if (wasDragging) - doMouseEvent (position, MouseInputSource::invalidPressure); + doMouseEvent (position, MouseInputSource::defaultPressure); } void doCaptureChanged() @@ -2874,7 +3081,7 @@ isMouseOver = false; if (! areOtherTouchSourcesActive()) - doMouseEvent (getCurrentMousePos(), MouseInputSource::invalidPressure); + doMouseEvent (getCurrentMousePos(), MouseInputSource::defaultPressure); } ComponentPeer* findPeerUnderMouse (Point& localPos) @@ -2991,7 +3198,7 @@ } bool handleTouchInput (const TOUCHINPUT& touch, const bool isDown, const bool isUp, - const float touchPressure = MouseInputSource::invalidPressure, + const float touchPressure = MouseInputSource::defaultPressure, const float orientation = 0.0f) { auto isCancel = false; @@ -3068,9 +3275,9 @@ return false; const auto pressure = touchInfo.touchMask & TOUCH_MASK_PRESSURE ? static_cast (touchInfo.pressure) - : MouseInputSource::invalidPressure; + : MouseInputSource::defaultPressure; const auto orientation = touchInfo.touchMask & TOUCH_MASK_ORIENTATION ? degreesToRadians (static_cast (touchInfo.orientation)) - : MouseInputSource::invalidOrientation; + : MouseInputSource::defaultOrientation; if (! handleTouchInput (emulateTouchEventFromPointer (touchInfo.pointerInfo.ptPixelLocationRaw, wParam), isDown, isUp, pressure, orientation)) @@ -3083,7 +3290,7 @@ if (! getPointerPenInfo (GET_POINTERID_WPARAM (wParam), &penInfo)) return false; - const auto pressure = (penInfo.penMask & PEN_MASK_PRESSURE) ? (float) penInfo.pressure / 1024.0f : MouseInputSource::invalidPressure; + const auto pressure = (penInfo.penMask & PEN_MASK_PRESSURE) ? (float) penInfo.pressure / 1024.0f : MouseInputSource::defaultPressure; if (! handlePenInput (penInfo, globalToLocal (convertPhysicalScreenPointToLogical (pointFromPOINT (getPOINTFromLParam (lParam)), hwnd).toFloat()), pressure, isDown, isUp)) @@ -3114,9 +3321,9 @@ ModifierKeys modsToSend (ModifierKeys::currentModifiers); PenDetails penDetails; - penDetails.rotation = (penInfo.penMask & PEN_MASK_ROTATION) ? degreesToRadians (static_cast (penInfo.rotation)) : MouseInputSource::invalidRotation; - penDetails.tiltX = (penInfo.penMask & PEN_MASK_TILT_X) ? (float) penInfo.tiltX / 90.0f : MouseInputSource::invalidTiltX; - penDetails.tiltY = (penInfo.penMask & PEN_MASK_TILT_Y) ? (float) penInfo.tiltY / 90.0f : MouseInputSource::invalidTiltY; + penDetails.rotation = (penInfo.penMask & PEN_MASK_ROTATION) ? degreesToRadians (static_cast (penInfo.rotation)) : MouseInputSource::defaultRotation; + penDetails.tiltX = (penInfo.penMask & PEN_MASK_TILT_X) ? (float) penInfo.tiltX / 90.0f : MouseInputSource::defaultTiltX; + penDetails.tiltY = (penInfo.penMask & PEN_MASK_TILT_Y) ? (float) penInfo.tiltY / 90.0f : MouseInputSource::defaultTiltY; auto pInfoFlags = penInfo.pointerInfo.pointerFlags; @@ -3131,7 +3338,7 @@ // this forces a mouse-enter/up event, in case for some reason we didn't get a mouse-up before. handleMouseEvent (MouseInputSource::InputSourceType::pen, pos, modsToSend.withoutMouseButtons(), - pressure, MouseInputSource::invalidOrientation, time, penDetails); + pressure, MouseInputSource::defaultOrientation, time, penDetails); if (! isValidPeer (this)) // (in case this component was deleted by the event) return false; @@ -3143,7 +3350,7 @@ } handleMouseEvent (MouseInputSource::InputSourceType::pen, pos, modsToSend, pressure, - MouseInputSource::invalidOrientation, time, penDetails); + MouseInputSource::defaultOrientation, time, penDetails); if (! isValidPeer (this)) // (in case this component was deleted by the event) return false; @@ -3151,7 +3358,7 @@ if (isUp) { handleMouseEvent (MouseInputSource::InputSourceType::pen, MouseInputSource::offscreenMousePos, ModifierKeys::currentModifiers, - pressure, MouseInputSource::invalidOrientation, time, penDetails); + pressure, MouseInputSource::defaultOrientation, time, penDetails); if (! isValidPeer (this)) return false; @@ -3442,14 +3649,22 @@ return 0; } + bool updateCurrentMonitor() + { + auto monitor = MonitorFromWindow (hwnd, MONITOR_DEFAULTTONULL); + return std::exchange (currentMonitor, monitor) != monitor; + } + bool handlePositionChanged() { auto pos = getCurrentMousePos(); if (contains (pos.roundToInt(), false)) { + const ScopedValueSetter scope (inHandlePositionChanged, true); + if (! areOtherTouchSourcesActive()) - doMouseEvent (pos, MouseInputSource::invalidPressure); + doMouseEvent (pos, MouseInputSource::defaultPressure); if (! isValidPeer (this)) return true; @@ -3457,6 +3672,9 @@ handleMovedOrResized(); + if (updateCurrentMonitor()) + VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor); + return ! dontRepaint; // to allow non-accelerated openGL windows to draw themselves correctly. } @@ -3477,15 +3695,27 @@ scaleFactor = newScale; { - const ScopedValueSetter setter (numInDpiChange, numInDpiChange + 1); - setBounds (windowBorder.subtractedFrom (convertPhysicalScreenRectangleToLogical (rectangleFromRECT (newRect), hwnd)), fullScreen); + const ScopedValueSetter setter (inDpiChange, true); + SetWindowPos (hwnd, + nullptr, + newRect.left, + newRect.top, + newRect.right - newRect.left, + newRect.bottom - newRect.top, + SWP_NOZORDER | SWP_NOACTIVATE); } // This is to handle reentrancy. If responding to a DPI change triggers further DPI changes, // we should only notify listeners and resize windows once all of the DPI changes have // resolved. - if (numInDpiChange != 0) + if (inDpiChange) + { + // Danger! Re-entrant call to handleDPIChanging. + // Please report this issue on the JUCE forum, along with instructions + // so that a JUCE developer can reproduce the issue. + jassertfalse; return 0; + } updateShadower(); InvalidateRect (hwnd, nullptr, FALSE); @@ -3598,6 +3828,11 @@ setWindowPos (hwnd, ScalingHelpers::scaledScreenPosToUnscaled (component, Desktop::getInstance().getDisplays() .getDisplayForRect (component.getScreenBounds())->userArea), SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOSENDCHANGING); + + auto* dispatcher = VBlankDispatcher::getInstance(); + dispatcher->reconfigureDisplays(); + updateCurrentMonitor(); + dispatcher->updateDisplay (*this, currentMonitor); } //============================================================================== @@ -4061,13 +4296,18 @@ { if (compositionInProgress && ! windowIsActive) { - compositionInProgress = false; - if (HIMC hImc = ImmGetContext (hWnd)) { ImmNotifyIME (hImc, NI_COMPOSITIONSTR, CPS_COMPLETE, 0); ImmReleaseContext (hWnd, hImc); } + + // If the composition is still in progress, calling ImmNotifyIME may call back + // into handleComposition to let us know that the composition has finished. + // We need to set compositionInProgress *after* calling handleComposition, so that + // the text replaces the current selection, rather than being inserted after the + // caret. + compositionInProgress = false; } } @@ -4357,6 +4597,8 @@ IMEHandler imeHandler; bool shouldIgnoreModalDismiss = false; + RectangleList deferredRepaints; + //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HWNDComponentPeer) }; @@ -4369,6 +4611,7 @@ return new HWNDComponentPeer (*this, styleFlags, (HWND) parentHWND, false); } +JUCE_API ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component& component, void* parentHWND); JUCE_API ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component& component, void* parentHWND) { return new HWNDComponentPeer (component, ComponentPeer::windowIgnoresMouseClicks, @@ -4408,6 +4651,7 @@ } // (This internal function is used by the plugin client module) +bool offerKeyMessageToJUCEWindow (MSG& m); bool offerKeyMessageToJUCEWindow (MSG& m) { return HWNDComponentPeer::offerKeyMessageToJUCEWindow (m); } //============================================================================== diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -156,9 +156,10 @@ if (windowH == 0) windowH = (::Window) peer->getNativeHandle(); - auto dropPos = Desktop::getInstance().getDisplays().physicalToLogical (Point ((int) clientMsg.data.l[2] >> 16, - (int) clientMsg.data.l[2] & 0xffff)); - dropPos -= peer->getBounds().getPosition(); + const auto displays = Desktop::getInstance().getDisplays(); + const auto logicalPos = displays.physicalToLogical (Point ((int) clientMsg.data.l[2] >> 16, + (int) clientMsg.data.l[2] & 0xffff)); + const auto dropPos = ScalingHelpers::screenPosToLocalPos (peer->getComponent(), logicalPos.toFloat()).roundToInt(); const auto& atoms = getAtoms(); diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h juce-7.0.0~ds0/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp juce-7.0.0~ds0/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -154,7 +154,7 @@ if (atom == None) return "None"; - return X11Symbols::getInstance()->xGetAtomName (display, atom); + return makeXFreePtr (X11Symbols::getInstance()->xGetAtomName (display, atom)).get(); } bool XWindowSystemUtilities::Atoms::isMimeTypeFile (::Display* display, Atom atom) @@ -566,6 +566,7 @@ { static int trappedErrorCode = 0; + extern "C" int errorTrapHandler (Display*, XErrorEvent* err); extern "C" int errorTrapHandler (Display*, XErrorEvent* err) { trappedErrorCode = err->error_code; @@ -968,7 +969,9 @@ void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override { - bitmap.data = imageData + x * pixelStride + y * lineStride; + const auto offset = (size_t) (x * pixelStride + y * lineStride); + bitmap.data = imageData + offset; + bitmap.size = (size_t) (lineStride * height) - offset; bitmap.pixelFormat = pixelFormat; bitmap.lineStride = lineStride; bitmap.pixelStride = pixelStride; @@ -1744,7 +1747,13 @@ X11Symbols::getInstance()->xSetWMNormalHints (display, windowH, hints.get()); } - auto windowBorder = peer->getFrameSize(); + const auto windowBorder = [&]() -> BorderSize + { + if (const auto& frameSize = peer->getFrameSizeIfPresent()) + return *frameSize; + + return {}; + }(); X11Symbols::getInstance()->xMoveResizeWindow (display, windowH, newBounds.getX() - windowBorder.getLeft(), @@ -1774,7 +1783,14 @@ } else if (auto* c = peer.getConstrainer()) { - const auto windowBorder = peer.getFrameSize(); + const auto windowBorder = [&]() -> BorderSize + { + if (const auto& frameSize = peer.getFrameSizeIfPresent()) + return *frameSize; + + return {}; + }(); + const auto factor = peer.getPlatformScaleFactor(); const auto leftAndRight = windowBorder.getLeftAndRight(); const auto topAndBottom = windowBorder.getTopAndBottom(); @@ -1802,7 +1818,7 @@ && child == None; } -BorderSize XWindowSystem::getBorderSize (::Window windowH) const +ComponentPeer::OptionalBorderSize XWindowSystem::getBorderSize (::Window windowH) const { jassert (windowH != 0); @@ -1824,7 +1840,7 @@ data += sizeof (unsigned long); } - return { (int) sizes[2], (int) sizes[0], (int) sizes[3], (int) sizes[1] }; + return ComponentPeer::OptionalBorderSize ({ (int) sizes[2], (int) sizes[0], (int) sizes[3], (int) sizes[1] }); } } @@ -1855,7 +1871,9 @@ } else { - parentScreenPosition = Point (rootX, rootY); + // XGetGeometry returns wx and wy relative to the parent window's origin. + // XTranslateCoordinates returns rootX and rootY relative to the root window. + parentScreenPosition = Point (rootX - wx, rootY - wy); } } @@ -3185,26 +3203,33 @@ { jassert (display != nullptr); - XWindowSystemUtilities::ScopedXLock xLock; + { + XWindowSystemUtilities::ScopedXLock xLock; - X11Symbols::getInstance()->xDestroyWindow (display, juce_messageWindowHandle); - juce_messageWindowHandle = 0; - X11Symbols::getInstance()->xSync (display, True); + X11Symbols::getInstance()->xDestroyWindow (display, juce_messageWindowHandle); + juce_messageWindowHandle = 0; + X11Symbols::getInstance()->xSync (display, True); + } LinuxEventLoop::unregisterFdCallback (X11Symbols::getInstance()->xConnectionNumber (display)); - X11Symbols::getInstance()->xCloseDisplay (display); - display = nullptr; - displayVisuals = nullptr; + { + XWindowSystemUtilities::ScopedXLock xLock; + X11Symbols::getInstance()->xCloseDisplay (display); + display = nullptr; + displayVisuals = nullptr; + } } } //============================================================================== +::Window juce_createKeyProxyWindow (ComponentPeer* peer); ::Window juce_createKeyProxyWindow (ComponentPeer* peer) { return XWindowSystem::getInstance()->createKeyProxy ((::Window) peer->getNativeHandle()); } +void juce_deleteKeyProxyWindow (::Window keyProxy); void juce_deleteKeyProxyWindow (::Window keyProxy) { XWindowSystem::getInstance()->deleteKeyProxy (keyProxy); @@ -3459,8 +3484,8 @@ ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withFlags (buttonModifierFlag); peer->toFront (true); peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, getLogicalMousePos (buttonPressEvent, peer->getPlatformScaleFactor()), - ModifierKeys::currentModifiers, MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, getEventTime (buttonPressEvent), {}); + ModifierKeys::currentModifiers, MouseInputSource::defaultPressure, + MouseInputSource::defaultOrientation, getEventTime (buttonPressEvent), {}); } void XWindowSystem::handleButtonPressEvent (LinuxComponentPeer* peer, const XButtonPressedEvent& buttonPressEvent) const @@ -3509,7 +3534,7 @@ dragState.handleExternalDragButtonReleaseEvent(); peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, getLogicalMousePos (buttonRelEvent, peer->getPlatformScaleFactor()), - ModifierKeys::currentModifiers, MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, getEventTime (buttonRelEvent)); + ModifierKeys::currentModifiers, MouseInputSource::defaultPressure, MouseInputSource::defaultOrientation, getEventTime (buttonRelEvent)); } void XWindowSystem::handleMotionNotifyEvent (LinuxComponentPeer* peer, const XPointerMovedEvent& movedEvent) const @@ -3522,8 +3547,8 @@ dragState.handleExternalDragMotionNotify(); peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, getLogicalMousePos (movedEvent, peer->getPlatformScaleFactor()), - ModifierKeys::currentModifiers, MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, getEventTime (movedEvent)); + ModifierKeys::currentModifiers, MouseInputSource::defaultPressure, + MouseInputSource::defaultOrientation, getEventTime (movedEvent)); } void XWindowSystem::handleEnterNotifyEvent (LinuxComponentPeer* peer, const XEnterWindowEvent& enterEvent) const @@ -3535,8 +3560,8 @@ { updateKeyModifiers ((int) enterEvent.state); peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, getLogicalMousePos (enterEvent, peer->getPlatformScaleFactor()), - ModifierKeys::currentModifiers, MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, getEventTime (enterEvent)); + ModifierKeys::currentModifiers, MouseInputSource::defaultPressure, + MouseInputSource::defaultOrientation, getEventTime (enterEvent)); } } @@ -3550,8 +3575,8 @@ { updateKeyModifiers ((int) leaveEvent.state); peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, getLogicalMousePos (leaveEvent, peer->getPlatformScaleFactor()), - ModifierKeys::currentModifiers, MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, getEventTime (leaveEvent)); + ModifierKeys::currentModifiers, MouseInputSource::defaultPressure, + MouseInputSource::defaultOrientation, getEventTime (leaveEvent)); } } diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h juce-7.0.0~ds0/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h --- juce-6.1.5~ds0/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -181,8 +181,8 @@ void setBounds (::Window, Rectangle, bool fullScreen) const; void updateConstraints (::Window) const; - BorderSize getBorderSize (::Window) const; - Rectangle getWindowBounds (::Window, ::Window parentWindow); + ComponentPeer::OptionalBorderSize getBorderSize (::Window) const; + Rectangle getWindowBounds (::Window, ::Window parentWindow); Point getPhysicalParentScreenPosition() const; bool contains (::Window, Point localPos) const; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_MarkerList.cpp juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_MarkerList.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_MarkerList.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_MarkerList.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_MarkerList.h juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_MarkerList.h --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_MarkerList.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_MarkerList.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativePoint.h juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativePoint.h --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativePoint.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativePoint.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativePointPath.h juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativePointPath.h --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativePointPath.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativePointPath.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h --- juce-6.1.5~ds0/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_PropertyComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_PropertyComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_PropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_PropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_PropertyPanel.h juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_PropertyPanel.h --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_PropertyPanel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_PropertyPanel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ComboBox.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ComboBox.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ComboBox.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ComboBox.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ComboBox.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ComboBox.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ComboBox.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ComboBox.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ImageComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ImageComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ImageComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ImageComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_Label.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_Label.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_Label.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_Label.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -208,9 +208,6 @@ void Label::editorAboutToBeHidden (TextEditor* textEditor) { - if (auto* peer = getPeer()) - peer->dismissPendingTextInput(); - Component::BailOutChecker checker (this); listeners.callChecked (checker, [this, textEditor] (Label::Listener& l) { l.editorHidden (this, *textEditor); }); diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_Label.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_Label.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_Label.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_Label.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ListBox.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ListBox.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ListBox.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ListBox.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -51,6 +51,19 @@ .addAction (AccessibilityActionType::toggle, std::move (onToggle)); } +void ListBox::checkModelPtrIsValid() const +{ + #if ! JUCE_DISABLE_ASSERTIONS + // If this is hit, the model was destroyed while the ListBox was still using it. + // You should ensure that the model remains alive for as long as the ListBox holds a pointer to it. + // If this assertion is hit in the destructor of a ListBox instance, do one of the following: + // - Adjust the order in which your destructors run, so that the ListBox destructor runs + // before the destructor of your ListBoxModel, or + // - Call ListBox::setModel (nullptr) before destroying your ListBoxModel. + jassert ((model == nullptr) == (weakModelPtr.lock() == nullptr)); + #endif +} + class ListBox::RowComponent : public Component, public TooltipClient { @@ -107,14 +120,6 @@ m->listBoxItemClicked (row, e); } - bool isInDragToScrollViewport() const noexcept - { - if (auto* vp = owner.getViewport()) - return vp->isScrollOnDragEnabled() && (vp->canScrollVertically() || vp->canScrollHorizontally()); - - return false; - } - void mouseDown (const MouseEvent& e) override { isDragging = false; @@ -123,7 +128,7 @@ if (isEnabled()) { - if (owner.selectOnMouseDown && ! (isSelected || isInDragToScrollViewport())) + if (owner.selectOnMouseDown && ! isSelected && ! viewportWouldScrollOnEvent (owner.getViewport(), e.source)) performSelection (e, false); else selectRowOnMouseUp = true; @@ -521,7 +526,7 @@ //============================================================================== ListBox::ListBox (const String& name, ListBoxModel* const m) - : Component (name), model (m) + : Component (name) { viewport.reset (new ListViewport (*this)); addAndMakeVisible (viewport.get()); @@ -529,6 +534,8 @@ setWantsKeyboardFocus (true); setFocusContainerType (FocusContainerType::focusContainer); colourChanged(); + + setModel (m); } ListBox::~ListBox() @@ -537,11 +544,20 @@ viewport.reset(); } +void ListBox::assignModelPtr (ListBoxModel* const newModel) +{ + model = newModel; + + #if ! JUCE_DISABLE_ASSERTIONS + weakModelPtr = model != nullptr ? model->sharedState : nullptr; + #endif +} + void ListBox::setModel (ListBoxModel* const newModel) { if (model != newModel) { - model = newModel; + assignModelPtr (newModel); repaint(); updateContent(); } @@ -605,6 +621,7 @@ //============================================================================== void ListBox::updateContent() { + checkModelPtrIsValid(); hasDoneInitialUpdate = true; totalItems = (model != nullptr) ? model->getNumRows() : 0; @@ -641,6 +658,8 @@ bool deselectOthersFirst, bool isMouseClick) { + checkModelPtrIsValid(); + if (! multipleSelection) deselectOthersFirst = true; @@ -676,6 +695,8 @@ void ListBox::deselectRow (const int row) { + checkModelPtrIsValid(); + if (selected.contains (row)) { selected.removeRange ({ row, row + 1 }); @@ -694,6 +715,8 @@ void ListBox::setSelectedRows (const SparseSet& setOfRowsToBeSelected, const NotificationType sendNotificationEventToModel) { + checkModelPtrIsValid(); + selected = setOfRowsToBeSelected; selected.removeRange ({ totalItems, std::numeric_limits::max() }); @@ -741,6 +764,8 @@ void ListBox::deselectAllRows() { + checkModelPtrIsValid(); + if (! selected.isEmpty()) { selected.clear(); @@ -870,6 +895,8 @@ //============================================================================== bool ListBox::keyPressed (const KeyPress& key) { + checkModelPtrIsValid(); + const int numVisibleRows = viewport->getHeight() / getRowHeight(); const bool multiple = multipleSelection @@ -975,6 +1002,8 @@ void ListBox::mouseUp (const MouseEvent& e) { + checkModelPtrIsValid(); + if (e.mouseWasClicked() && model != nullptr) model->backgroundClicked (e); } @@ -1124,6 +1153,8 @@ int getNumRows() const override { + listBox.checkModelPtrIsValid(); + if (listBox.model == nullptr) return 0; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ListBox.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ListBox.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ListBox.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ListBox.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -163,8 +163,14 @@ /** You can override this to return a custom mouse cursor for each row. */ virtual MouseCursor getMouseCursorForRow (int row); -}; +private: + #if ! JUCE_DISABLE_ASSERTIONS + friend class ListBox; + struct Empty {}; + std::shared_ptr sharedState = std::make_shared(); + #endif +}; //============================================================================== /** @@ -187,6 +193,11 @@ The model pointer passed-in can be null, in which case you can set it later with setModel(). + + The ListBoxModel instance must stay alive for as long as the ListBox + holds a pointer to it. Be careful to destroy the ListBox before the + ListBoxModel, or to call ListBox::setModel (nullptr) before destroying + the ListBoxModel. */ ListBox (const String& componentName = String(), ListBoxModel* model = nullptr); @@ -194,14 +205,25 @@ /** Destructor. */ ~ListBox() override; - //============================================================================== - /** Changes the current data model to display. */ + /** Changes the current data model to display. + + The ListBoxModel instance must stay alive for as long as the ListBox + holds a pointer to it. Be careful to destroy the ListBox before the + ListBoxModel, or to call ListBox::setModel (nullptr) before destroying + the ListBoxModel. + */ void setModel (ListBoxModel* newModel); /** Returns the current list model. */ - ListBoxModel* getModel() const noexcept { return model; } + ListBoxModel* getModel() const noexcept + { + #if ! JUCE_DISABLE_ASSERTIONS + checkModelPtrIsValid(); + #endif + return model; + } //============================================================================== /** Causes the list to refresh its content. @@ -584,7 +606,7 @@ JUCE_PUBLIC_IN_DLL_BUILD (class RowComponent) friend class ListViewport; friend class TableListBox; - ListBoxModel* model; + ListBoxModel* model = nullptr; std::unique_ptr viewport; std::unique_ptr headerComponent; std::unique_ptr mouseMoveSelector; @@ -594,6 +616,12 @@ int lastRowSelected = -1; bool multipleSelection = false, alwaysFlipSelection = false, hasDoneInitialUpdate = false, selectOnMouseDown = true; + #if ! JUCE_DISABLE_ASSERTIONS + std::weak_ptr weakModelPtr; + #endif + + void assignModelPtr (ListBoxModel*); + void checkModelPtrIsValid() const; std::unique_ptr createAccessibilityHandler() override; bool hasAccessibleHeaderComponent() const; void selectRowInternal (int rowNumber, bool dontScrollToShowThisRow, diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ProgressBar.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ProgressBar.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ProgressBar.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ProgressBar.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_Slider.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_Slider.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_Slider.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_Slider.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,14 @@ namespace juce { +static double getStepSize (const Slider& slider) +{ + const auto interval = slider.getInterval(); + + return interval != 0.0 ? interval + : slider.getRange().getLength() * 0.01; +} + class Slider::Pimpl : public AsyncUpdater, // this needs to be public otherwise it will cause an // error when JUCE_DLL_BUILD=1 private Value::Listener @@ -991,6 +999,38 @@ popupDisplay.reset(); } + bool keyPressed (const KeyPress& key) + { + if (key.getModifiers().isAnyModifierKeyDown()) + return false; + + const auto getInterval = [this] + { + if (auto* accessibility = owner.getAccessibilityHandler()) + if (auto* valueInterface = accessibility->getValueInterface()) + return valueInterface->getRange().getInterval(); + + return getStepSize (owner); + }; + + const auto valueChange = [&] + { + if (key == KeyPress::rightKey || key == KeyPress::upKey) + return getInterval(); + + if (key == KeyPress::leftKey || key == KeyPress::downKey) + return -getInterval(); + + return 0.0; + }(); + + if (valueChange == 0.0) + return false; + + setValue (getValue() + valueChange, sendNotificationSync); + return true; + } + void showPopupDisplay() { if (style == IncDecButtons) @@ -1661,6 +1701,9 @@ // it is shown when dragging the mouse over a slider and releasing void Slider::mouseEnter (const MouseEvent&) { pimpl->mouseMove(); } +/** @internal */ +bool Slider::keyPressed (const KeyPress& k) { return pimpl->keyPressed (k); } + void Slider::modifierKeysChanged (const ModifierKeys& modifiers) { if (isEnabled()) @@ -1734,18 +1777,10 @@ AccessibleValueRange getRange() const override { return { { slider.getMinimum(), slider.getMaximum() }, - getStepSize() }; + getStepSize (slider) }; } private: - double getStepSize() const - { - auto interval = slider.getInterval(); - - return interval != 0.0 ? interval - : slider.getRange().getLength() * 0.01; - } - Slider& slider; const bool useMaxValue; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_Slider.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_Slider.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_Slider.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_Slider.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -991,6 +991,8 @@ void mouseExit (const MouseEvent&) override; /** @internal */ void mouseEnter (const MouseEvent&) override; + /** @internal */ + bool keyPressed (const KeyPress&) override; //============================================================================== #ifndef DOXYGEN diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -38,7 +38,7 @@ void paint (Graphics& g) override { - g.drawImageAt (image, 0, 0); + g.drawImage (image, getLocalBounds().toFloat()); } Image image; @@ -694,7 +694,7 @@ auto temp = columnIdBeingDragged; columnIdBeingDragged = 0; - dragOverlayComp.reset (new DragOverlayComp (createComponentSnapshot (columnRect, false))); + dragOverlayComp.reset (new DragOverlayComp (createComponentSnapshot (columnRect, false, 2.0f))); addAndMakeVisible (dragOverlayComp.get()); columnIdBeingDragged = temp; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TableListBox.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TableListBox.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TableListBox.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TableListBox.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -346,7 +346,7 @@ TableListBox::TableListBox (const String& name, TableListBoxModel* const m) : ListBox (name, nullptr), model (m) { - ListBox::model = this; + ListBox::assignModelPtr (this); setHeader (std::make_unique

(*this)); } diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TableListBox.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TableListBox.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TableListBox.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TableListBox.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TextEditor.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TextEditor.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TextEditor.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TextEditor.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -868,6 +868,12 @@ TextEditor& owner; +private: + std::unique_ptr createAccessibilityHandler() override + { + return createIgnoredAccessibilityHandler (*this); + } + JUCE_DECLARE_NON_COPYABLE (TextHolderComponent) }; @@ -894,6 +900,11 @@ } private: + std::unique_ptr createAccessibilityHandler() override + { + return createIgnoredAccessibilityHandler (*this); + } + TextEditor& owner; int lastWordWrapWidth = 0; bool reentrant = false; @@ -933,13 +944,13 @@ setWantsKeyboardFocus (true); recreateCaret(); + + juce::Desktop::getInstance().addGlobalMouseListener (this); } TextEditor::~TextEditor() { - if (wasFocused) - if (auto* peer = getPeer()) - peer->dismissPendingTextInput(); + juce::Desktop::getInstance().removeGlobalMouseListener (this); textValue.removeListener (textHolder); textValue.referTo (Value()); @@ -1017,9 +1028,17 @@ readOnly = shouldBeReadOnly; enablementChanged(); invalidateAccessibilityHandler(); + + if (auto* peer = getPeer()) + peer->refreshTextInputTarget(); } } +void TextEditor::setClicksOutsideDismissVirtualKeyboard (bool newValue) +{ + clicksOutsideDismissVirtualKeyboard = newValue; +} + bool TextEditor::isReadOnly() const noexcept { return readOnly || ! isEnabled(); @@ -1027,7 +1046,7 @@ bool TextEditor::isTextInputActive() const { - return ! isReadOnly(); + return ! isReadOnly() && (! clicksOutsideDismissVirtualKeyboard || mouseDownInEditor); } void TextEditor::setReturnKeyStartsNewLine (bool shouldStartNewLine) @@ -1322,13 +1341,7 @@ void TextEditor::checkFocus() { if (! wasFocused && hasKeyboardFocus (false) && ! isCurrentlyBlockedByAnotherModalComponent()) - { wasFocused = true; - - if (auto* peer = getPeer()) - if (! isReadOnly()) - peer->textInputRequired (peer->globalToLocal (getScreenPosition()), *this); - } } void TextEditor::repaintText (Range range) @@ -1827,6 +1840,11 @@ //============================================================================== void TextEditor::mouseDown (const MouseEvent& e) { + mouseDownInEditor = e.originalComponent == this; + + if (! mouseDownInEditor) + return; + beginDragAutoRepeat (100); newTransaction(); @@ -1838,7 +1856,7 @@ e.mods.isShiftDown()); if (auto* peer = getPeer()) - peer->dismissPendingTextInput(); + peer->closeInputMethodContext(); } else { @@ -1865,6 +1883,9 @@ void TextEditor::mouseDrag (const MouseEvent& e) { + if (! mouseDownInEditor) + return; + if (wasFocused || ! selectAllTextWhenFocused) if (! (popupMenuEnabled && e.mods.isPopupMenu())) moveCaretTo (getTextIndexAt (e.x, e.y), true); @@ -1872,6 +1893,9 @@ void TextEditor::mouseUp (const MouseEvent& e) { + if (! mouseDownInEditor) + return; + newTransaction(); textHolder->restartTimer(); @@ -1884,6 +1908,9 @@ void TextEditor::mouseDoubleClick (const MouseEvent& e) { + if (! mouseDownInEditor) + return; + int tokenEnd = getTextIndexAt (e.x, e.y); int tokenStart = 0; @@ -1950,6 +1977,9 @@ void TextEditor::mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& wheel) { + if (! mouseDownInEditor) + return; + if (! viewport->useMouseWheelMoveIfNeeded (e, wheel)) Component::mouseWheelMove (e, wheel); } @@ -1961,7 +1991,7 @@ moveCaretTo (newPos, selecting); if (auto* peer = getPeer()) - peer->dismissPendingTextInput(); + peer->closeInputMethodContext(); return true; } @@ -2214,9 +2244,6 @@ underlinedSections.clear(); - if (auto* peer = getPeer()) - peer->dismissPendingTextInput(); - updateCaretPosition(); postCommandMessage (TextEditorDefs::focusLossMessageId); @@ -2668,10 +2695,10 @@ } //============================================================================== -class TextEditorAccessibilityHandler : public AccessibilityHandler +class TextEditor::EditorAccessibilityHandler : public AccessibilityHandler { public: - explicit TextEditorAccessibilityHandler (TextEditor& textEditorToWrap) + explicit EditorAccessibilityHandler (TextEditor& textEditorToWrap) : AccessibilityHandler (textEditorToWrap, textEditorToWrap.isReadOnly() ? AccessibilityRole::staticText : AccessibilityRole::editableText, {}, @@ -2699,10 +2726,20 @@ void setSelection (Range r) override { + if (r == textEditor.getHighlightedRegion()) + return; + if (r.isEmpty()) + { textEditor.setCaretPosition (r.getStart()); + } else - textEditor.setHighlightedRegion (r); + { + const auto cursorAtStart = r.getEnd() == textEditor.getHighlightedRegion().getStart() + || r.getEnd() == textEditor.getHighlightedRegion().getEnd(); + textEditor.moveCaretTo (cursorAtStart ? r.getEnd() : r.getStart(), false); + textEditor.moveCaretTo (cursorAtStart ? r.getStart() : r.getEnd(), true); + } } String getText (Range r) const override @@ -2748,12 +2785,12 @@ TextEditor& textEditor; //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TextEditorAccessibilityHandler) + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EditorAccessibilityHandler) }; std::unique_ptr TextEditor::createAccessibilityHandler() { - return std::make_unique (*this); + return std::make_unique (*this); } } // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TextEditor.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TextEditor.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TextEditor.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TextEditor.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -665,8 +665,24 @@ void setInputRestrictions (int maxTextLength, const String& allowedCharacters = String()); + /** Sets the type of virtual keyboard that should be displayed when this editor has + focus. + */ void setKeyboardType (VirtualKeyboardType type) noexcept { keyboardType = type; } + /** Sets the behaviour of mouse/touch interactions outside this component. + + If true, then presses outside of the TextEditor will dismiss the virtual keyboard. + If false, then the virtual keyboard will remain onscreen for as long as the TextEditor has + keyboard focus. + */ + void setClicksOutsideDismissVirtualKeyboard (bool); + + /** Returns true if the editor is configured to hide the virtual keyboard when the mouse is + pressed on another component. + */ + bool getClicksOutsideDismissVirtualKeyboard() const { return clicksOutsideDismissVirtualKeyboard; } + //============================================================================== /** This abstract base class is implemented by LookAndFeel classes to provide TextEditor drawing functionality. @@ -744,6 +760,7 @@ struct TextEditorViewport; struct InsertAction; struct RemoveAction; + class EditorAccessibilityHandler; std::unique_ptr viewport; TextHolderComponent* textHolder; @@ -765,6 +782,8 @@ bool valueTextNeedsUpdating = false; bool consumeEscAndReturnKeys = true; bool underlineWhitespace = true; + bool mouseDownInEditor = false; + bool clicksOutsideDismissVirtualKeyboard = false; UndoManager undoManager; std::unique_ptr caret; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_Toolbar.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_Toolbar.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_Toolbar.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_Toolbar.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -243,10 +243,7 @@ Toolbar::Toolbar() { lookAndFeelChanged(); - addChildComponent (missingItemsButton.get()); - - missingItemsButton->setAlwaysOnTop (true); - missingItemsButton->onClick = [this] { showMissingItems(); }; + initMissingItemButton(); } Toolbar::~Toolbar() @@ -534,6 +531,16 @@ } //============================================================================== +void Toolbar::initMissingItemButton() +{ + if (missingItemsButton == nullptr) + return; + + addChildComponent (*missingItemsButton); + missingItemsButton->setAlwaysOnTop (true); + missingItemsButton->onClick = [this] { showMissingItems(); }; +} + void Toolbar::showMissingItems() { jassert (missingItemsButton->isShowing()); @@ -542,7 +549,7 @@ { PopupMenu m; auto comp = std::make_unique (*this, getThickness()); - m.addCustomItem (1, std::move (comp)); + m.addCustomItem (1, std::move (comp), nullptr, TRANS ("Additional Items")); m.showMenuAsync (PopupMenu::Options().withTargetComponent (missingItemsButton.get())); } } @@ -643,6 +650,7 @@ void Toolbar::lookAndFeelChanged() { missingItemsButton.reset (getLookAndFeel().createToolbarMissingItemsButton (*this)); + initMissingItemButton(); } void Toolbar::mouseDown (const MouseEvent&) {} diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_Toolbar.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_Toolbar.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_Toolbar.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_Toolbar.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -323,6 +323,7 @@ class CustomisationDialog; std::unique_ptr createAccessibilityHandler() override; + void initMissingItemButton(); void showMissingItems(); void addItemInternal (ToolbarItemFactory& factory, int itemId, int insertIndex); diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -247,7 +247,7 @@ && itemId != ToolbarItemFactory::flexibleSpacerId); if (! shouldItemBeAccessible) - return nullptr; + return createIgnoredAccessibilityHandler (*this); return std::make_unique (*this, AccessibilityRole::button); } diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TreeView.cpp juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TreeView.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TreeView.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TreeView.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -40,7 +40,8 @@ } //============================================================================== -class TreeView::ItemComponent : public Component +class TreeView::ItemComponent : public Component, + public TooltipClient { public: explicit ItemComponent (TreeViewItem& itemToRepresent) @@ -78,6 +79,11 @@ return item; } + String getTooltip() override + { + return item.getTooltip(); + } + private: //============================================================================== class ItemAccessibilityHandler : public AccessibilityHandler @@ -216,8 +222,8 @@ auto topLeft = itemComp.getRepresentedItem().getItemPosition (false).toFloat().getTopLeft(); return { Desktop::getInstance().getMainMouseSource(), topLeft, mods, - MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, + MouseInputSource::defaultPressure, MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation, + MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY, &itemComp, &itemComp, Time::getCurrentTime(), topLeft, Time::getCurrentTime(), 0, false }; } @@ -338,7 +344,7 @@ auto newComp = std::make_unique (*treeItem); addAndMakeVisible (*newComp); - newComp->addMouseListener (this, false); + newComp->addMouseListener (this, treeItem->customComponentUsesTreeViewMouseHandler()); componentsToKeep.insert (newComp.get()); itemComponents.push_back (std::move (newComp)); diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TreeView.h juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TreeView.h --- juce-6.1.5~ds0/modules/juce_gui_basics/widgets/juce_TreeView.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/widgets/juce_TreeView.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -363,6 +363,13 @@ /** Draws the line that extends vertically up towards one of its parents, or down to one of its children. */ virtual void paintVerticalConnectingLine (Graphics&, const Line& line); + /** This should return true if you want to use a custom component, and also use + the TreeView's built-in mouse handling support, enabling drag-and-drop, + itemClicked() and itemDoubleClicked(); return false if the component should + consume all mouse clicks. + */ + virtual bool customComponentUsesTreeViewMouseHandler() const { return false; } + /** Called when the user clicks on this item. If you're using createItemComponent() to create a custom component for the diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_AlertWindow.cpp juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_AlertWindow.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_AlertWindow.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_AlertWindow.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_AlertWindow.h juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_AlertWindow.h --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_AlertWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_AlertWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_CallOutBox.cpp juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_CallOutBox.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_CallOutBox.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_CallOutBox.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_CallOutBox.h juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_CallOutBox.h --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_CallOutBox.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_CallOutBox.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -34,12 +34,15 @@ styleFlags (flags), uniqueID (lastUniquePeerID += 2) // increment by 2 so that this can never hit 0 { - Desktop::getInstance().peers.add (this); + auto& desktop = Desktop::getInstance(); + desktop.peers.add (this); + desktop.addFocusChangeListener (this); } ComponentPeer::~ComponentPeer() { auto& desktop = Desktop::getInstance(); + desktop.removeFocusChangeListener (this); desktop.peers.removeFirstMatchingValue (this); desktop.triggerFocusCallback(); } @@ -262,6 +265,19 @@ target->internalModifierKeysChanged(); } +void ComponentPeer::refreshTextInputTarget() +{ + const auto* lastTarget = std::exchange (textInputTarget, findCurrentTextInputTarget()); + + if (lastTarget == textInputTarget) + return; + + if (textInputTarget == nullptr) + dismissPendingTextInput(); + else if (auto* c = Component::getCurrentlyFocusedComponent()) + textInputRequired (globalToLocal (c->getScreenPosition()), *textInputTarget); +} + TextInputTarget* ComponentPeer::findCurrentTextInputTarget() { auto* c = Component::getCurrentlyFocusedComponent(); @@ -274,7 +290,12 @@ return nullptr; } -void ComponentPeer::dismissPendingTextInput() {} +void ComponentPeer::closeInputMethodContext() {} + +void ComponentPeer::dismissPendingTextInput() +{ + closeInputMethodContext(); +} //============================================================================== void ComponentPeer::handleBroughtToFront() @@ -586,4 +607,9 @@ Desktop::getInstance().displays->refresh(); } +void ComponentPeer::globalFocusChanged (Component*) +{ + refreshTextInputTarget(); +} + } // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_ComponentPeer.h juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_ComponentPeer.h --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_ComponentPeer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_ComponentPeer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -40,42 +40,92 @@ @tags{GUI} */ -class JUCE_API ComponentPeer +class JUCE_API ComponentPeer : private FocusChangeListener { public: //============================================================================== /** A combination of these flags is passed to the ComponentPeer constructor. */ enum StyleFlags { - windowAppearsOnTaskbar = (1 << 0), /**< Indicates that the window should have a corresponding - entry on the taskbar (ignored on MacOSX) */ - windowIsTemporary = (1 << 1), /**< Indicates that the window is a temporary popup, like a menu, - tooltip, etc. */ - windowIgnoresMouseClicks = (1 << 2), /**< Indicates that the window should let mouse clicks pass - through it (may not be possible on some platforms). */ - windowHasTitleBar = (1 << 3), /**< Indicates that the window should have a normal OS-specific - title bar and frame. if not specified, the window will be - borderless. */ - windowIsResizable = (1 << 4), /**< Indicates that the window should have a resizable border. */ - windowHasMinimiseButton = (1 << 5), /**< Indicates that if the window has a title bar, it should have a - minimise button on it. */ - windowHasMaximiseButton = (1 << 6), /**< Indicates that if the window has a title bar, it should have a - maximise button on it. */ - windowHasCloseButton = (1 << 7), /**< Indicates that if the window has a title bar, it should have a - close button on it. */ - windowHasDropShadow = (1 << 8), /**< Indicates that the window should have a drop-shadow (this may - not be possible on all platforms). */ - windowRepaintedExplictly = (1 << 9), /**< Not intended for public use - this tells a window not to - do its own repainting, but only to repaint when the - performAnyPendingRepaintsNow() method is called. */ - windowIgnoresKeyPresses = (1 << 10), /**< Tells the window not to catch any keypresses. This can - be used for things like plugin windows, to stop them interfering - with the host's shortcut keys. This will prevent the window from - gaining keyboard focus. */ - windowIsSemiTransparent = (1 << 30) /**< Not intended for public use - makes a window transparent. */ + windowAppearsOnTaskbar = (1 << 0), /**< Indicates that the window should have a corresponding + entry on the taskbar (ignored on MacOSX) */ + windowIsTemporary = (1 << 1), /**< Indicates that the window is a temporary popup, like a menu, + tooltip, etc. */ + windowIgnoresMouseClicks = (1 << 2), /**< Indicates that the window should let mouse clicks pass + through it (may not be possible on some platforms). */ + windowHasTitleBar = (1 << 3), /**< Indicates that the window should have a normal OS-specific + title bar and frame. if not specified, the window will be + borderless. */ + windowIsResizable = (1 << 4), /**< Indicates that the window should have a resizable border. */ + windowHasMinimiseButton = (1 << 5), /**< Indicates that if the window has a title bar, it should have a + minimise button on it. */ + windowHasMaximiseButton = (1 << 6), /**< Indicates that if the window has a title bar, it should have a + maximise button on it. */ + windowHasCloseButton = (1 << 7), /**< Indicates that if the window has a title bar, it should have a + close button on it. */ + windowHasDropShadow = (1 << 8), /**< Indicates that the window should have a drop-shadow (this may + not be possible on all platforms). */ + windowRepaintedExplictly = (1 << 9), /**< Not intended for public use - this tells a window not to + do its own repainting, but only to repaint when the + performAnyPendingRepaintsNow() method is called. */ + windowIgnoresKeyPresses = (1 << 10), /**< Tells the window not to catch any keypresses. This can + be used for things like plugin windows, to stop them interfering + with the host's shortcut keys. */ + windowRequiresSynchronousCoreGraphicsRendering = (1 << 11), /**< Indicates that the window should not be rendered with + asynchronous Core Graphics drawing operations. Use this if there + are issues with regions not being redrawn at the expected time + (macOS and iOS only). */ + windowIsSemiTransparent = (1 << 30) /**< Not intended for public use - makes a window transparent. */ }; + /** Represents the window borders around a window component. + + You must use operator bool() to evaluate the validity of the object before accessing + its value. + + Returned by getFrameSizeIfPresent(). A missing value may be returned on Linux for a + short time after window creation. + */ + class JUCE_API OptionalBorderSize final + { + public: + /** Default constructor. Creates an invalid object. */ + OptionalBorderSize() : valid (false) {} + + /** Constructor. Creates a valid object containing the provided BorderSize. */ + explicit OptionalBorderSize (BorderSize size) : valid (true), borderSize (std::move (size)) {} + + /** Returns true if a valid value has been provided. */ + explicit operator bool() const noexcept { return valid; } + + /** Returns a reference to the value. + + You must not call this function on an invalid object. Use operator bool() to + determine validity. + */ + const auto& operator*() const noexcept + { + jassert (valid); + return borderSize; + } + + /** Returns a pointer to the value. + + You must not call this function on an invalid object. Use operator bool() to + determine validity. + */ + const auto* operator->() const noexcept + { + jassert (valid); + return &borderSize; + } + + private: + bool valid; + BorderSize borderSize; + }; + //============================================================================== /** Creates a peer. @@ -85,7 +135,7 @@ ComponentPeer (Component& component, int styleFlags); /** Destructor. */ - virtual ~ComponentPeer(); + ~ComponentPeer() override; //============================================================================== /** Returns the component being represented by this peer. */ @@ -220,9 +270,24 @@ virtual bool contains (Point localPos, bool trueIfInAChildWindow) const = 0; /** Returns the size of the window frame that's around this window. + + Depending on the platform the border size may be invalid for a short transient + after creating a new window. Hence the returned value must be checked using + operator bool() and the contained value can be accessed using operator*() only + if it is present. + + Whether or not the window has a normal window frame depends on the flags + that were set when the window was created by Component::addToDesktop() + */ + virtual OptionalBorderSize getFrameSizeIfPresent() const = 0; + + /** Returns the size of the window frame that's around this window. Whether or not the window has a normal window frame depends on the flags that were set when the window was created by Component::addToDesktop() */ + #if JUCE_LINUX || JUCE_BSD + [[deprecated ("Use getFrameSizeIfPresent instead.")]] + #endif virtual BorderSize getFrameSize() const = 0; /** This is called when the window's bounds change. @@ -291,16 +356,19 @@ /** Called whenever a modifier key is pressed or released. */ void handleModifierKeysChange(); - //============================================================================== - /** Tells the window that text input may be required at the given position. - This may cause things like a virtual on-screen keyboard to appear, depending - on the OS. + /** If there's a currently active input-method context - i.e. characters are being + composed using multiple keystrokes - this should commit the current state of the + context to the text and clear the context. This should not hide the virtual keyboard. */ - virtual void textInputRequired (Point position, TextInputTarget&) = 0; + virtual void closeInputMethodContext(); - /** If there's some kind of OS input-method in progress, this should dismiss it. */ - virtual void dismissPendingTextInput(); + /** Alerts the peer that the current text input target has changed somehow. + + The peer may hide or show the virtual keyboard as a result of this call. + */ + void refreshTextInputTarget(); + //============================================================================== /** Returns the currently focused TextInputTarget, or null if none is found. */ TextInputTarget* findCurrentTextInputTarget(); @@ -462,10 +530,30 @@ //============================================================================== virtual void appStyleChanged() {} + /** Tells the window that text input may be required at the given position. + This may cause things like a virtual on-screen keyboard to appear, depending + on the OS. + + This function should not be called directly by Components - use refreshTextInputTarget + instead. + */ + virtual void textInputRequired (Point, TextInputTarget&) = 0; + + /** If there's some kind of OS input-method in progress, this should dismiss it. + + Overrides of this function should call closeInputMethodContext(). + + This function should not be called directly by Components - use refreshTextInputTarget + instead. + */ + virtual void dismissPendingTextInput(); + + void globalFocusChanged (Component*) override; Component* getTargetForKeyPress(); WeakReference lastFocusedComponent, dragAndDropTargetComponent; Component* lastDragAndDropCompUnderMouse = nullptr; + TextInputTarget* textInputTarget = nullptr; const uint32 uniqueID; bool isWindowMinimised = false; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_DialogWindow.cpp juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_DialogWindow.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_DialogWindow.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_DialogWindow.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_DialogWindow.h juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_DialogWindow.h --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_DialogWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_DialogWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_DocumentWindow.h juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_DocumentWindow.h --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_DocumentWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_DocumentWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -82,6 +82,10 @@ that it can be "allButtons" to get them all. You can change this later with the setTitleBarButtonsRequired() method, which can also specify where they are positioned. + The behaviour of native titlebars on macOS is slightly different: + the maximiseButton flag controls whether or not the window can enter + native fullscreen mode, and the zoom button can be disabled by + making the window non-resizable. @param addToDesktop if true, the window will be automatically added to the desktop; if false, you can use it as a child component @see TitleBarButtons @@ -124,6 +128,10 @@ should be shown on the title bar. This value is a bitwise combination of values from the TitleBarButtons enum. Note that it can be "allButtons" to get them all. + The behaviour of native titlebars on macOS is slightly different: + the maximiseButton flag controls whether or not the window can enter + native fullscreen mode, and the zoom button can be disabled by + making the window non-resizable. @param positionTitleBarButtonsOnLeft if true, the buttons should go at the left side of the bar; if false, they'll be placed at the right */ @@ -188,6 +196,8 @@ /** Callback that is triggered when the minimise button is pressed. + This function is only called when using a non-native titlebar. + The default implementation of this calls ResizableWindow::setMinimised(), but you can override it to do more customised behaviour. */ @@ -196,6 +206,8 @@ /** Callback that is triggered when the maximise button is pressed, or when the title-bar is double-clicked. + This function is only called when using a non-native titlebar. + The default implementation of this calls ResizableWindow::setFullScreen(), but you can override it to do more customised behaviour. */ diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_MessageBoxOptions.h juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_MessageBoxOptions.h --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_MessageBoxOptions.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_MessageBoxOptions.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -68,13 +68,13 @@ //============================================================================== /** Sets the type of icon that should be used for the dialog box. */ - MessageBoxOptions withIconType (MessageBoxIconType type) const { return with (*this, &MessageBoxOptions::iconType, type); } + JUCE_NODISCARD MessageBoxOptions withIconType (MessageBoxIconType type) const { return with (*this, &MessageBoxOptions::iconType, type); } /** Sets the title of the dialog box. */ - MessageBoxOptions withTitle (const String& boxTitle) const { return with (*this, &MessageBoxOptions::title, boxTitle); } + JUCE_NODISCARD MessageBoxOptions withTitle (const String& boxTitle) const { return with (*this, &MessageBoxOptions::title, boxTitle); } /** Sets the message that should be displayed in the dialog box. */ - MessageBoxOptions withMessage (const String& boxMessage) const { return with (*this, &MessageBoxOptions::message, boxMessage); } + JUCE_NODISCARD MessageBoxOptions withMessage (const String& boxMessage) const { return with (*this, &MessageBoxOptions::message, boxMessage); } /** If the string passed in is not empty, this will add a button to the dialog box with the specified text. @@ -82,10 +82,10 @@ Generally up to 3 buttons are supported for dialog boxes, so adding any more than this may have no effect. */ - MessageBoxOptions withButton (const String& text) const { auto copy = *this; copy.buttons.add (text); return copy; } + JUCE_NODISCARD MessageBoxOptions withButton (const String& text) const { auto copy = *this; copy.buttons.add (text); return copy; } /** The component that the dialog box should be associated with. */ - MessageBoxOptions withAssociatedComponent (Component* component) const { return with (*this, &MessageBoxOptions::associatedComponent, component); } + JUCE_NODISCARD MessageBoxOptions withAssociatedComponent (Component* component) const { return with (*this, &MessageBoxOptions::associatedComponent, component); } //============================================================================== /** Returns the icon type of the dialog box. diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_NativeMessageBox.h juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_NativeMessageBox.h --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_NativeMessageBox.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_NativeMessageBox.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -63,12 +63,12 @@ /* ========================================================================== - In accordance with the terms of the JUCE 6 End-Use License Agreement, the + In accordance with the terms of the JUCE 7 End-Use License Agreement, the JUCE Code in SECTION A cannot be removed, changed or otherwise rendered ineffective unless you have a JUCE Indie or Pro license, or are using JUCE under the GPL v3 license. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence ========================================================================== */ @@ -532,9 +532,12 @@ #if JUCE_LINUX if (auto* peer = isOnDesktop() ? getPeer() : nullptr) { - const auto frameSize = peer->getFrameSize(); - stateString << " frame " << frameSize.getTop() << ' ' << frameSize.getLeft() - << ' ' << frameSize.getBottom() << ' ' << frameSize.getRight(); + if (const auto optionalFrameSize = peer->getFrameSizeIfPresent()) + { + const auto& frameSize = *optionalFrameSize; + stateString << " frame " << frameSize.getTop() << ' ' << frameSize.getLeft() + << ' ' << frameSize.getBottom() << ' ' << frameSize.getRight(); + } } #endif @@ -566,10 +569,12 @@ if (peer != nullptr) { - peer->getFrameSize().addTo (newPos); + if (const auto frameSize = peer->getFrameSizeIfPresent()) + frameSize->addTo (newPos); } + #if JUCE_LINUX - else + if (peer == nullptr || ! peer->getFrameSizeIfPresent()) { // We need to adjust for the frame size before we create a peer, as X11 // doesn't provide this information at construction time. @@ -580,7 +585,9 @@ tokens[firstCoord + 7].getIntValue(), tokens[firstCoord + 8].getIntValue() }; - frame.addTo (newPos); + newPos.setX (newPos.getX() - frame.getLeft()); + newPos.setY (newPos.getY() - frame.getTop()); + setBounds (newPos); } } @@ -606,7 +613,9 @@ if (peer != nullptr) { - peer->getFrameSize().subtractFrom (newPos); + if (const auto frameSize = peer->getFrameSizeIfPresent()) + frameSize->subtractFrom (newPos); + peer->setNonFullScreenBounds (newPos); } diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_ResizableWindow.h juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_ResizableWindow.h --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_ResizableWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_ResizableWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -218,6 +218,9 @@ const auto tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse); const auto now = Time::getApproximateMillisecondCounter(); + lastComponentUnderMouse = newComp; + lastTipUnderMouse = newTip; + if (tipChanged || dismissalMouseEventOccurred || mouseMovedQuickly) lastCompChangeTime = now; @@ -246,9 +249,6 @@ showTip(); } } - - lastComponentUnderMouse = newComp; - lastTipUnderMouse = newTip; } } diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_TooltipWindow.h juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_TooltipWindow.h --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_TooltipWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_TooltipWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -136,7 +136,7 @@ private: //============================================================================== Point lastMousePos; - Component* lastComponentUnderMouse = nullptr; + SafePointer lastComponentUnderMouse; String tipShowing, lastTipUnderMouse, manuallyShownTip; int millisecondsBeforeTipAppears; unsigned int lastCompChangeTime = 0, lastHideTime = 0; diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -301,7 +301,7 @@ const auto scale = getDesktopScaleFactor() / Desktop::getInstance().getGlobalScaleFactor(); auto targetCentre = c->localPointToGlobal (c->getLocalBounds().getCentre()) / scale; - auto parentArea = c->getParentMonitorArea(); + auto parentArea = getLocalArea (nullptr, c->getParentMonitorArea()); if (auto* parent = getParentComponent()) { diff -Nru juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_TopLevelWindow.h juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_TopLevelWindow.h --- juce-6.1.5~ds0/modules/juce_gui_basics/windows/juce_TopLevelWindow.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_basics/windows/juce_TopLevelWindow.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CodeDocument.h juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CodeDocument.h --- juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CodeDocument.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CodeDocument.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -71,6 +71,9 @@ void setSelection (Range r) override { + if (r == codeEditorComponent.getHighlightedRegion()) + return; + if (r.isEmpty()) { codeEditorComponent.caretPos.setPosition (r.getStart()); @@ -79,8 +82,10 @@ auto& doc = codeEditorComponent.document; - codeEditorComponent.selectRegion (CodeDocument::Position (doc, r.getStart()), - CodeDocument::Position (doc, r.getEnd())); + const auto cursorAtStart = r.getEnd() == codeEditorComponent.getHighlightedRegion().getStart() + || r.getEnd() == codeEditorComponent.getHighlightedRegion().getEnd(); + codeEditorComponent.selectRegion (CodeDocument::Position (doc, cursorAtStart ? r.getEnd() : r.getStart()), + CodeDocument::Position (doc, cursorAtStart ? r.getStart() : r.getEnd())); } String getText (Range r) const override @@ -126,7 +131,7 @@ localRects.add (startPos.x, startPos.y, - endPos.x - startPos.x, + jmax (1, endPos.x - startPos.x), codeEditorComponent.getLineHeight()); } diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h --- juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h --- juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -111,7 +111,7 @@ static int parseIdentifier (Iterator& source) noexcept { int tokenLength = 0; - String::CharPointerType::CharType possibleIdentifier[100]; + String::CharPointerType::CharType possibleIdentifier[100] = {}; String::CharPointerType possible (possibleIdentifier); while (isIdentifierBody (source.peekNextChar())) diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h --- juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -78,7 +78,7 @@ static int parseIdentifier (Iterator& source) noexcept { int tokenLength = 0; - String::CharPointerType::CharType possibleIdentifier[100]; + String::CharPointerType::CharType possibleIdentifier[100] = {}; String::CharPointerType possible (possibleIdentifier); while (CppTokeniserFunctions::isIdentifierBody (source.peekNextChar())) diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h --- juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h --- juce-6.1.5~ds0/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp juce-7.0.0~ds0/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/documents/juce_FileBasedDocument.h juce-7.0.0~ds0/modules/juce_gui_extra/documents/juce_FileBasedDocument.h --- juce-6.1.5~ds0/modules/juce_gui_extra/documents/juce_FileBasedDocument.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/documents/juce_FileBasedDocument.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/embedding/juce_HWNDComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/embedding/juce_HWNDComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/embedding/juce_HWNDComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/embedding/juce_HWNDComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -71,6 +71,9 @@ /** Resizes this component to fit the HWND that it contains. */ void resizeToFit(); + /** Forces the bounds of the HWND to match the bounds of this component. */ + void updateHWNDBounds(); + /** @internal */ void paint (Graphics&) override; diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/embedding/juce_NSViewComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/embedding/juce_NSViewComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/embedding/juce_NSViewComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/embedding/juce_NSViewComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/embedding/juce_UIViewComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/embedding/juce_UIViewComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/embedding/juce_UIViewComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/embedding/juce_UIViewComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/embedding/juce_XEmbedComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/embedding/juce_XEmbedComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/embedding/juce_XEmbedComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/embedding/juce_XEmbedComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -96,6 +96,9 @@ /** Removes the client window from the host. */ void removeClient(); + /** Forces the embedded window to match the current size of this component. */ + void updateEmbeddedBounds(); + protected: //============================================================================== /** @internal */ diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/juce_gui_extra.cpp juce-7.0.0~ds0/modules/juce_gui_extra/juce_gui_extra.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/juce_gui_extra.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/juce_gui_extra.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -143,6 +143,7 @@ #if JUCE_MAC || JUCE_IOS #if JUCE_MAC + #include "native/juce_mac_NSViewFrameWatcher.h" #include "native/juce_mac_NSViewComponent.mm" #include "native/juce_mac_AppleRemote.mm" #include "native/juce_mac_SystemTrayIcon.cpp" diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/juce_gui_extra.h juce-7.0.0~ds0/modules/juce_gui_extra/juce_gui_extra.h --- juce-6.1.5~ds0/modules/juce_gui_extra/juce_gui_extra.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/juce_gui_extra.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_gui_extra vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE extended GUI classes description: Miscellaneous GUI classes for specialised tasks. website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/juce_gui_extra.mm juce-7.0.0~ds0/modules/juce_gui_extra/juce_gui_extra.mm --- juce-6.1.5~ds0/modules/juce_gui_extra/juce_gui_extra.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/juce_gui_extra.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_AppleRemote.h juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_AppleRemote.h --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_AppleRemote.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_AppleRemote.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_ColourSelector.cpp juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_ColourSelector.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_ColourSelector.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_ColourSelector.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -411,12 +411,8 @@ sliders[3]->setVisible ((flags & showAlphaChannel) != 0); - // VS2015 needs some scoping braces around this if statement to - // avoid a compiler bug. for (auto& slider : sliders) - { slider->onValueChange = [this] { changeColour(); }; - } } if ((flags & showColourspace) != 0) diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_ColourSelector.h juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_ColourSelector.h --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_ColourSelector.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_ColourSelector.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_PreferencesPanel.h juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_PreferencesPanel.h --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_PreferencesPanel.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_PreferencesPanel.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_PushNotifications.cpp juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_PushNotifications.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_PushNotifications.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_PushNotifications.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_PushNotifications.h juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_PushNotifications.h --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_PushNotifications.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_PushNotifications.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -31,10 +31,6 @@ { } -RecentlyOpenedFilesList::~RecentlyOpenedFilesList() -{ -} - //============================================================================== void RecentlyOpenedFilesList::setMaxNumberOfItems (const int newMaxNumber) { diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -46,9 +46,6 @@ */ RecentlyOpenedFilesList(); - /** Destructor. */ - ~RecentlyOpenedFilesList(); - //============================================================================== /** Sets a limit for the number of files that will be stored in the list. diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_SplashScreen.cpp juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_SplashScreen.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_SplashScreen.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_SplashScreen.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_SplashScreen.h juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_SplashScreen.h --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_SplashScreen.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_SplashScreen.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -182,7 +182,7 @@ /** Sets a custom location for the WebView2Loader.dll that is not a part of the standard system DLL search paths. */ - WebView2Preferences withDLLLocation (const File& location) const { return with (&WebView2Preferences::dllLocation, location); } + JUCE_NODISCARD WebView2Preferences withDLLLocation (const File& location) const { return with (&WebView2Preferences::dllLocation, location); } /** Sets a non-default location for storing user data for the browser instance. */ WebView2Preferences withUserDataFolder (const File& folder) const { return with (&WebView2Preferences::userDataFolder, folder); } @@ -190,19 +190,19 @@ /** If this is set, the status bar usually displayed in the lower-left of the webview will be disabled. */ - WebView2Preferences withStatusBarDisabled() const { return with (&WebView2Preferences::disableStatusBar, true); } + JUCE_NODISCARD WebView2Preferences withStatusBarDisabled() const { return with (&WebView2Preferences::disableStatusBar, true); } /** If this is set, a blank page will be displayed on error instead of the default built-in error page. */ - WebView2Preferences withBuiltInErrorPageDisabled() const { return with (&WebView2Preferences::disableBuiltInErrorPage, true); } + JUCE_NODISCARD WebView2Preferences withBuiltInErrorPageDisabled() const { return with (&WebView2Preferences::disableBuiltInErrorPage, true); } /** Sets the background colour that WebView2 renders underneath all web content. This colour must either be fully opaque or transparent. On Windows 7 this colour must be opaque. */ - WebView2Preferences withBackgroundColour (const Colour& colour) const + JUCE_NODISCARD WebView2Preferences withBackgroundColour (const Colour& colour) const { // the background colour must be either fully opaque or transparent! jassert (colour.isOpaque() || colour.isTransparent()); diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView21.java juce-7.0.0~ds0/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView21.java --- juce-6.1.5~ds0/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView21.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView21.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView.java juce-7.0.0~ds0/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView.java --- juce-6.1.5~ds0/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseInstanceIdService.java juce-7.0.0~ds0/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseInstanceIdService.java --- juce-6.1.5~ds0/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseInstanceIdService.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseInstanceIdService.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseMessagingService.java juce-7.0.0~ds0/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseMessagingService.java --- juce-6.1.5~ds0/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseMessagingService.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseMessagingService.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_android_PushNotifications.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_android_PushNotifications.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_android_PushNotifications.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_android_PushNotifications.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -257,6 +257,11 @@ return host; } + void updateEmbeddedBounds() + { + componentMovedOrResized (owner, true, true); + } + private: //============================================================================== XEmbedComponent& owner; @@ -612,7 +617,7 @@ if (auto* peer = owner.getPeer()) { auto r = peer->getComponent().getLocalArea (&owner, owner.getLocalBounds()); - return r * peer->getPlatformScaleFactor(); + return r * peer->getPlatformScaleFactor() * peer->getComponent().getDesktopScaleFactor(); } return owner.getLocalBounds(); @@ -687,6 +692,7 @@ void XEmbedComponent::broughtToFront() { pimpl->broughtToFront(); } unsigned long XEmbedComponent::getHostWindowID() { return pimpl->getHostWindowID(); } void XEmbedComponent::removeClient() { pimpl->setClient (0, true); } +void XEmbedComponent::updateEmbeddedBounds() { pimpl->updateEmbeddedBounds(); } //============================================================================== bool juce_handleXEmbedEvent (ComponentPeer* p, void* e) diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,346 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-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. - - ============================================================================== -*/ - -namespace juce -{ - -//============================================================================== -/** - Creates a floating carbon window that can be used to hold a carbon UI. - - This is a handy class that's designed to be inlined where needed, e.g. - in the audio plugin hosting code. - - @tags{GUI} -*/ -class CarbonViewWrapperComponent : public Component, - public ComponentMovementWatcher, - public Timer -{ -public: - CarbonViewWrapperComponent() - : ComponentMovementWatcher (this), - carbonWindow (nil), - keepPluginWindowWhenHidden (false), - wrapperWindow (nil), - embeddedView (0), - recursiveResize (false), - repaintChildOnCreation (true) - { - } - - ~CarbonViewWrapperComponent() - { - jassert (embeddedView == 0); // must call deleteWindow() in the subclass's destructor! - } - - virtual HIViewRef attachView (WindowRef windowRef, HIViewRef rootView) = 0; - virtual void removeView (HIViewRef embeddedView) = 0; - virtual void handleMouseDown (int, int) {} - virtual void handlePaint() {} - - virtual bool getEmbeddedViewSize (int& w, int& h) - { - if (embeddedView == 0) - return false; - - HIRect bounds; - HIViewGetBounds (embeddedView, &bounds); - w = jmax (1, roundToInt (bounds.size.width)); - h = jmax (1, roundToInt (bounds.size.height)); - return true; - } - - void createWindow() - { - if (wrapperWindow == nil) - { - Rect r; - r.left = (short) getScreenX(); - r.top = (short) getScreenY(); - r.right = (short) (r.left + getWidth()); - r.bottom = (short) (r.top + getHeight()); - - CreateNewWindow (kDocumentWindowClass, - (WindowAttributes) (kWindowStandardHandlerAttribute | kWindowCompositingAttribute - | kWindowNoShadowAttribute | kWindowNoTitleBarAttribute), - &r, &wrapperWindow); - - jassert (wrapperWindow != 0); - if (wrapperWindow == 0) - return; - - carbonWindow = [[NSWindow alloc] initWithWindowRef: wrapperWindow]; - - [getOwnerWindow() addChildWindow: carbonWindow - ordered: NSWindowAbove]; - - embeddedView = attachView (wrapperWindow, HIViewGetRoot (wrapperWindow)); - - // Check for the plugin creating its own floating window, and if there is one, - // we need to reparent it to make it visible.. - if (carbonWindow.childWindows.count > 0) - if (NSWindow* floatingChildWindow = [[carbonWindow childWindows] objectAtIndex: 0]) - [getOwnerWindow() addChildWindow: floatingChildWindow - ordered: NSWindowAbove]; - - EventTypeSpec windowEventTypes[] = - { - { kEventClassWindow, kEventWindowGetClickActivation }, - { kEventClassWindow, kEventWindowHandleDeactivate }, - { kEventClassWindow, kEventWindowBoundsChanging }, - { kEventClassMouse, kEventMouseDown }, - { kEventClassMouse, kEventMouseMoved }, - { kEventClassMouse, kEventMouseDragged }, - { kEventClassMouse, kEventMouseUp }, - { kEventClassWindow, kEventWindowDrawContent }, - { kEventClassWindow, kEventWindowShown }, - { kEventClassWindow, kEventWindowHidden } - }; - - EventHandlerUPP upp = NewEventHandlerUPP (carbonEventCallback); - InstallWindowEventHandler (wrapperWindow, upp, - sizeof (windowEventTypes) / sizeof (EventTypeSpec), - windowEventTypes, this, &eventHandlerRef); - - setOurSizeToEmbeddedViewSize(); - setEmbeddedWindowToOurSize(); - - creationTime = Time::getCurrentTime(); - } - } - - void deleteWindow() - { - removeView (embeddedView); - embeddedView = 0; - - if (wrapperWindow != nil) - { - NSWindow* ownerWindow = getOwnerWindow(); - - if ([[ownerWindow childWindows] count] > 0) - { - [ownerWindow removeChildWindow: carbonWindow]; - [carbonWindow close]; - } - - RemoveEventHandler (eventHandlerRef); - DisposeWindow (wrapperWindow); - wrapperWindow = nil; - } - } - - //============================================================================== - void setOurSizeToEmbeddedViewSize() - { - int w, h; - if (getEmbeddedViewSize (w, h)) - { - if (w != getWidth() || h != getHeight()) - { - startTimer (50); - setSize (w, h); - - if (Component* p = getParentComponent()) - p->setSize (w, h); - } - else - { - startTimer (jlimit (50, 500, getTimerInterval() + 20)); - } - } - else - { - stopTimer(); - } - } - - void setEmbeddedWindowToOurSize() - { - if (! recursiveResize) - { - recursiveResize = true; - - if (embeddedView != 0) - { - HIRect r; - r.origin.x = 0; - r.origin.y = 0; - r.size.width = (float) getWidth(); - r.size.height = (float) getHeight(); - HIViewSetFrame (embeddedView, &r); - } - - if (wrapperWindow != nil) - { - jassert (getTopLevelComponent()->getDesktopScaleFactor() == 1.0f); - Rectangle screenBounds (getScreenBounds() * Desktop::getInstance().getGlobalScaleFactor()); - - Rect wr; - wr.left = (short) screenBounds.getX(); - wr.top = (short) screenBounds.getY(); - wr.right = (short) screenBounds.getRight(); - wr.bottom = (short) screenBounds.getBottom(); - - SetWindowBounds (wrapperWindow, kWindowContentRgn, &wr); - - // This group stuff is mainly a workaround for Mackie plugins like FinalMix.. - WindowGroupRef group = GetWindowGroup (wrapperWindow); - WindowRef attachedWindow; - - if (GetIndexedWindow (group, 2, kWindowGroupContentsReturnWindows, &attachedWindow) == noErr) - { - SelectWindow (attachedWindow); - ActivateWindow (attachedWindow, TRUE); - HideWindow (wrapperWindow); - } - - ShowWindow (wrapperWindow); - } - - recursiveResize = false; - } - } - - void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) override - { - setEmbeddedWindowToOurSize(); - } - - // (overridden to intercept movements of the top-level window) - void componentMovedOrResized (Component& component, bool wasMoved, bool wasResized) override - { - ComponentMovementWatcher::componentMovedOrResized (component, wasMoved, wasResized); - - if (&component == getTopLevelComponent()) - setEmbeddedWindowToOurSize(); - } - - void componentPeerChanged() override - { - deleteWindow(); - createWindow(); - } - - void componentVisibilityChanged() override - { - if (isShowing()) - createWindow(); - else if (! keepPluginWindowWhenHidden) - deleteWindow(); - - setEmbeddedWindowToOurSize(); - } - - static void recursiveHIViewRepaint (HIViewRef view) - { - HIViewSetNeedsDisplay (view, true); - HIViewRef child = HIViewGetFirstSubview (view); - - while (child != 0) - { - recursiveHIViewRepaint (child); - child = HIViewGetNextView (child); - } - } - - void timerCallback() override - { - if (isShowing()) - { - setOurSizeToEmbeddedViewSize(); - - // To avoid strange overpainting problems when the UI is first opened, we'll - // repaint it a few times during the first second that it's on-screen.. - if (repaintChildOnCreation && (Time::getCurrentTime() - creationTime).inMilliseconds() < 1000) - recursiveHIViewRepaint (HIViewGetRoot (wrapperWindow)); - } - } - - void setRepaintsChildHIViewWhenCreated (bool b) noexcept - { - repaintChildOnCreation = b; - } - - OSStatus carbonEventHandler (EventHandlerCallRef /*nextHandlerRef*/, EventRef event) - { - switch (GetEventKind (event)) - { - case kEventWindowHandleDeactivate: - ActivateWindow (wrapperWindow, TRUE); - return noErr; - - case kEventWindowGetClickActivation: - { - getTopLevelComponent()->toFront (false); - [carbonWindow makeKeyAndOrderFront: nil]; - - ClickActivationResult howToHandleClick = kActivateAndHandleClick; - - SetEventParameter (event, kEventParamClickActivation, typeClickActivationResult, - sizeof (ClickActivationResult), &howToHandleClick); - - if (embeddedView != 0) - HIViewSetNeedsDisplay (embeddedView, true); - - return noErr; - } - } - - return eventNotHandledErr; - } - - static pascal OSStatus carbonEventCallback (EventHandlerCallRef nextHandlerRef, EventRef event, void* userData) - { - return ((CarbonViewWrapperComponent*) userData)->carbonEventHandler (nextHandlerRef, event); - } - - NSWindow* carbonWindow; - bool keepPluginWindowWhenHidden; - -protected: - WindowRef wrapperWindow; - HIViewRef embeddedView; - bool recursiveResize, repaintChildOnCreation; - Time creationTime; - - EventHandlerRef eventHandlerRef; - - NSWindow* getOwnerWindow() const { return [((NSView*) getWindowHandle()) window]; } -}; - -//============================================================================== -// Non-public utility function that hosts can use if they need to get hold of the -// internals of a carbon wrapper window.. -void* getCarbonWindow (Component* possibleCarbonComponent) -{ - if (CarbonViewWrapperComponent* cv = dynamic_cast (possibleCarbonComponent)) - return cv->carbonWindow; - - return nullptr; -} - -} // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,85 +26,6 @@ namespace juce { -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") -static const auto nsViewFrameChangedSelector = @selector (frameChanged:); -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - -struct NSViewCallbackInterface -{ - virtual ~NSViewCallbackInterface() = default; - virtual void frameChanged() = 0; -}; - -//============================================================================== -struct NSViewFrameChangeCallbackClass : public ObjCClass -{ - NSViewFrameChangeCallbackClass() - : ObjCClass ("JUCE_NSViewCallback_") - { - addIvar ("target"); - - addMethod (nsViewFrameChangedSelector, frameChanged); - - registerClass(); - } - - static void setTarget (id self, NSViewCallbackInterface* c) - { - object_setInstanceVariable (self, "target", c); - } - -private: - static void frameChanged (id self, SEL, NSNotification*) - { - if (auto* target = getIvar (self, "target")) - target->frameChanged(); - } - - JUCE_DECLARE_NON_COPYABLE (NSViewFrameChangeCallbackClass) -}; - -//============================================================================== -class NSViewFrameWatcher : private NSViewCallbackInterface -{ -public: - NSViewFrameWatcher (NSView* viewToWatch, std::function viewResizedIn) - : viewResized (std::move (viewResizedIn)), callback (makeCallbackForView (viewToWatch)) - { - } - - ~NSViewFrameWatcher() override - { - [[NSNotificationCenter defaultCenter] removeObserver: callback]; - [callback release]; - callback = nil; - } - - JUCE_DECLARE_NON_COPYABLE (NSViewFrameWatcher) - JUCE_DECLARE_NON_MOVEABLE (NSViewFrameWatcher) - -private: - id makeCallbackForView (NSView* view) - { - static NSViewFrameChangeCallbackClass cls; - auto* result = [cls.createInstance() init]; - NSViewFrameChangeCallbackClass::setTarget (result, this); - - [[NSNotificationCenter defaultCenter] addObserver: result - selector: nsViewFrameChangedSelector - name: NSViewFrameDidChangeNotification - object: view]; - - return result; - } - - void frameChanged() override { viewResized(); } - - std::function viewResized; - id callback; -}; - -//============================================================================== class NSViewAttachment : public ReferenceCountedObject, public ComponentMovementWatcher { diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h 1970-01-01 00:00:00.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h 2022-06-21 07:56:28.000000000 +0000 @@ -0,0 +1,111 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + 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 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-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. + + ============================================================================== +*/ + +#if JUCE_MAC + +namespace juce +{ + +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") +const auto nsViewFrameChangedSelector = @selector (frameChanged:); +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +struct NSViewCallbackInterface +{ + virtual ~NSViewCallbackInterface() = default; + virtual void frameChanged() = 0; +}; + +//============================================================================== +struct NSViewFrameChangeCallbackClass : public ObjCClass +{ + NSViewFrameChangeCallbackClass() + : ObjCClass ("JUCE_NSViewCallback_") + { + addIvar ("target"); + + addMethod (nsViewFrameChangedSelector, frameChanged); + + registerClass(); + } + + static void setTarget (id self, NSViewCallbackInterface* c) + { + object_setInstanceVariable (self, "target", c); + } + +private: + static void frameChanged (id self, SEL, NSNotification*) + { + if (auto* target = getIvar (self, "target")) + target->frameChanged(); + } + + JUCE_DECLARE_NON_COPYABLE (NSViewFrameChangeCallbackClass) +}; + +//============================================================================== +class NSViewFrameWatcher : private NSViewCallbackInterface +{ +public: + NSViewFrameWatcher (NSView* viewToWatch, std::function viewResizedIn) + : viewResized (std::move (viewResizedIn)), callback (makeCallbackForView (viewToWatch)) + { + } + + ~NSViewFrameWatcher() override + { + [[NSNotificationCenter defaultCenter] removeObserver: callback]; + [callback release]; + callback = nil; + } + + JUCE_DECLARE_NON_COPYABLE (NSViewFrameWatcher) + JUCE_DECLARE_NON_MOVEABLE (NSViewFrameWatcher) + +private: + id makeCallbackForView (NSView* view) + { + static NSViewFrameChangeCallbackClass cls; + auto* result = [cls.createInstance() init]; + NSViewFrameChangeCallbackClass::setTarget (result, this); + + [[NSNotificationCenter defaultCenter] addObserver: result + selector: nsViewFrameChangedSelector + name: NSViewFrameDidChangeNotification + object: view]; + + return result; + } + + void frameChanged() override { viewResized(); } + + std::function viewResized; + id callback; +}; + +} // namespace juce + +#endif diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,7 +26,7 @@ namespace juce { -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new", "-Wdeprecated-declarations") +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") extern NSMenu* createNSMenu (const PopupMenu&, const String& name, int topLevelMenuId, int topLevelIndex, bool addDelegate); @@ -87,7 +87,7 @@ }; //============================================================================== -struct ButtonBasedStatusItem : public StatusItemContainer +struct API_AVAILABLE (macos (10.10)) ButtonBasedStatusItem : public StatusItemContainer { //============================================================================== ButtonBasedStatusItem (SystemTrayIconComponent& iconComp, const Image& im) @@ -160,22 +160,22 @@ eventMods.withFlags (isLeft ? ModifierKeys::leftButtonModifier : ModifierKeys::rightButtonModifier), pressure, - MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, + MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation, + MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY, &owner, &owner, now, {}, now, 1, false }); owner.mouseUp ({ mouseSource, {}, eventMods.withoutMouseButtons(), pressure, - MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, + MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation, + MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY, &owner, &owner, now, {}, now, 1, false }); } else if (type == NSEventTypeMouseMoved) { owner.mouseMove (MouseEvent (mouseSource, {}, eventMods, pressure, - MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, + MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation, + MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY, &owner, &owner, now, {}, now, 1, false)); } } @@ -289,20 +289,20 @@ owner.mouseDown (MouseEvent (mouseSource, {}, eventMods.withFlags (isLeft ? ModifierKeys::leftButtonModifier : ModifierKeys::rightButtonModifier), - pressure, MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, + pressure, MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation, + MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY, &owner, &owner, now, {}, now, 1, false)); owner.mouseUp (MouseEvent (mouseSource, {}, eventMods.withoutMouseButtons(), pressure, - MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, + MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation, + MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY, &owner, &owner, now, {}, now, 1, false)); } else if (type == NSEventTypeMouseMoved) { owner.mouseMove (MouseEvent (mouseSource, {}, eventMods, pressure, - MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation, - MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, + MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation, + MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY, &owner, &owner, now, {}, now, 1, false)); } } @@ -384,7 +384,7 @@ //============================================================================== Pimpl (SystemTrayIconComponent& iconComp, const Image& im) { - if (std::floor (NSFoundationVersionNumber) > NSFoundationVersionNumber10_10) + if (@available (macOS 10.10, *)) statusItemHolder = std::make_unique (iconComp, im); else statusItemHolder = std::make_unique (iconComp, im); diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -32,7 +32,7 @@ static NSURL* appendParametersToFileURL (const URL& url, NSURL* fileUrl) { - if (@available (macOS 10.9, *)) + if (@available (macOS 10.10, *)) { const auto parameterNames = url.getParameterNames(); const auto parameterValues = url.getParameterValues(); @@ -263,7 +263,7 @@ JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif -struct WebViewDelegateClass : public ObjCClass +struct API_AVAILABLE (macos (10.10)) WebViewDelegateClass : public ObjCClass { WebViewDelegateClass() : ObjCClass ("JUCEWebViewDelegate_") { @@ -339,7 +339,7 @@ } #if WKWEBVIEW_OPENPANEL_SUPPORTED - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") + API_AVAILABLE (macos (10.12)) static void runOpenPanel (id, SEL, WKWebView*, WKOpenPanelParameters* parameters, WKFrameInfo*, void (^completionHandler)(NSArray*)) { @@ -402,7 +402,6 @@ delete wrapper; }); } - JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif }; @@ -507,7 +506,7 @@ JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif -class WKWebViewImpl : public WebViewBase +class API_AVAILABLE (macos (10.11)) WKWebViewImpl : public WebViewBase { public: WKWebViewImpl (WebBrowserComponent* owner) @@ -587,7 +586,7 @@ public: Pimpl (WebBrowserComponent* owner) { - if (@available (macOS 10.10, *)) + if (@available (macOS 10.11, *)) webView = std::make_unique (owner); #if JUCE_MAC else diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -224,8 +224,8 @@ { (float) (GET_X_LPARAM (lParam) + activeXRect.left - peerRect.left), (float) (GET_Y_LPARAM (lParam) + activeXRect.top - peerRect.top) }, ComponentPeer::getCurrentModifiersRealtime(), - MouseInputSource::invalidPressure, - MouseInputSource::invalidOrientation, + MouseInputSource::defaultPressure, + MouseInputSource::defaultOrientation, getMouseEventTime()); break; } @@ -485,6 +485,7 @@ return S_FALSE; } +LRESULT juce_offerEventToActiveXControl (::MSG& msg); LRESULT juce_offerEventToActiveXControl (::MSG& msg) { if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST) diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -172,4 +172,10 @@ setBounds (pimpl->getHWNDBounds()); } +void HWNDComponent::updateHWNDBounds() +{ + if (pimpl != nullptr) + pimpl->componentMovedOrResized (true, true); +} + } // namespace juce diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -115,8 +115,8 @@ const Time eventTime (getMouseEventTime()); const MouseEvent e (Desktop::getInstance().getMainMouseSource(), {}, eventMods, - MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, - MouseInputSource::invalidRotation, MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY, + MouseInputSource::defaultPressure, MouseInputSource::defaultOrientation, + MouseInputSource::defaultRotation, MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY, &owner, &owner, eventTime, {}, eventTime, 1, false); if (lParam == WM_LBUTTONDOWN || lParam == WM_RBUTTONDOWN) diff -Nru juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp --- juce-6.1.5~ds0/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -609,7 +609,7 @@ ComSmartPtr settings; webView->get_Settings (settings.resetAndGetPointerAddress()); - if (settings == nullptr) + if (settings != nullptr) { settings->put_IsStatusBarEnabled (! preferences.getIsStatusBarDisabled()); settings->put_IsBuiltInErrorPageEnabled (! preferences.getIsBuiltInErrorPageDisabled()); diff -Nru juce-6.1.5~ds0/modules/juce_opengl/geometry/juce_Draggable3DOrientation.h juce-7.0.0~ds0/modules/juce_opengl/geometry/juce_Draggable3DOrientation.h --- juce-6.1.5~ds0/modules/juce_opengl/geometry/juce_Draggable3DOrientation.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/geometry/juce_Draggable3DOrientation.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/geometry/juce_Matrix3D.h juce-7.0.0~ds0/modules/juce_opengl/geometry/juce_Matrix3D.h --- juce-6.1.5~ds0/modules/juce_opengl/geometry/juce_Matrix3D.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/geometry/juce_Matrix3D.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/geometry/juce_Quaternion.h juce-7.0.0~ds0/modules/juce_opengl/geometry/juce_Quaternion.h --- juce-6.1.5~ds0/modules/juce_opengl/geometry/juce_Quaternion.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/geometry/juce_Quaternion.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/geometry/juce_Vector3D.h juce-7.0.0~ds0/modules/juce_opengl/geometry/juce_Vector3D.h --- juce-6.1.5~ds0/modules/juce_opengl/geometry/juce_Vector3D.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/geometry/juce_Vector3D.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/juce_opengl.cpp juce-7.0.0~ds0/modules/juce_opengl/juce_opengl.cpp --- juce-6.1.5~ds0/modules/juce_opengl/juce_opengl.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/juce_opengl.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/juce_opengl.h juce-7.0.0~ds0/modules/juce_opengl/juce_opengl.h --- juce-6.1.5~ds0/modules/juce_opengl/juce_opengl.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/juce_opengl.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_opengl vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE OpenGL classes description: Classes for rendering OpenGL in a JUCE window. website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/modules/juce_opengl/juce_opengl.mm juce-7.0.0~ds0/modules/juce_opengl/juce_opengl.mm --- juce-6.1.5~ds0/modules/juce_opengl/juce_opengl.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/juce_opengl.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/native/java/app/com/rmsl/juce/JuceOpenGLView.java juce-7.0.0~ds0/modules/juce_opengl/native/java/app/com/rmsl/juce/JuceOpenGLView.java --- juce-6.1.5~ds0/modules/juce_opengl/native/java/app/com/rmsl/juce/JuceOpenGLView.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/native/java/app/com/rmsl/juce/JuceOpenGLView.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,6 +27,7 @@ import android.content.Context; import android.graphics.Canvas; +import android.graphics.Region; import android.view.SurfaceView; public class JuceOpenGLView extends SurfaceView @@ -46,6 +47,14 @@ //============================================================================== @Override + public boolean gatherTransparentRegion (Region unused) + { + // Returning true indicates that the view is opaque at this point. + // Without this, the green TalkBack borders cannot be seen on OpenGL views. + return true; + } + + @Override protected void onAttachedToWindow () { super.onAttachedToWindow (); diff -Nru juce-6.1.5~ds0/modules/juce_opengl/native/juce_OpenGL_android.h juce-7.0.0~ds0/modules/juce_opengl/native/juce_OpenGL_android.h --- juce-6.1.5~ds0/modules/juce_opengl/native/juce_OpenGL_android.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/native/juce_OpenGL_android.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -30,27 +30,77 @@ // This byte-code is generated from native/java/com/rmsl/juce/JuceOpenGLView.java with min sdk version 16 // See juce_core/native/java/README.txt on how to generate this byte-code. static const uint8 javaJuceOpenGLView[] = -{31,139,8,8,95,114,161,94,0,3,74,117,99,101,79,112,101,110,71,76,86,105,101,119,83,117,114,102,97,99,101,46,100,101,120,0,109, -84,75,107,19,81,20,62,119,230,38,169,105,76,99,218,138,86,144,32,5,55,173,83,53,98,33,173,86,90,170,196,193,34,173,81,106,93, -12,147,169,153,210,204,196,100,154,22,65,40,110,234,170,43,23,34,46,93,22,87,62,138,27,65,168,235,174,213,133,11,23,254,129, -162,136,130,223,125,196,164,208,129,239,126,231,125,206,188,78,217,91,75,142,156,191,64,151,223,190,187,182,183,251,251,212,240, -247,216,223,197,205,174,170,255,233,209,230,135,123,183,222,252,225,68,53,34,90,43,229,179,164,175,5,216,142,145,178,199,129, -93,205,63,0,6,140,224,72,129,71,153,210,159,225,152,50,137,182,193,239,13,162,143,192,14,240,25,216,3,50,240,13,1,54,48,3,204, -2,119,128,5,192,1,124,224,1,240,16,120,2,108,2,207,129,87,192,14,240,5,248,9,196,184,234,7,145,32,82,76,207,149,208,136,233, -249,187,180,252,20,189,15,105,249,5,228,164,150,95,66,238,214,242,86,135,253,181,161,234,102,100,15,83,214,50,225,233,209,61,179, -154,251,100,127,46,253,226,76,73,86,113,92,199,113,76,218,171,245,62,173,247,75,54,232,168,182,183,238,69,92,134,230,188,42,139, -251,226,210,214,205,213,124,181,28,209,57,153,57,15,105,126,144,40,141,92,38,99,251,185,154,191,229,77,203,124,67,246,56,129, -227,8,56,204,49,154,163,217,9,68,161,236,89,52,28,197,51,19,122,109,162,155,248,205,180,124,6,76,206,51,216,202,201,136,26,7, -230,140,116,17,103,157,57,67,58,231,224,232,36,162,67,124,6,92,206,198,246,221,179,33,117,166,245,182,28,31,243,3,63,186,68,172, -72,189,197,21,215,155,169,121,193,85,187,228,123,171,103,150,156,166,67,199,109,39,40,215,67,191,108,185,97,16,121,65,100,77, -10,94,139,10,29,174,251,117,167,86,241,221,134,53,233,4,77,167,81,160,129,255,174,38,42,89,179,43,245,69,199,245,68,213,2,157, -180,221,176,106,213,171,141,101,107,9,13,173,253,93,11,196,74,100,148,138,100,150,138,54,4,27,130,93,164,184,235,4,174,183,44, -25,29,40,225,170,41,40,85,246,27,53,39,114,43,83,117,103,149,120,37,108,68,148,12,156,200,111,122,115,21,191,65,217,48,184,18, -69,142,91,241,202,115,225,109,63,40,135,171,212,47,109,194,164,12,55,100,56,245,133,193,148,167,66,167,235,97,85,7,15,28,100, -213,25,41,248,208,86,107,60,18,13,79,27,61,217,68,250,226,204,48,13,83,34,125,157,166,89,58,145,30,223,152,167,60,41,30,7,111, -220,29,195,11,224,248,248,248,250,58,223,54,249,99,131,12,128,1,49,246,213,100,252,23,176,197,13,254,141,31,214,239,145,117, -112,107,111,24,29,187,195,236,216,31,173,239,94,236,144,24,181,247,72,156,218,187,132,229,148,79,236,19,150,105,255,203,70,78, -213,23,59,198,212,49,226,255,160,156,202,205,235,159,87,200,98,135,253,3,40,26,5,36,252,4,0,0,0,0}; +{ + 0x1f, 0x8b, 0x08, 0x08, 0xac, 0xdb, 0x8b, 0x62, 0x00, 0x03, 0x4a, 0x61, + 0x76, 0x61, 0x44, 0x65, 0x78, 0x42, 0x79, 0x74, 0x65, 0x43, 0x6f, 0x64, + 0x65, 0x2e, 0x64, 0x65, 0x78, 0x00, 0x6d, 0x54, 0x4f, 0x48, 0x14, 0x51, + 0x18, 0xff, 0x66, 0xe6, 0xed, 0x6e, 0xea, 0x3a, 0xae, 0xeb, 0x7f, 0xc1, + 0xd8, 0x20, 0xea, 0x64, 0x6b, 0x7f, 0xac, 0x40, 0x0b, 0x4d, 0xfb, 0xb7, + 0x0d, 0x4a, 0x69, 0x5b, 0x6c, 0x1d, 0x9a, 0x66, 0x27, 0x77, 0x44, 0x67, + 0x96, 0xd9, 0xd9, 0x55, 0x28, 0x44, 0xba, 0x78, 0xf1, 0x54, 0x41, 0xd1, + 0xd9, 0x43, 0x04, 0x45, 0x20, 0x05, 0x75, 0x48, 0xa2, 0x8b, 0xe1, 0xa1, + 0x53, 0xd8, 0x21, 0xa8, 0x43, 0x07, 0x8f, 0x9d, 0xc2, 0x93, 0xf4, 0x7b, + 0x6f, 0x9e, 0xad, 0x85, 0xc3, 0xfe, 0xe6, 0xfb, 0xfb, 0xbe, 0xef, 0xf7, + 0xde, 0xce, 0xfb, 0xf2, 0xf6, 0x6c, 0x6d, 0xcf, 0xd1, 0x5e, 0x7a, 0xbc, + 0x7e, 0xe1, 0x25, 0x7d, 0xb9, 0xba, 0x35, 0x37, 0x59, 0xff, 0xe2, 0xd1, + 0xda, 0xeb, 0x7b, 0x2b, 0x67, 0xb6, 0x8c, 0xbb, 0xef, 0x2f, 0x0e, 0x3f, + 0x89, 0x10, 0x15, 0x89, 0x68, 0x36, 0x7b, 0x2c, 0x49, 0xf2, 0xd9, 0x64, + 0x44, 0x5d, 0x14, 0xfa, 0xf7, 0x00, 0x3f, 0x81, 0x18, 0xc0, 0x14, 0x22, + 0xfc, 0xe8, 0x3a, 0x5e, 0xf5, 0x90, 0xb7, 0xa4, 0xbd, 0x8a, 0xd7, 0x2b, + 0x8d, 0x68, 0x03, 0x32, 0x0a, 0xa9, 0x03, 0x8d, 0xc0, 0x01, 0x60, 0x10, + 0xb8, 0x09, 0xcc, 0x00, 0x0f, 0x81, 0x65, 0xe0, 0x0d, 0xf0, 0x0e, 0x58, + 0x01, 0x3e, 0x02, 0xab, 0xc0, 0x1a, 0xf0, 0x19, 0x58, 0x07, 0xbe, 0xf3, + 0x5a, 0xc0, 0x6f, 0xa0, 0x01, 0x5c, 0x5a, 0x80, 0x7d, 0x40, 0x2f, 0x60, + 0x00, 0xb7, 0x81, 0x39, 0x60, 0x11, 0x78, 0xc0, 0x42, 0x0e, 0x1a, 0xe7, + 0x07, 0x60, 0x3b, 0x14, 0x95, 0x7c, 0x39, 0xf7, 0x7a, 0x29, 0xa3, 0x72, + 0x6f, 0x35, 0x52, 0xff, 0xaa, 0x12, 0xd5, 0x4a, 0xfd, 0x07, 0xf4, 0x3a, + 0xa9, 0x6f, 0x40, 0x8f, 0x4b, 0xfd, 0xd7, 0x0e, 0xff, 0x26, 0x74, 0x5d, + 0xd6, 0xe5, 0xcd, 0x78, 0x9f, 0x66, 0xd1, 0x53, 0x13, 0x75, 0x19, 0x3c, + 0x49, 0xc9, 0xa1, 0x55, 0xca, 0x76, 0xc1, 0x87, 0x89, 0x38, 0xcf, 0x6f, + 0x10, 0x32, 0xcc, 0x8b, 0xa0, 0x6a, 0x93, 0xf4, 0xb7, 0x0a, 0xa9, 0x50, + 0x9b, 0xb4, 0xdb, 0xa5, 0xdd, 0x21, 0xa4, 0x4a, 0x9d, 0xd2, 0xaf, 0xc8, + 0xba, 0xfc, 0x51, 0xa5, 0xfc, 0x24, 0x1d, 0x51, 0x44, 0xb8, 0xef, 0x29, + 0x0b, 0xf7, 0x55, 0x4c, 0x11, 0x1d, 0x11, 0x95, 0x73, 0xd0, 0x72, 0xfb, + 0x39, 0x7b, 0x4d, 0x54, 0x20, 0x5a, 0x62, 0xd5, 0xbe, 0x3c, 0xaa, 0x8b, + 0xf5, 0xaa, 0xa8, 0xfd, 0x1c, 0xaf, 0x46, 0x48, 0x2f, 0xa5, 0xd0, 0x38, + 0x8d, 0x0d, 0x20, 0x0b, 0x65, 0x0f, 0xa3, 0xe1, 0x49, 0xec, 0x9d, 0xdb, + 0xc5, 0x81, 0x38, 0xb1, 0xcb, 0xba, 0x38, 0x86, 0x90, 0xc5, 0x32, 0x0b, + 0xf9, 0x24, 0x13, 0x0d, 0x82, 0x37, 0x3f, 0x91, 0xb7, 0xdb, 0x75, 0x12, + 0xbc, 0xee, 0xae, 0x75, 0x7a, 0x6a, 0xf0, 0x45, 0xe9, 0x72, 0xaf, 0x7c, + 0xcd, 0x07, 0xb9, 0x66, 0xf7, 0xec, 0x3a, 0x64, 0x7b, 0x09, 0x0d, 0xd5, + 0x74, 0x79, 0x16, 0xd5, 0x73, 0x50, 0x85, 0xad, 0x48, 0xfb, 0x7f, 0x5d, + 0xa3, 0x68, 0xbf, 0xe3, 0x3a, 0xc1, 0x69, 0x52, 0x32, 0xd4, 0x94, 0x29, + 0x5b, 0xf6, 0x68, 0xd1, 0x76, 0xcf, 0x1b, 0x59, 0xc7, 0x9e, 0x39, 0x34, + 0x69, 0x56, 0x4c, 0xea, 0x30, 0x4c, 0x37, 0xef, 0x7b, 0x4e, 0x3e, 0x6d, + 0x79, 0x6e, 0x60, 0xbb, 0x41, 0x7a, 0x88, 0xcb, 0xd9, 0xa0, 0x6f, 0x47, + 0x68, 0xc2, 0x37, 0x8b, 0x05, 0xc7, 0x2a, 0xa5, 0x87, 0x4c, 0xb7, 0x62, + 0x96, 0x76, 0x0d, 0x5d, 0xb1, 0x27, 0x1c, 0xcf, 0xed, 0xa3, 0xce, 0xbf, + 0xa1, 0x0a, 0x9a, 0xa4, 0xc7, 0xca, 0xfe, 0x1d, 0xd3, 0xb2, 0x79, 0xc3, + 0x3e, 0xda, 0x6b, 0x58, 0xde, 0x74, 0xda, 0x9f, 0x2e, 0x4d, 0xa5, 0x27, + 0xc1, 0x25, 0xfd, 0x2f, 0xa1, 0x3e, 0x52, 0xb2, 0xa4, 0x66, 0x33, 0xa4, + 0x65, 0x33, 0x06, 0x14, 0x03, 0x8a, 0x91, 0x21, 0x25, 0x47, 0x6a, 0xce, + 0xa0, 0xa8, 0x65, 0xba, 0x96, 0x3d, 0x25, 0x24, 0x38, 0x50, 0xcc, 0x0a, + 0x79, 0x52, 0x3c, 0xef, 0x94, 0x8a, 0x66, 0x60, 0x15, 0x86, 0x7d, 0x73, + 0x86, 0xda, 0x26, 0xcc, 0xa0, 0x60, 0xfb, 0xe3, 0xbe, 0xe9, 0xc2, 0xeb, + 0x63, 0x43, 0x21, 0x31, 0x62, 0x05, 0xaf, 0x14, 0x50, 0xad, 0x6b, 0x06, + 0x4e, 0xc5, 0x1e, 0x2f, 0x38, 0x25, 0x4a, 0x7a, 0xee, 0x60, 0x10, 0x98, + 0x56, 0xc1, 0xce, 0x8f, 0x7b, 0xd7, 0x1c, 0x37, 0xef, 0xcd, 0x50, 0x8b, + 0xf0, 0x71, 0x57, 0xe8, 0x18, 0x11, 0xe9, 0xd4, 0xec, 0xb9, 0xc3, 0x76, + 0x98, 0x7a, 0xce, 0xf7, 0xa6, 0x65, 0x72, 0xe7, 0x6e, 0x5e, 0xb9, 0x22, + 0x8e, 0x18, 0xf8, 0x48, 0x8b, 0x05, 0xbc, 0x61, 0xb4, 0xec, 0x96, 0x4b, + 0x76, 0x9e, 0x0e, 0xaa, 0xc9, 0xd6, 0x98, 0x7e, 0x62, 0xb4, 0x9b, 0xba, + 0x29, 0xa6, 0x5f, 0xa2, 0x11, 0xa5, 0x31, 0xa6, 0x9f, 0x5a, 0xc8, 0xd1, + 0x71, 0xa5, 0x2b, 0xa6, 0x53, 0x3f, 0x85, 0xd6, 0x59, 0xc8, 0x85, 0x1b, + 0xfd, 0xf8, 0x27, 0x19, 0xee, 0x02, 0x9b, 0x9f, 0x67, 0x1b, 0x5a, 0xe4, + 0xbe, 0x4a, 0x2a, 0xa0, 0x00, 0x11, 0x65, 0x91, 0x29, 0xec, 0x19, 0x53, + 0x94, 0x6f, 0x90, 0xbf, 0x98, 0xca, 0x96, 0x22, 0xf2, 0xde, 0xd3, 0x8e, + 0xef, 0x84, 0xcb, 0xed, 0x99, 0xa6, 0x52, 0x75, 0xae, 0x69, 0x54, 0x9d, + 0x6d, 0x8c, 0xaa, 0xf3, 0x6d, 0xbb, 0x06, 0x9f, 0x71, 0x51, 0xaa, 0xce, + 0x39, 0x25, 0x25, 0xe7, 0x04, 0xd7, 0x13, 0xd5, 0x59, 0xa2, 0xa6, 0xc2, + 0xfa, 0x7c, 0xfe, 0x69, 0x32, 0x87, 0xdf, 0x45, 0x4a, 0x85, 0x6b, 0xc5, + 0x3d, 0x4d, 0x84, 0x3a, 0x9f, 0xaf, 0x7f, 0x00, 0x34, 0xf2, 0xd3, 0x47, + 0x98, 0x05, 0x00, 0x00 +}; //============================================================================== struct AndroidGLCallbacks diff -Nru juce-6.1.5~ds0/modules/juce_opengl/native/juce_OpenGLExtensions.h juce-7.0.0~ds0/modules/juce_opengl/native/juce_OpenGLExtensions.h --- juce-6.1.5~ds0/modules/juce_opengl/native/juce_OpenGLExtensions.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/native/juce_OpenGLExtensions.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/native/juce_OpenGL_ios.h juce-7.0.0~ds0/modules/juce_opengl/native/juce_OpenGL_ios.h --- juce-6.1.5~ds0/modules/juce_opengl/native/juce_OpenGL_ios.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/native/juce_OpenGL_ios.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/native/juce_OpenGL_linux_X11.h juce-7.0.0~ds0/modules/juce_opengl/native/juce_OpenGL_linux_X11.h --- juce-6.1.5~ds0/modules/juce_opengl/native/juce_OpenGL_linux_X11.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/native/juce_OpenGL_linux_X11.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/native/juce_OpenGL_osx.h juce-7.0.0~ds0/modules/juce_opengl/native/juce_OpenGL_osx.h --- juce-6.1.5~ds0/modules/juce_opengl/native/juce_OpenGL_osx.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/native/juce_OpenGL_osx.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -36,6 +36,7 @@ void* contextToShare, bool shouldUseMultisampling, OpenGLVersion version) + : owner (component) { NSOpenGLPixelFormatAttribute attribs[64] = { 0 }; createAttribs (attribs, version, pixFormat, shouldUseMultisampling); @@ -195,7 +196,16 @@ lastSwapTime = now; } - void updateWindowPosition (Rectangle) {} + void updateWindowPosition (Rectangle) + { + if (auto* peer = owner.getTopLevelComponent()->getPeer()) + { + const auto newArea = peer->getAreaCoveredBy (owner); + + if (convertToRectInt ([view frame]) != newArea) + [view setFrame: makeNSRect (newArea)]; + } + } bool setSwapInterval (int numFramesPerSwapIn) { @@ -244,11 +254,13 @@ return NSOpenGLCPSwapInterval; } + Component& owner; NSOpenGLContext* renderContext = nil; NSOpenGLView* view = nil; ReferenceCountedObjectPtr viewAttachment; double lastSwapTime = 0; - int minSwapTimeMs = 0, underrunCounter = 0, numFramesPerSwap = 0; + std::atomic minSwapTimeMs { 0 }; + int underrunCounter = 0, numFramesPerSwap = 0; double videoRefreshPeriodS = 1.0 / 60.0; //============================================================================== diff -Nru juce-6.1.5~ds0/modules/juce_opengl/native/juce_OpenGL_win32.h juce-7.0.0~ds0/modules/juce_opengl/native/juce_OpenGL_win32.h --- juce-6.1.5~ds0/modules/juce_opengl/native/juce_OpenGL_win32.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/native/juce_OpenGL_win32.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -212,7 +212,7 @@ { WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 2, - WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, + WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, 0 }; diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_gl.cpp juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_gl.cpp --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_gl.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_gl.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_gles2.cpp juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_gles2.cpp --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_gles2.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_gles2.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_gles2.h juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_gles2.h --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_gles2.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_gles2.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_gl.h juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_gl.h --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_gl.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_gl.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLContext.cpp juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLContext.cpp --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLContext.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLContext.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -91,6 +91,44 @@ class OpenGLContext::CachedImage : public CachedComponentImage, private ThreadPoolJob { + struct AreaAndScale + { + Rectangle area; + double scale; + + auto tie() const { return std::tie (area, scale); } + + auto operator== (const AreaAndScale& other) const { return tie() == other.tie(); } + auto operator!= (const AreaAndScale& other) const { return tie() != other.tie(); } + }; + + class LockedAreaAndScale + { + public: + auto get() const + { + const ScopedLock lock (mutex); + return data; + } + + template + void set (const AreaAndScale& d, Fn&& ifDifferent) + { + const auto old = [&] + { + const ScopedLock lock (mutex); + return std::exchange (data, d); + }(); + + if (old != d) + ifDifferent(); + } + + private: + CriticalSection mutex; + AreaAndScale data { {}, 1.0 }; + }; + public: CachedImage (OpenGLContext& c, Component& comp, const OpenGLPixelFormat& pixFormat, void* contextToShare) @@ -205,8 +243,10 @@ } //============================================================================== - bool ensureFrameBufferSize() + bool ensureFrameBufferSize (Rectangle viewportArea) { + JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED + auto fbW = cachedImageFrameBuffer.getWidth(); auto fbH = cachedImageFrameBuffer.getHeight(); @@ -276,10 +316,13 @@ doWorkWhileWaitingForLock (true); + const auto currentAreaAndScale = areaAndScale.get(); + const auto viewportArea = currentAreaAndScale.area; + if (context.renderer != nullptr) { glViewport (0, 0, viewportArea.getWidth(), viewportArea.getHeight()); - context.currentRenderScale = scale; + context.currentRenderScale = currentAreaAndScale.scale; context.renderer->renderOpenGL(); clearGLError(); @@ -290,7 +333,7 @@ { if (isUpdating) { - paintComponent(); + paintComponent (currentAreaAndScale); if (! hasInitialised) return false; @@ -316,7 +359,7 @@ if (auto* peer = component.getPeer()) { #if JUCE_MAC - const auto displayScale = [this] + const auto displayScale = Desktop::getInstance().getGlobalScaleFactor() * [this] { if (auto* wrapper = cvDisplayLinkWrapper.get()) if (wrapper->updateActiveDisplay()) @@ -331,7 +374,7 @@ return [window backingScaleFactor]; } - return scale; + return areaAndScale.get().scale; }(); #else const auto displayScale = Desktop::getInstance().getDisplays().getDisplayForRect (component.getTopLevelComponent()->getScreenBounds())->scale; @@ -350,10 +393,9 @@ auto newScale = displayScale; #endif - if (scale != newScale || viewportArea != newArea) + areaAndScale.set ({ newArea, newScale }, [&] { - scale = newScale; - viewportArea = newArea; + // Transform is only accessed when the message manager is locked transform = AffineTransform::scale ((float) newArea.getWidth() / (float) localBounds.getWidth(), (float) newArea.getHeight() / (float) localBounds.getHeight()); @@ -361,13 +403,13 @@ if (canTriggerUpdate) invalidateAll(); - } + }); } } void bindVertexArray() noexcept { - if (openGLVersion.major >= 3) + if (shouldUseCustomVAO()) if (vertexArrayObject != 0) context.extensions.glBindVertexArray (vertexArrayObject); } @@ -383,17 +425,19 @@ } } - void paintComponent() + void paintComponent (const AreaAndScale& currentAreaAndScale) { + JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED + // you mustn't set your own cached image object when attaching a GL context! jassert (get (component) == this); - if (! ensureFrameBufferSize()) + if (! ensureFrameBufferSize (currentAreaAndScale.area)) return; - RectangleList invalid (viewportArea); + RectangleList invalid (currentAreaAndScale.area); invalid.subtract (validArea); - validArea = viewportArea; + validArea = currentAreaAndScale.area; if (! invalid.isEmpty()) { @@ -572,15 +616,14 @@ gl::loadFunctions(); - openGLVersion = getOpenGLVersion(); - - if (openGLVersion.major >= 3) + if (shouldUseCustomVAO()) { context.extensions.glGenVertexArrays (1, &vertexArrayObject); bindVertexArray(); } - glViewport (0, 0, viewportArea.getWidth(), viewportArea.getHeight()); + const auto currentViewportArea = areaAndScale.get().area; + glViewport (0, 0, currentViewportArea.getWidth(), currentViewportArea.getHeight()); nativeContext->setSwapInterval (1); @@ -617,6 +660,31 @@ nativeContext->shutdownOnRenderThread(); } + /* Returns true if the context requires a non-zero vertex array object (VAO) to be bound. + + If the context is a compatibility context, we can just pretend that VAOs don't exist, + and use the default VAO all the time instead. This provides a more consistent experience + in user code, which might make calls (like glVertexPointer()) that only work when VAO 0 is + bound in OpenGL 3.2+. + */ + bool shouldUseCustomVAO() const + { + #if JUCE_OPENGL_ES + return false; + #else + clearGLError(); + GLint mask = 0; + glGetIntegerv (GL_CONTEXT_PROFILE_MASK, &mask); + + // The context isn't aware of the profile mask, so it pre-dates the core profile + if (glGetError() == GL_INVALID_ENUM) + return false; + + // Also assumes a compatibility profile if the mask is completely empty for some reason + return (mask & (GLint) GL_CONTEXT_CORE_PROFILE_BIT) != 0; + #endif + } + //============================================================================== struct BlockingWorker : public OpenGLContext::AsyncWorker { @@ -707,13 +775,12 @@ OpenGLContext& context; Component& component; - Version openGLVersion; OpenGLFrameBuffer cachedImageFrameBuffer; RectangleList validArea; - Rectangle viewportArea, lastScreenBounds; - double scale = 1.0; + Rectangle lastScreenBounds; AffineTransform transform; GLuint vertexArrayObject = 0; + LockedAreaAndScale areaAndScale; StringArray associatedObjectNames; ReferenceCountedArray associatedObjects; diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLContext.h juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLContext.h --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLContext.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLContext.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -133,6 +133,23 @@ jassert (extensionName != nullptr); // you must supply a genuine string for this. jassert (isContextActive()); // An OpenGL context will need to be active before calling this. + if (getOpenGLVersion().major >= 3) + { + using GetStringi = const GLubyte* (*) (GLenum, GLuint); + + if (auto* thisGlGetStringi = reinterpret_cast (getExtensionFunction ("glGetStringi"))) + { + GLint n = 0; + glGetIntegerv (GL_NUM_EXTENSIONS, &n); + + for (auto i = (decltype (n)) 0; i < n; ++i) + if (StringRef (extensionName) == StringRef ((const char*) thisGlGetStringi (GL_EXTENSIONS, (GLuint) i))) + return true; + + return false; + } + } + const char* extensions = (const char*) glGetString (GL_EXTENSIONS); jassert (extensions != nullptr); // Perhaps you didn't activate an OpenGL context before calling this? diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLHelpers.h juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLHelpers.h --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLHelpers.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLHelpers.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLImage.cpp juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLImage.cpp --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLImage.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLImage.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -168,6 +168,9 @@ bitmapData.dataReleaser.reset (r); bitmapData.data = (uint8*) r->data.get(); + bitmapData.size = (size_t) bitmapData.width + * (size_t) bitmapData.height + * sizeof (PixelARGB); bitmapData.lineStride = (bitmapData.width * bitmapData.pixelStride + 3) & ~3; ReaderType::read (frameBuffer, bitmapData, x, y); diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLImage.h juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLImage.h --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLImage.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLImage.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLRenderer.h juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLRenderer.h --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLRenderer.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLRenderer.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLTexture.h juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLTexture.h --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_OpenGLTexture.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_OpenGLTexture.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_wgl.h juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_wgl.h --- juce-6.1.5~ds0/modules/juce_opengl/opengl/juce_wgl.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/opengl/juce_wgl.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp juce-7.0.0~ds0/modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp --- juce-6.1.5~ds0/modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_opengl/utils/juce_OpenGLAppComponent.h juce-7.0.0~ds0/modules/juce_opengl/utils/juce_OpenGLAppComponent.h --- juce-6.1.5~ds0/modules/juce_opengl/utils/juce_OpenGLAppComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_opengl/utils/juce_OpenGLAppComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/juce_osc.cpp juce-7.0.0~ds0/modules/juce_osc/juce_osc.cpp --- juce-6.1.5~ds0/modules/juce_osc/juce_osc.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/juce_osc.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/juce_osc.h juce-7.0.0~ds0/modules/juce_osc/juce_osc.h --- juce-6.1.5~ds0/modules/juce_osc/juce_osc.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/juce_osc.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_osc vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE OSC classes description: Open Sound Control implementation. website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCAddress.cpp juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCAddress.cpp --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCAddress.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCAddress.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCAddress.h juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCAddress.h --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCAddress.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCAddress.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCArgument.cpp juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCArgument.cpp --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCArgument.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCArgument.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCArgument.h juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCArgument.h --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCArgument.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCArgument.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCBundle.cpp juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCBundle.cpp --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCBundle.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCBundle.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCBundle.h juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCBundle.h --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCBundle.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCBundle.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCMessage.cpp juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCMessage.cpp --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCMessage.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCMessage.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCMessage.h juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCMessage.h --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCMessage.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCMessage.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCReceiver.cpp juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCReceiver.cpp --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCReceiver.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCReceiver.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCReceiver.h juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCReceiver.h --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCReceiver.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCReceiver.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCSender.cpp juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCSender.cpp --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCSender.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCSender.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCSender.h juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCSender.h --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCSender.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCSender.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCTimeTag.cpp juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCTimeTag.cpp --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCTimeTag.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCTimeTag.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCTimeTag.h juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCTimeTag.h --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCTimeTag.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCTimeTag.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCTypes.cpp juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCTypes.cpp --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCTypes.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCTypes.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCTypes.h juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCTypes.h --- juce-6.1.5~ds0/modules/juce_osc/osc/juce_OSCTypes.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_osc/osc/juce_OSCTypes.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp juce-7.0.0~ds0/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp --- juce-6.1.5~ds0/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h juce-7.0.0~ds0/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h --- juce-6.1.5~ds0/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -71,8 +71,8 @@ /** A unique order identifier for the transaction (generated by the store). */ String orderId; - /** A unique identifier of in-app product that was purchased. */ - String productId; + /** Unique identifiers of the products that were purchased. */ + StringArray productIds; /** This will be bundle ID on iOS and package name on Android, of the application for which this in-app product was purchased. */ @@ -147,7 +147,7 @@ virtual void productPurchaseFinished (const PurchaseInfo&, bool /*success*/, const String& /*statusDescription*/) {} /** Called when a list of all purchases is restored. This can be used to figure out to - which products a user is entitled to. + which products a user is entitled. NOTE: It is possible to receive this callback for the same purchase multiple times. If that happens, only the newest set of downloads and the newest orderId will be valid, the old ones should be not used anymore! @@ -210,7 +210,7 @@ const String& upgradeOrDowngradeFromSubscriptionWithProductIdentifier = {}, bool creditForUnusedSubscription = true); - /** Asynchronously asks about a list of products that a user has already bought. Upon completion, Listener::purchasesListReceived() + /** Asynchronously asks about a list of products that a user has already bought. Upon completion, Listener::purchasesListRestored() callback will be invoked. The user may be prompted to login first. @param includeDownloadInfo (iOS only) if true, then after restoration is successful, the downloads array passed to @@ -258,8 +258,8 @@ //============================================================================== #ifndef DOXYGEN [[deprecated ("On Android, it is no longer necessary to specify whether the product being purchased is a subscription " - "and only a single subscription can be upgraded/downgraded. Use the updated purchaseProduct method " - "which takes a single String argument.")]] + "and only a single subscription can be upgraded/downgraded. Use the updated purchaseProduct method " + "which takes a single String argument.")]] void purchaseProduct (const String& productIdentifier, bool isSubscription, const StringArray& upgradeOrDowngradeFromSubscriptionsWithProductIdentifiers = {}, diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/juce_product_unlocking.cpp juce-7.0.0~ds0/modules/juce_product_unlocking/juce_product_unlocking.cpp --- juce-6.1.5~ds0/modules/juce_product_unlocking/juce_product_unlocking.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/juce_product_unlocking.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/juce_product_unlocking.h juce-7.0.0~ds0/modules/juce_product_unlocking/juce_product_unlocking.h --- juce-6.1.5~ds0/modules/juce_product_unlocking/juce_product_unlocking.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/juce_product_unlocking.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_product_unlocking vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE Online marketplace support description: Classes for online product authentication website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/juce_product_unlocking.mm juce-7.0.0~ds0/modules/juce_product_unlocking/juce_product_unlocking.mm --- juce-6.1.5~ds0/modules/juce_product_unlocking/juce_product_unlocking.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/juce_product_unlocking.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h --- juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp --- juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.h juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.h --- juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp --- juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h --- juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp --- juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.h juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.h --- juce-6.1.5~ds0/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/native/javaopt/app/com/rmsl/juce/JuceBillingClient.java juce-7.0.0~ds0/modules/juce_product_unlocking/native/javaopt/app/com/rmsl/juce/JuceBillingClient.java --- juce-6.1.5~ds0/modules/juce_product_unlocking/native/javaopt/app/com/rmsl/juce/JuceBillingClient.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/native/javaopt/app/com/rmsl/juce/JuceBillingClient.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,8 +27,9 @@ import com.android.billingclient.api.*; -public class JuceBillingClient implements PurchasesUpdatedListener, BillingClientStateListener { - private native void skuDetailsQueryCallback(long host, java.util.List skuDetails); +public class JuceBillingClient implements PurchasesUpdatedListener, + BillingClientStateListener { + private native void productDetailsQueryCallback(long host, java.util.List productDetails); private native void purchasesListQueryCallback(long host, java.util.List purchases); private native void purchaseCompletedCallback(long host, Purchase purchase, int responseCode); private native void purchaseConsumedCallback(long host, String productIdentifier, int responseCode); @@ -57,36 +58,39 @@ == BillingClient.BillingResponseCode.OK; } - public void querySkuDetails(final String[] skusToQuery) { - executeOnBillingClientConnection(new Runnable() { - @Override - public void run() { - final java.util.List skuList = java.util.Arrays.asList(skusToQuery); + public QueryProductDetailsParams getProductListParams(final String[] productsToQuery, String type) { + java.util.ArrayList productList = new java.util.ArrayList<>(); - SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder() - .setSkusList(skuList) - .setType(BillingClient.SkuType.INAPP); + for (String product : productsToQuery) + productList.add(QueryProductDetailsParams.Product.newBuilder().setProductId(product).setProductType(type).build()); - billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() { - @Override - public void onSkuDetailsResponse(BillingResult billingResult, final java.util.List inAppSkuDetails) { - if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { - SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder() - .setSkusList(skuList) - .setType(BillingClient.SkuType.SUBS); - - billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() { - @Override - public void onSkuDetailsResponse(BillingResult billingResult, java.util.List subsSkuDetails) { - if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { - subsSkuDetails.addAll(inAppSkuDetails); - skuDetailsQueryCallback(host, subsSkuDetails); - } - } - }); - } + return QueryProductDetailsParams.newBuilder().setProductList(productList).build(); + } + + public void queryProductDetailsImpl(final String[] productsToQuery, java.util.List productTypes, java.util.List details) { + if (productTypes == null || productTypes.isEmpty()) { + productDetailsQueryCallback(host, details); + } else { + billingClient.queryProductDetailsAsync(getProductListParams(productsToQuery, productTypes.get(0)), new ProductDetailsResponseListener() { + @Override + public void onProductDetailsResponse(BillingResult billingResult, java.util.List newDetails) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + details.addAll(newDetails); + queryProductDetailsImpl(productsToQuery, productTypes.subList(1, productTypes.size()), details); + } else { + queryProductDetailsImpl(productsToQuery, null, details); } - }); + } + }); + } + } + + public void queryProductDetails(final String[] productsToQuery) { + executeOnBillingClientConnection(new Runnable() { + @Override + public void run() { + String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS}; + queryProductDetailsImpl(productsToQuery, java.util.Arrays.asList(toCheck), new java.util.ArrayList()); } }); } @@ -100,23 +104,30 @@ }); } + private void queryPurchasesImpl(java.util.List toCheck, java.util.ArrayList purchases) { + if (toCheck == null || toCheck.isEmpty()) { + purchasesListQueryCallback(host, purchases); + } else { + billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder().setProductType(toCheck.get(0)).build(), new PurchasesResponseListener() { + @Override + public void onQueryPurchasesResponse(BillingResult billingResult, java.util.List list) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + purchases.addAll(list); + queryPurchasesImpl(toCheck.subList(1, toCheck.size()), purchases); + } else { + queryPurchasesImpl(null, purchases); + } + } + }); + } + } + public void queryPurchases() { executeOnBillingClientConnection(new Runnable() { @Override public void run() { - Purchase.PurchasesResult inAppPurchases = billingClient.queryPurchases(BillingClient.SkuType.INAPP); - Purchase.PurchasesResult subsPurchases = billingClient.queryPurchases(BillingClient.SkuType.SUBS); - - if (inAppPurchases.getResponseCode() == BillingClient.BillingResponseCode.OK - && subsPurchases.getResponseCode() == BillingClient.BillingResponseCode.OK) { - java.util.List purchaseList = inAppPurchases.getPurchasesList(); - purchaseList.addAll(subsPurchases.getPurchasesList()); - - purchasesListQueryCallback(host, purchaseList); - return; - } - - purchasesListQueryCallback(host, null); + String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS}; + queryPurchasesImpl(java.util.Arrays.asList(toCheck), new java.util.ArrayList()); } }); } @@ -211,5 +222,5 @@ } private long host = 0; - private BillingClient billingClient; + private final BillingClient billingClient; } diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp juce-7.0.0~ds0/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp --- juce-6.1.5~ds0/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,13 +27,46 @@ { #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (getSku, "getSku", "()Ljava/lang/String;") \ - METHOD (getTitle, "getTitle", "()Ljava/lang/String;") \ - METHOD (getDescription, "getDescription", "()Ljava/lang/String;") \ - METHOD (getPrice, "getPrice", "()Ljava/lang/String;") \ - METHOD (getPriceCurrencyCode, "getPriceCurrencyCode", "()Ljava/lang/String;") + METHOD (getProductId, "getProductId", "()Ljava/lang/String;") \ + METHOD (getTitle, "getTitle", "()Ljava/lang/String;") \ + METHOD (getDescription, "getDescription", "()Ljava/lang/String;") \ + METHOD (getOneTimePurchaseOfferDetails, "getOneTimePurchaseOfferDetails", "()Lcom/android/billingclient/api/ProductDetails$OneTimePurchaseOfferDetails;") \ + METHOD (getSubscriptionOfferDetails, "getSubscriptionOfferDetails", "()Ljava/util/List;") -DECLARE_JNI_CLASS (SkuDetails, "com/android/billingclient/api/SkuDetails") +DECLARE_JNI_CLASS (ProductDetails, "com/android/billingclient/api/ProductDetails") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getFormattedPrice, "getFormattedPrice", "()Ljava/lang/String;") \ + METHOD (getPriceCurrencyCode, "getPriceCurrencyCode", "()Ljava/lang/String;") + +DECLARE_JNI_CLASS (OneTimePurchaseOfferDetails, "com/android/billingclient/api/ProductDetails$OneTimePurchaseOfferDetails") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getFormattedPrice, "getFormattedPrice", "()Ljava/lang/String;") \ + METHOD (getPriceCurrencyCode, "getPriceCurrencyCode", "()Ljava/lang/String;") + +DECLARE_JNI_CLASS (PricingPhase, "com/android/billingclient/api/ProductDetails$PricingPhase") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getOfferToken, "getOfferToken", "()Ljava/lang/String;") \ + METHOD (getPricingPhases, "getPricingPhases", "()Lcom/android/billingclient/api/ProductDetails$PricingPhases;") + +DECLARE_JNI_CLASS (SubscriptionOfferDetails, "com/android/billingclient/api/ProductDetails$SubscriptionOfferDetails") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getPricingPhaseList, "getPricingPhaseList", "()Ljava/util/List;") + +DECLARE_JNI_CLASS (PricingPhases, "com/android/billingclient/api/ProductDetails$PricingPhases") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (newBuilder, "newBuilder", "()Lcom/android/billingclient/api/BillingFlowParams$ProductDetailsParams$Builder;") + +DECLARE_JNI_CLASS (BillingFlowParamsProductDetailsParams, "com/android/billingclient/api/BillingFlowParams$ProductDetailsParams") #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ @@ -43,33 +76,81 @@ #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (build, "build", "()Lcom/android/billingclient/api/BillingFlowParams;") \ - METHOD (setOldSku, "setOldSku", "(Ljava/lang/String;Ljava/lang/String;)Lcom/android/billingclient/api/BillingFlowParams$Builder;") \ - METHOD (setReplaceSkusProrationMode, "setReplaceSkusProrationMode", "(I)Lcom/android/billingclient/api/BillingFlowParams$Builder;") \ - METHOD (setSkuDetails, "setSkuDetails", "(Lcom/android/billingclient/api/SkuDetails;)Lcom/android/billingclient/api/BillingFlowParams$Builder;") + STATICMETHOD (newBuilder, "newBuilder", "()Lcom/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams$Builder;") + +DECLARE_JNI_CLASS (BillingFlowParamsSubscriptionUpdateParams, "com/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (build, "build", "()Lcom/android/billingclient/api/BillingFlowParams;") \ + METHOD (setSubscriptionUpdateParams, "setSubscriptionUpdateParams", "(Lcom/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams;)Lcom/android/billingclient/api/BillingFlowParams$Builder;") \ + METHOD (setProductDetailsParamsList, "setProductDetailsParamsList", "(Ljava/util/List;)Lcom/android/billingclient/api/BillingFlowParams$Builder;") DECLARE_JNI_CLASS (BillingFlowParamsBuilder, "com/android/billingclient/api/BillingFlowParams$Builder") #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (build, "build", "()Lcom/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams;") \ + METHOD (setOldPurchaseToken, "setOldPurchaseToken", "(Ljava/lang/String;)Lcom/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams$Builder;") \ + METHOD (setReplaceProrationMode, "setReplaceProrationMode", "(I)Lcom/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams$Builder;") + +DECLARE_JNI_CLASS (BillingFlowParamsSubscriptionUpdateParamsBuilder, "com/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams$Builder") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (build, "build", "()Lcom/android/billingclient/api/BillingFlowParams$ProductDetailsParams;") \ + METHOD (setOfferToken, "setOfferToken", "(Ljava/lang/String;)Lcom/android/billingclient/api/BillingFlowParams$ProductDetailsParams$Builder;") \ + METHOD (setProductDetails, "setProductDetails", "(Lcom/android/billingclient/api/ProductDetails;)Lcom/android/billingclient/api/BillingFlowParams$ProductDetailsParams$Builder;") + +DECLARE_JNI_CLASS (BillingFlowParamsProductDetailsParamsBuilder, "com/android/billingclient/api/BillingFlowParams$ProductDetailsParams$Builder") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (getOrderId, "getOrderId", "()Ljava/lang/String;") \ - METHOD (getSku, "getSku", "()Ljava/lang/String;") \ + METHOD (getPurchaseState, "getPurchaseState", "()I") \ + METHOD (getProducts, "getProducts", "()Ljava/util/List;") \ METHOD (getPackageName, "getPackageName", "()Ljava/lang/String;") \ - METHOD (getPurchaseTime, "getPurchaseTime", "()J") \ + METHOD (getPurchaseTime, "getPurchaseTime", "()J") \ METHOD (getPurchaseToken, "getPurchaseToken", "()Ljava/lang/String;") DECLARE_JNI_CLASS (AndroidPurchase, "com/android/billingclient/api/Purchase") #undef JNI_CLASS_MEMBERS +template +static void callOnMainThread (Fn&& fn) +{ + if (MessageManager::getInstance()->isThisTheMessageThread()) + fn(); + else + MessageManager::callAsync (std::forward (fn)); +} + +inline StringArray javaListOfStringToJuceStringArray (const LocalRef& javaArray) +{ + if (javaArray.get() == nullptr) + return {}; + + auto* env = getEnv(); + + StringArray result; + + const auto size = env->CallIntMethod (javaArray, JavaList.size); + + for (int i = 0; i < size; ++i) + result.add (juceString (LocalRef { (jstring) env->CallObjectMethod (javaArray, JavaList.get, i) }.get())); + + return result; +} + //============================================================================== struct InAppPurchases::Pimpl { Pimpl (InAppPurchases& parent) : owner (parent), - billingClient (LocalRef (getEnv()->NewObject (JuceBillingClient, - JuceBillingClient.constructor, - getAppContext().get(), - (jlong) this))) + billingClient (LocalRef { getEnv()->NewObject (JuceBillingClient, + JuceBillingClient.constructor, + getAppContext().get(), + (jlong) this) }) { } @@ -86,46 +167,52 @@ void getProductsInformation (const StringArray& productIdentifiers) { - skuDetailsQueryCallbackQueue.emplace ([this] (LocalRef skuDetailsList) + productDetailsQueryCallbackQueue.emplace ([this] (LocalRef productDetailsList) { - if (skuDetailsList != nullptr) + if (productDetailsList != nullptr) { auto* env = getEnv(); Array products; - for (int i = 0; i < env->CallIntMethod (skuDetailsList, JavaList.size); ++i) - products.add (buildProduct (LocalRef (env->CallObjectMethod (skuDetailsList, JavaList.get, i)))); + for (int i = 0; i < env->CallIntMethod (productDetailsList, JavaList.size); ++i) + products.add (buildProduct (LocalRef { env->CallObjectMethod (productDetailsList, JavaList.get, i) })); - owner.listeners.call ([&] (Listener& l) { l.productsInfoReturned (products); }); + callMemberOnMainThread ([this, products] + { + owner.listeners.call ([&] (Listener& l) { l.productsInfoReturned (products); }); + }); } }); - querySkuDetailsAsync (convertToLowerCase (productIdentifiers)); + queryProductDetailsAsync (convertToLowerCase (productIdentifiers)); } void purchaseProduct (const String& productIdentifier, const String& subscriptionIdentifier, bool creditForUnusedSubscription) { - skuDetailsQueryCallbackQueue.emplace ([=] (LocalRef skuDetailsList) + productDetailsQueryCallbackQueue.emplace ([=] (LocalRef productDetailsList) { - if (skuDetailsList != nullptr) + if (productDetailsList != nullptr) { auto* env = getEnv(); - if (env->CallIntMethod (skuDetailsList, JavaList.size) > 0) + if (env->CallIntMethod (productDetailsList, JavaList.size) > 0) { - LocalRef skuDetails (env->CallObjectMethod (skuDetailsList, JavaList.get, 0)); + GlobalRef productDetails (LocalRef { env->CallObjectMethod (productDetailsList, JavaList.get, 0) }); - if (subscriptionIdentifier.isNotEmpty()) - changeExistingSubscription (skuDetails, subscriptionIdentifier, creditForUnusedSubscription); - else - purchaseProductWithSkuDetails (skuDetails); + callMemberOnMainThread ([this, productDetails, subscriptionIdentifier, creditForUnusedSubscription] + { + if (subscriptionIdentifier.isNotEmpty()) + changeExistingSubscription (productDetails, subscriptionIdentifier, creditForUnusedSubscription); + else + purchaseProductWithProductDetails (productDetails); + }); } } }); - querySkuDetailsAsync (convertToLowerCase ({ productIdentifier })); + queryProductDetailsAsync (convertToLowerCase ({ productIdentifier })); } void restoreProductsBoughtList (bool, const juce::String&) @@ -139,15 +226,21 @@ for (int i = 0; i < env->CallIntMethod (purchasesList, JavaArrayList.size); ++i) { - LocalRef purchase (env->CallObjectMethod (purchasesList, JavaArrayList.get, i)); + const LocalRef purchase { env->CallObjectMethod (purchasesList, JavaArrayList.get, i) }; purchases.add ({ buildPurchase (purchase), {} }); } - owner.listeners.call ([&] (Listener& l) { l.purchasesListRestored (purchases, true, NEEDS_TRANS ("Success")); }); + callMemberOnMainThread ([this, purchases] + { + owner.listeners.call ([&] (Listener& l) { l.purchasesListRestored (purchases, true, NEEDS_TRANS ("Success")); }); + }); } else { - owner.listeners.call ([&] (Listener& l) { l.purchasesListRestored ({}, false, NEEDS_TRANS ("Failure")); }); + callMemberOnMainThread ([this] + { + owner.listeners.call ([&] (Listener& l) { l.purchasesListRestored ({}, false, NEEDS_TRANS ("Failure")); }); + }); } }); @@ -158,17 +251,17 @@ { if (purchaseToken.isEmpty()) { - skuDetailsQueryCallbackQueue.emplace ([=] (LocalRef skuDetailsList) + productDetailsQueryCallbackQueue.emplace ([=] (LocalRef productDetailsList) { - if (skuDetailsList != nullptr) + if (productDetailsList != nullptr) { auto* env = getEnv(); - if (env->CallIntMethod (skuDetailsList, JavaList.size) > 0) + if (env->CallIntMethod (productDetailsList, JavaList.size) > 0) { - LocalRef sku (env->CallObjectMethod (skuDetailsList, JavaList.get, 0)); + const LocalRef product { env->CallObjectMethod (productDetailsList, JavaList.get, 0) }; - auto token = juceString (LocalRef ((jstring) env->CallObjectMethod (sku, AndroidPurchase.getSku))); + auto token = juceString (LocalRef { (jstring) env->CallObjectMethod (product, ProductDetails.getProductId) }); if (token.isNotEmpty()) { @@ -178,10 +271,13 @@ } } - notifyListenersAboutConsume (productIdentifier, false, NEEDS_TRANS ("Item unavailable")); + callMemberOnMainThread ([this, productIdentifier] + { + notifyListenersAboutConsume (productIdentifier, false, NEEDS_TRANS ("Item unavailable")); + }); }); - querySkuDetailsAsync (convertToLowerCase ({ productIdentifier })); + queryProductDetailsAsync (convertToLowerCase ({ productIdentifier })); } consumePurchaseWithToken (productIdentifier, purchaseToken); @@ -218,27 +314,27 @@ private: #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (constructor, "", "(Landroid/content/Context;J)V") \ - METHOD (endConnection, "endConnection", "()V") \ - METHOD (isReady, "isReady", "()Z") \ - METHOD (isBillingSupported, "isBillingSupported", "()Z") \ - METHOD (querySkuDetails, "querySkuDetails", "([Ljava/lang/String;)V") \ - METHOD (launchBillingFlow, "launchBillingFlow", "(Landroid/app/Activity;Lcom/android/billingclient/api/BillingFlowParams;)V") \ - METHOD (queryPurchases, "queryPurchases", "()V") \ - METHOD (consumePurchase, "consumePurchase", "(Ljava/lang/String;Ljava/lang/String;)V") \ - \ - CALLBACK (skuDetailsQueryCallback, "skuDetailsQueryCallback", "(JLjava/util/List;)V") \ - CALLBACK (purchasesListQueryCallback, "purchasesListQueryCallback", "(JLjava/util/List;)V") \ - CALLBACK (purchaseCompletedCallback, "purchaseCompletedCallback", "(JLcom/android/billingclient/api/Purchase;I)V") \ - CALLBACK (purchaseConsumedCallback, "purchaseConsumedCallback", "(JLjava/lang/String;I)V") + METHOD (constructor, "", "(Landroid/content/Context;J)V") \ + METHOD (endConnection, "endConnection", "()V") \ + METHOD (isReady, "isReady", "()Z") \ + METHOD (isBillingSupported, "isBillingSupported", "()Z") \ + METHOD (queryProductDetails, "queryProductDetails", "([Ljava/lang/String;)V") \ + METHOD (launchBillingFlow, "launchBillingFlow", "(Landroid/app/Activity;Lcom/android/billingclient/api/BillingFlowParams;)V") \ + METHOD (queryPurchases, "queryPurchases", "()V") \ + METHOD (consumePurchase, "consumePurchase", "(Ljava/lang/String;Ljava/lang/String;)V") \ + \ + CALLBACK (productDetailsQueryCallback, "productDetailsQueryCallback", "(JLjava/util/List;)V") \ + CALLBACK (purchasesListQueryCallback, "purchasesListQueryCallback", "(JLjava/util/List;)V") \ + CALLBACK (purchaseCompletedCallback, "purchaseCompletedCallback", "(JLcom/android/billingclient/api/Purchase;I)V") \ + CALLBACK (purchaseConsumedCallback, "purchaseConsumedCallback", "(JLjava/lang/String;I)V") DECLARE_JNI_CLASS (JuceBillingClient, "com/rmsl/juce/JuceBillingClient") #undef JNI_CLASS_MEMBERS - static void JNICALL skuDetailsQueryCallback (JNIEnv*, jobject, jlong host, jobject skuDetailsList) + static void JNICALL productDetailsQueryCallback (JNIEnv*, jobject, jlong host, jobject productDetailsList) { if (auto* myself = reinterpret_cast (host)) - myself->updateSkuDetails (skuDetailsList); + myself->updateProductDetails (productDetailsList); } static void JNICALL purchasesListQueryCallback (JNIEnv*, jobject, jlong host, jobject purchasesList) @@ -289,7 +385,7 @@ return lowerCase; } - void querySkuDetailsAsync (const StringArray& productIdentifiers) + void queryProductDetailsAsync (const StringArray& productIdentifiers) { Thread::launch ([=] { @@ -299,7 +395,7 @@ MessageManager::callAsync ([=] { getEnv()->CallVoidMethod (billingClient, - JuceBillingClient.querySkuDetails, + JuceBillingClient.queryProductDetails, juceStringArrayToJava (productIdentifiers).get()); }); }); @@ -331,23 +427,15 @@ owner.listeners.call ([&] (Listener& l) { l.productConsumed (productIdentifier, success, statusDescription); }); } - LocalRef createBillingFlowParamsBuilder (LocalRef skuDetails) - { - auto* env = getEnv(); - - auto builder = LocalRef (env->CallStaticObjectMethod (BillingFlowParams, BillingFlowParams.newBuilder)); - - return LocalRef (env->CallObjectMethod (builder.get(), - BillingFlowParamsBuilder.setSkuDetails, - skuDetails.get())); - } - void launchBillingFlowWithParameters (LocalRef params) { - LocalRef activity (getCurrentActivity()); + const auto activity = [] + { + if (auto current = getCurrentActivity()) + return current; - if (activity == nullptr) - activity = getMainActivity(); + return getMainActivity(); + }(); getEnv()->CallVoidMethod (billingClient, JuceBillingClient.launchBillingFlow, @@ -355,7 +443,7 @@ params.get()); } - void changeExistingSubscription (LocalRef skuDetails, const String& subscriptionIdentifier, bool creditForUnusedSubscription) + void changeExistingSubscription (GlobalRef productDetails, const String& subscriptionIdentifier, bool creditForUnusedSubscription) { if (! isReady()) { @@ -371,35 +459,47 @@ for (int i = 0; i < env->CallIntMethod (purchasesList, JavaArrayList.size); ++i) { - auto purchase = buildPurchase (LocalRef (env->CallObjectMethod (purchasesList.get(), JavaArrayList.get, i))); + auto purchase = buildPurchase (LocalRef { env->CallObjectMethod (purchasesList.get(), JavaArrayList.get, i) }); - if (purchase.productId == subscriptionIdentifier) + if (purchase.productIds.contains (subscriptionIdentifier)) { - auto builder = createBillingFlowParamsBuilder (skuDetails); - - builder = LocalRef (env->CallObjectMethod (builder.get(), - BillingFlowParamsBuilder.setOldSku, - javaString (subscriptionIdentifier).get(), - javaString (purchase.purchaseToken).get())); + const LocalRef subscriptionBuilder { getEnv()->CallStaticObjectMethod (BillingFlowParamsSubscriptionUpdateParams, + BillingFlowParamsSubscriptionUpdateParams.newBuilder) }; + env->CallObjectMethod (subscriptionBuilder.get(), + BillingFlowParamsSubscriptionUpdateParamsBuilder.setOldPurchaseToken, + javaString (purchase.purchaseToken).get()); if (! creditForUnusedSubscription) - builder = LocalRef (env->CallObjectMethod (builder.get(), - BillingFlowParamsBuilder.setReplaceSkusProrationMode, - 3 /*IMMEDIATE_WITHOUT_PRORATION*/)); + { + env->CallObjectMethod (subscriptionBuilder.get(), + BillingFlowParamsSubscriptionUpdateParamsBuilder.setReplaceProrationMode, + 3 /*IMMEDIATE_WITHOUT_PRORATION*/); + } - launchBillingFlowWithParameters (LocalRef (env->CallObjectMethod (builder.get(), - BillingFlowParamsBuilder.build))); + const LocalRef subscriptionParams { env->CallObjectMethod (subscriptionBuilder.get(), + BillingFlowParamsSubscriptionUpdateParamsBuilder.build) }; + + const LocalRef builder { env->CallStaticObjectMethod (BillingFlowParams, BillingFlowParams.newBuilder) }; + env->CallObjectMethod (builder.get(), + BillingFlowParamsBuilder.setSubscriptionUpdateParams, + subscriptionParams.get()); + const LocalRef params { env->CallObjectMethod (builder.get(), BillingFlowParamsBuilder.build) }; + + launchBillingFlowWithParameters (params); } } } - notifyListenersAboutPurchase ({}, false, NEEDS_TRANS ("Unable to get subscription details")); + callMemberOnMainThread ([this] + { + notifyListenersAboutPurchase ({}, false, NEEDS_TRANS ("Unable to get subscription details")); + }); }); getProductsBoughtAsync(); } - void purchaseProductWithSkuDetails (LocalRef skuDetails) + void purchaseProductWithProductDetails (GlobalRef productDetails) { if (! isReady()) { @@ -407,22 +507,48 @@ return; } - launchBillingFlowWithParameters (LocalRef (getEnv()->CallObjectMethod (createBillingFlowParamsBuilder (skuDetails).get(), - BillingFlowParamsBuilder.build))); + auto* env = getEnv(); + const LocalRef billingFlowParamsProductDetailsParamsBuilder { env->CallStaticObjectMethod (BillingFlowParamsProductDetailsParams, BillingFlowParamsProductDetailsParams.newBuilder) }; + env->CallObjectMethod (billingFlowParamsProductDetailsParamsBuilder, BillingFlowParamsProductDetailsParamsBuilder.setProductDetails, productDetails.get()); + + if (const LocalRef subscriptionDetailsList { env->CallObjectMethod (productDetails, ProductDetails.getSubscriptionOfferDetails) }) + { + if (env->CallIntMethod (subscriptionDetailsList, JavaList.size) > 0) + { + const LocalRef subscriptionDetails { env->CallObjectMethod (subscriptionDetailsList, JavaList.get, 0) }; + const LocalRef offerToken { env->CallObjectMethod (subscriptionDetails, SubscriptionOfferDetails.getOfferToken) }; + env->CallObjectMethod (billingFlowParamsProductDetailsParamsBuilder, BillingFlowParamsProductDetailsParamsBuilder.setOfferToken, offerToken.get()); + } + } + + const LocalRef billingFlowParamsProductDetailsParams { env->CallObjectMethod (billingFlowParamsProductDetailsParamsBuilder, BillingFlowParamsProductDetailsParamsBuilder.build) }; + + const LocalRef list { env->NewObject (JavaArrayList, JavaArrayList.constructor, 0) }; + env->CallBooleanMethod (list, JavaArrayList.add, billingFlowParamsProductDetailsParams.get()); + + const LocalRef billingFlowParamsBuilder { env->CallStaticObjectMethod (BillingFlowParams, BillingFlowParams.newBuilder) }; + env->CallObjectMethod (billingFlowParamsBuilder, BillingFlowParamsBuilder.setProductDetailsParamsList, list.get()); + const LocalRef params { env->CallObjectMethod (billingFlowParamsBuilder, BillingFlowParamsBuilder.build) }; + + launchBillingFlowWithParameters (params); } void consumePurchaseWithToken (const String& productIdentifier, const String& purchaseToken) { if (! isReady()) { - notifyListenersAboutConsume (productIdentifier, false, NEEDS_TRANS ("In-App purchases unavailable")); + callMemberOnMainThread ([this, productIdentifier] + { + notifyListenersAboutConsume (productIdentifier, false, NEEDS_TRANS ("In-App purchases unavailable")); + }); + return; } getEnv()->CallObjectMethod (billingClient, JuceBillingClient.consumePurchase, - LocalRef (javaString (productIdentifier)).get(), - LocalRef (javaString (purchaseToken)).get()); + LocalRef { javaString (productIdentifier) }.get(), + LocalRef { javaString (purchaseToken) }.get()); } //============================================================================== @@ -433,25 +559,59 @@ auto* env = getEnv(); - return { juceString (LocalRef ((jstring) env->CallObjectMethod (purchase, AndroidPurchase.getOrderId))), - juceString (LocalRef ((jstring) env->CallObjectMethod (purchase, AndroidPurchase.getSku))), - juceString (LocalRef ((jstring) env->CallObjectMethod (purchase, AndroidPurchase.getPackageName))), + if (env->CallIntMethod(purchase, AndroidPurchase.getPurchaseState) != 1 /* PURCHASED */) + return {}; + + return { juceString (LocalRef { (jstring) env->CallObjectMethod (purchase, AndroidPurchase.getOrderId) }), + javaListOfStringToJuceStringArray (LocalRef { env->CallObjectMethod (purchase, AndroidPurchase.getProducts) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (purchase, AndroidPurchase.getPackageName) }), Time (env->CallLongMethod (purchase, AndroidPurchase.getPurchaseTime)).toString (true, true, true, true), - juceString (LocalRef ((jstring) env->CallObjectMethod (purchase, AndroidPurchase.getPurchaseToken))) }; + juceString (LocalRef { (jstring) env->CallObjectMethod (purchase, AndroidPurchase.getPurchaseToken) }) }; } - static InAppPurchases::Product buildProduct (LocalRef productSkuDetails) + static InAppPurchases::Product buildProduct (LocalRef productDetails) { - if (productSkuDetails == nullptr) + if (productDetails == nullptr) return {}; auto* env = getEnv(); - return { juceString (LocalRef ((jstring) env->CallObjectMethod (productSkuDetails, SkuDetails.getSku))), - juceString (LocalRef ((jstring) env->CallObjectMethod (productSkuDetails, SkuDetails.getTitle))), - juceString (LocalRef ((jstring) env->CallObjectMethod (productSkuDetails, SkuDetails.getDescription))), - juceString (LocalRef ((jstring) env->CallObjectMethod (productSkuDetails, SkuDetails.getPrice))), - juceString (LocalRef ((jstring) env->CallObjectMethod (productSkuDetails, SkuDetails.getPriceCurrencyCode))) }; + if (LocalRef oneTimePurchase { env->CallObjectMethod (productDetails, ProductDetails.getOneTimePurchaseOfferDetails) }) + { + return { juceString (LocalRef { (jstring) env->CallObjectMethod (productDetails, ProductDetails.getProductId) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (productDetails, ProductDetails.getTitle) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (productDetails, ProductDetails.getDescription) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (oneTimePurchase, OneTimePurchaseOfferDetails.getFormattedPrice) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (oneTimePurchase, OneTimePurchaseOfferDetails.getPriceCurrencyCode) }) }; + } + + LocalRef subscription { env->CallObjectMethod (productDetails, ProductDetails.getSubscriptionOfferDetails) }; + + if (env->CallIntMethod (subscription, JavaList.size) == 0) + return {}; + + // We can only return a single subscription price for this subscription, + // but the subscription has more than one pricing scheme. + jassert (env->CallIntMethod (subscription, JavaList.size) == 1); + + const LocalRef offerDetails { env->CallObjectMethod (subscription, JavaList.get, 0) }; + const LocalRef pricingPhases { env->CallObjectMethod (offerDetails, SubscriptionOfferDetails.getPricingPhases) }; + const LocalRef phaseList { env->CallObjectMethod (pricingPhases, PricingPhases.getPricingPhaseList) }; + + if (env->CallIntMethod (phaseList, JavaList.size) == 0) + return {}; + + // We can only return a single subscription price for this subscription, + // but the pricing scheme for this subscription has more than one phase. + jassert (env->CallIntMethod (phaseList, JavaList.size) == 1); + + const LocalRef phase { env->CallObjectMethod (phaseList, JavaList.get, 0) }; + + return { juceString (LocalRef { (jstring) env->CallObjectMethod (productDetails, ProductDetails.getProductId) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (productDetails, ProductDetails.getTitle) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (productDetails, ProductDetails.getDescription) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (phase, PricingPhase.getFormattedPrice) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (phase, PricingPhase.getPriceCurrencyCode) }) }; } static String getStatusDescriptionFromResponseCode (int responseCode) @@ -478,29 +638,29 @@ void purchaseCompleted (jobject purchase, int responseCode) { - notifyListenersAboutPurchase (buildPurchase (LocalRef (purchase)), + notifyListenersAboutPurchase (buildPurchase (LocalRef { purchase }), wasSuccessful (responseCode), getStatusDescriptionFromResponseCode (responseCode)); } void purchaseConsumed (jstring productIdentifier, int responseCode) { - notifyListenersAboutConsume (juceString (LocalRef (productIdentifier)), + notifyListenersAboutConsume (juceString (LocalRef { productIdentifier }), wasSuccessful (responseCode), getStatusDescriptionFromResponseCode (responseCode)); } - void updateSkuDetails (jobject skuDetailsList) + void updateProductDetails (jobject productDetailsList) { - jassert (! skuDetailsQueryCallbackQueue.empty()); - skuDetailsQueryCallbackQueue.front() (LocalRef (skuDetailsList)); - skuDetailsQueryCallbackQueue.pop(); + jassert (! productDetailsQueryCallbackQueue.empty()); + productDetailsQueryCallbackQueue.front() (LocalRef { productDetailsList }); + productDetailsQueryCallbackQueue.pop(); } void updatePurchasesList (jobject purchasesList) { jassert (! purchasesListQueryCallbackQueue.empty()); - purchasesListQueryCallbackQueue.front() (LocalRef (purchasesList)); + purchasesListQueryCallbackQueue.front() (LocalRef { purchasesList }); purchasesListQueryCallbackQueue.pop(); } @@ -508,13 +668,32 @@ InAppPurchases& owner; GlobalRef billingClient; - std::queue)>> skuDetailsQueryCallbackQueue, + std::queue)>> productDetailsQueryCallbackQueue, purchasesListQueryCallbackQueue; //============================================================================== + void callMemberOnMainThread (std::function callback) + { + callOnMainThread ([ref = WeakReference (this), callback] + { + if (ref != nullptr) + callback(); + }); + } + + //============================================================================== + JUCE_DECLARE_WEAK_REFERENCEABLE(Pimpl) JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl) }; +void juce_handleOnResume() +{ + callOnMainThread ([] + { + InAppPurchases::getInstance()->restoreProductsBoughtList (false); + }); +} + InAppPurchases::Pimpl::JuceBillingClient_Class InAppPurchases::Pimpl::JuceBillingClient; diff -Nru juce-6.1.5~ds0/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp juce-7.0.0~ds0/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp --- juce-6.1.5~ds0/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/capture/juce_CameraDevice.cpp juce-7.0.0~ds0/modules/juce_video/capture/juce_CameraDevice.cpp --- juce-6.1.5~ds0/modules/juce_video/capture/juce_CameraDevice.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/capture/juce_CameraDevice.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -31,11 +31,7 @@ #elif JUCE_WINDOWS #include "../native/juce_win32_CameraDevice.h" #elif JUCE_IOS - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") - #include "../native/juce_ios_CameraDevice.h" - - JUCE_END_IGNORE_WARNINGS_GCC_LIKE #elif JUCE_ANDROID #include "../native/juce_android_CameraDevice.h" #endif diff -Nru juce-6.1.5~ds0/modules/juce_video/capture/juce_CameraDevice.h juce-7.0.0~ds0/modules/juce_video/capture/juce_CameraDevice.h --- juce-6.1.5~ds0/modules/juce_video/capture/juce_CameraDevice.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/capture/juce_CameraDevice.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/juce_video.cpp juce-7.0.0~ds0/modules/juce_video/juce_video.cpp --- juce-6.1.5~ds0/modules/juce_video/juce_video.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/juce_video.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/juce_video.h juce-7.0.0~ds0/modules/juce_video/juce_video.h --- juce-6.1.5~ds0/modules/juce_video/juce_video.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/juce_video.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_video vendor: juce - version: 6.1.5 + version: 7.0.0 name: JUCE video playback and capture classes description: Classes for playing video and capturing camera input. website: http://www.juce.com/juce diff -Nru juce-6.1.5~ds0/modules/juce_video/juce_video.mm juce-7.0.0~ds0/modules/juce_video/juce_video.mm --- juce-6.1.5~ds0/modules/juce_video/juce_video.mm 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/juce_video.mm 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionCaptureCallback.java juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionCaptureCallback.java --- juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionCaptureCallback.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionCaptureCallback.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionStateCallback.java juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionStateCallback.java --- juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionStateCallback.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionStateCallback.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/CameraDeviceStateCallback.java juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/CameraDeviceStateCallback.java --- juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/CameraDeviceStateCallback.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/CameraDeviceStateCallback.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/JuceOrientationEventListener.java juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/JuceOrientationEventListener.java --- juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/JuceOrientationEventListener.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/JuceOrientationEventListener.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/MediaControllerCallback.java juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/MediaControllerCallback.java --- juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/MediaControllerCallback.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/MediaControllerCallback.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/MediaSessionCallback.java juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/MediaSessionCallback.java --- juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/MediaSessionCallback.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/MediaSessionCallback.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/SystemVolumeObserver.java juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/SystemVolumeObserver.java --- juce-6.1.5~ds0/modules/juce_video/native/java/app/com/rmsl/juce/SystemVolumeObserver.java 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/java/app/com/rmsl/juce/SystemVolumeObserver.java 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/native/juce_android_CameraDevice.h juce-7.0.0~ds0/modules/juce_video/native/juce_android_CameraDevice.h --- juce-6.1.5~ds0/modules/juce_video/native/juce_android_CameraDevice.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/juce_android_CameraDevice.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/native/juce_android_Video.h juce-7.0.0~ds0/modules/juce_video/native/juce_android_Video.h --- juce-6.1.5~ds0/modules/juce_video/native/juce_android_Video.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/juce_android_Video.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/native/juce_ios_CameraDevice.h juce-7.0.0~ds0/modules/juce_video/native/juce_ios_CameraDevice.h --- juce-6.1.5~ds0/modules/juce_video/native/juce_ios_CameraDevice.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/juce_ios_CameraDevice.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -766,7 +766,7 @@ //============================================================================== #if JUCE_USE_NEW_CAMERA_API - class PhotoOutputDelegateClass : public ObjCClass + class API_AVAILABLE (ios (10.0)) PhotoOutputDelegateClass : public ObjCClass { public: PhotoOutputDelegateClass() : ObjCClass ("PhotoOutputDelegateClass_") @@ -820,6 +820,7 @@ JUCE_CAMERA_LOG ("didFinishCaptureForSettings(), error = " + errorString); } + API_AVAILABLE (ios (11.0)) static void didFinishProcessingPhoto (id self, SEL, AVCapturePhotoOutput*, AVCapturePhoto* capturePhoto, NSError* error) { getOwner (self).takingPicture = false; diff -Nru juce-6.1.5~ds0/modules/juce_video/native/juce_mac_CameraDevice.h juce-7.0.0~ds0/modules/juce_video/native/juce_mac_CameraDevice.h --- juce-6.1.5~ds0/modules/juce_video/native/juce_mac_CameraDevice.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/juce_mac_CameraDevice.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -226,7 +226,7 @@ { JUCE_CAMERA_LOG (nsStringToJuce ([notification description])); - NSError* error = notification.userInfo[AVCaptureSessionErrorKey]; + NSError* error = [notification.userInfo objectForKey: AVCaptureSessionErrorKey]; auto errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String(); getOwner (self).cameraSessionRuntimeError (errorString); } @@ -244,8 +244,7 @@ }; #if JUCE_USE_NEW_CAMERA_API - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") - class PostCatalinaPhotoOutput : public ImageOutputBase + class API_AVAILABLE (macos (10.15)) PostCatalinaPhotoOutput : public ImageOutputBase { public: PostCatalinaPhotoOutput() @@ -329,7 +328,6 @@ AVCapturePhotoOutput* imageOutput = nil; std::unique_ptr delegate; }; - JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") diff -Nru juce-6.1.5~ds0/modules/juce_video/native/juce_mac_Video.h juce-7.0.0~ds0/modules/juce_video/native/juce_mac_Video.h --- juce-6.1.5~ds0/modules/juce_video/native/juce_mac_Video.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/juce_mac_Video.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -195,8 +195,15 @@ public: ~PlayerControllerBase() { - detachPlayerStatusObserver(); - detachPlaybackObserver(); + // Derived classes must call detachPlayerStatusObserver() before destruction! + jassert (! playerStatusObserverAttached); + + // Derived classes must call detachPlaybackObserver() before destruction! + jassert (! playbackObserverAttached); + + // Note that it's unsafe to call detachPlayerStatusObserver and detachPlaybackObserver + // directly here, because those functions call into the derived class, which will have + // been destroyed at this point. } protected: @@ -226,8 +233,8 @@ if ([keyPath isEqualToString: nsStringLiteral ("rate")]) { - auto oldRate = [change[NSKeyValueChangeOldKey] floatValue]; - auto newRate = [change[NSKeyValueChangeNewKey] floatValue]; + auto oldRate = [[change objectForKey: NSKeyValueChangeOldKey] floatValue]; + auto newRate = [[change objectForKey: NSKeyValueChangeNewKey] floatValue]; if (oldRate == 0 && newRate != 0) owner.playbackStarted(); @@ -236,7 +243,7 @@ } else if ([keyPath isEqualToString: nsStringLiteral ("status")]) { - auto status = [change[NSKeyValueChangeNewKey] intValue]; + auto status = [[change objectForKey: NSKeyValueChangeNewKey] intValue]; if (status == AVPlayerStatusFailed) owner.errorOccurred(); @@ -329,8 +336,8 @@ auto* urlAsset = (AVURLAsset*) playerItem.asset; URL url (nsStringToJuce (urlAsset.URL.absoluteString)); - auto oldStatus = [change[NSKeyValueChangeOldKey] intValue]; - auto newStatus = [change[NSKeyValueChangeNewKey] intValue]; + auto oldStatus = [[change objectForKey: NSKeyValueChangeOldKey] intValue]; + auto newStatus = [[change objectForKey: NSKeyValueChangeNewKey] intValue]; // Ignore spurious notifications if (oldStatus == newStatus) @@ -481,6 +488,8 @@ forKeyPath: nsStringLiteral ("status") options: NSKeyValueObservingOptionNew context: this]; + + playerStatusObserverAttached = true; } void detachPlayerStatusObserver() @@ -495,6 +504,8 @@ forKeyPath: nsStringLiteral ("status") context: this]; } + + playerStatusObserverAttached = false; } void attachPlaybackObserver() @@ -505,6 +516,8 @@ name: AVPlayerItemDidPlayToEndTimeNotification object: [crtp().getPlayer() currentItem]]; JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + playbackObserverAttached = true; } void detachPlaybackObserver() @@ -512,6 +525,8 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") [[NSNotificationCenter defaultCenter] removeObserver: playerItemPlaybackStatusObserver.get()]; JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + playbackObserverAttached = false; } private: @@ -556,6 +571,8 @@ owner.playbackStopped(); } + bool playerStatusObserverAttached = false, playbackObserverAttached = false; + JUCE_DECLARE_WEAK_REFERENCEABLE (PlayerControllerBase) }; @@ -567,43 +584,19 @@ PlayerController (Pimpl& ownerToUse, bool useNativeControlsIfAvailable) : PlayerControllerBase (ownerToUse, useNativeControlsIfAvailable) { - #if JUCE_32BIT - // 32-bit builds don't have AVPlayerView, so need to use a layer - useNativeControls = false; - #endif - - if (useNativeControls) + wrappedPlayer = [&]() -> std::unique_ptr { - #if ! JUCE_32BIT - playerView = [[AVPlayerView alloc] init]; - #endif - } - else - { - view = [[NSView alloc] init]; - playerLayer = [[AVPlayerLayer alloc] init]; - [view setLayer: playerLayer]; - } - } + if (@available (macOS 10.9, *)) + if (useNativeControls) + return std::make_unique(); - ~PlayerController() - { - #if JUCE_32BIT - [view release]; - [playerLayer release]; - #else - [playerView release]; - #endif + return std::make_unique (); + }(); } NSView* getView() { - #if ! JUCE_32BIT - if (useNativeControls) - return playerView; - #endif - - return view; + return wrappedPlayer->getView(); } Result load (NSURL* url) @@ -629,12 +622,7 @@ detachPlayerStatusObserver(); detachPlaybackObserver(); - #if ! JUCE_32BIT - if (useNativeControls) - [playerView setPlayer: player]; - else - #endif - [playerLayer setPlayer: player]; + wrappedPlayer->setPlayer (player); if (player != nil) { @@ -645,21 +633,44 @@ AVPlayer* getPlayer() const { - #if ! JUCE_32BIT - if (useNativeControls) - return [playerView player]; - #endif - - return [playerLayer player]; + return wrappedPlayer->getPlayer(); } private: - NSView* view = nil; - AVPlayerLayer* playerLayer = nil; - #if ! JUCE_32BIT - // 32-bit builds don't have AVPlayerView - AVPlayerView* playerView = nil; - #endif + struct WrappedPlayer + { + virtual ~WrappedPlayer() = default; + virtual NSView* getView() const = 0; + virtual AVPlayer* getPlayer() const = 0; + virtual void setPlayer (AVPlayer*) = 0; + }; + + class WrappedPlayerLayer : public WrappedPlayer + { + public: + WrappedPlayerLayer () { [view.get() setLayer: playerLayer.get()]; } + NSView* getView() const override { return view.get(); } + AVPlayer* getPlayer() const override { return [playerLayer.get() player]; } + void setPlayer (AVPlayer* player) override { [playerLayer.get() setPlayer: player]; } + + private: + NSUniquePtr view { [[NSView alloc] init] }; + NSUniquePtr playerLayer { [[AVPlayerLayer alloc] init] }; + }; + + class API_AVAILABLE (macos (10.9)) WrappedPlayerView : public WrappedPlayer + { + public: + WrappedPlayerView() = default; + NSView* getView() const override { return playerView.get(); } + AVPlayer* getPlayer() const override { return [playerView.get() player]; } + void setPlayer (AVPlayer* player) override { [playerView.get() setPlayer: player]; } + + private: + NSUniquePtr playerView { [[AVPlayerView alloc] init] }; + }; + + std::unique_ptr wrappedPlayer; }; #else //============================================================================== @@ -716,13 +727,19 @@ void setPlayer (AVPlayer* playerToUse) { + detachPlayerStatusObserver(); + detachPlaybackObserver(); + if (useNativeControls) [playerViewController.get() setPlayer: playerToUse]; else [playerLayer.get() setPlayer: playerToUse]; - attachPlayerStatusObserver(); - attachPlaybackObserver(); + if (playerToUse != nil) + { + attachPlayerStatusObserver(); + attachPlaybackObserver(); + } } private: diff -Nru juce-6.1.5~ds0/modules/juce_video/native/juce_win32_CameraDevice.h juce-7.0.0~ds0/modules/juce_video/native/juce_win32_CameraDevice.h --- juce-6.1.5~ds0/modules/juce_video/native/juce_win32_CameraDevice.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/juce_win32_CameraDevice.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/native/juce_win32_ComTypes.h juce-7.0.0~ds0/modules/juce_video/native/juce_win32_ComTypes.h --- juce-6.1.5~ds0/modules/juce_video/native/juce_win32_ComTypes.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/juce_win32_ComTypes.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/native/juce_win32_Video.h juce-7.0.0~ds0/modules/juce_video/native/juce_win32_Video.h --- juce-6.1.5~ds0/modules/juce_video/native/juce_win32_Video.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/native/juce_win32_Video.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/playback/juce_VideoComponent.cpp juce-7.0.0~ds0/modules/juce_video/playback/juce_VideoComponent.cpp --- juce-6.1.5~ds0/modules/juce_video/playback/juce_VideoComponent.cpp 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/playback/juce_VideoComponent.cpp 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/modules/juce_video/playback/juce_VideoComponent.h juce-7.0.0~ds0/modules/juce_video/playback/juce_VideoComponent.h --- juce-6.1.5~ds0/modules/juce_video/playback/juce_VideoComponent.h 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/modules/juce_video/playback/juce_VideoComponent.h 2022-06-21 07:56:28.000000000 +0000 @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited 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 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff -Nru juce-6.1.5~ds0/README.md juce-7.0.0~ds0/README.md --- juce-6.1.5~ds0/README.md 2022-01-26 13:07:09.000000000 +0000 +++ juce-7.0.0~ds0/README.md 2022-06-21 07:56:28.000000000 +0000 @@ -1,7 +1,7 @@ ![alt text](https://assets.juce.com/juce/JUCE_banner_github.png "JUCE") JUCE is an open-source cross-platform C++ application framework for creating high quality -desktop and mobile applications, including VST, VST3, AU, AUv3, RTAS and AAX audio plug-ins. +desktop and mobile applications, including VST, VST3, AU, AUv3 and AAX audio plug-ins. JUCE can be easily integrated with existing projects via CMake, or can be used as a project generation tool via the [Projucer](https://juce.com/discover/projucer), which supports exporting projects for Xcode (macOS and iOS), Visual Studio, Android Studio, Code::Blocks @@ -56,7 +56,7 @@ #### Building JUCE Projects -- __macOS/iOS__: Xcode 9.2 (macOS 10.12.6) +- __macOS/iOS__: Xcode 10.1 (macOS 10.13.6) - __Windows__: Windows 8.1 and Visual Studio 2015 Update 3 64-bit - __Linux__: g++ 5.0 or Clang 3.4 (for a full list of dependencies, see [here](/docs/Linux%20Dependencies.md)).